|
@@ -670,7 +670,7 @@ func (portal *Portal) handleUndecryptableMessage(source *User, evt *events.Undec
|
|
portal.log.Errorfln("Failed to send decryption error of %s to Matrix: %v", evt.Info.ID, err)
|
|
portal.log.Errorfln("Failed to send decryption error of %s to Matrix: %v", evt.Info.ID, err)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- portal.finishHandling(nil, &evt.Info, resp.EventID, database.MsgUnknown, database.MsgErrDecryptionFailed)
|
|
|
|
|
|
+ portal.finishHandling(nil, &evt.Info, resp.EventID, intent.UserID, database.MsgUnknown, database.MsgErrDecryptionFailed)
|
|
}
|
|
}
|
|
|
|
|
|
func (portal *Portal) handleFakeMessage(msg fakeMessage) {
|
|
func (portal *Portal) handleFakeMessage(msg fakeMessage) {
|
|
@@ -703,7 +703,7 @@ func (portal *Portal) handleFakeMessage(msg fakeMessage) {
|
|
MessageSource: types.MessageSource{
|
|
MessageSource: types.MessageSource{
|
|
Sender: msg.Sender,
|
|
Sender: msg.Sender,
|
|
},
|
|
},
|
|
- }, resp.EventID, database.MsgFake, database.MsgNoError)
|
|
|
|
|
|
+ }, resp.EventID, intent.UserID, database.MsgFake, database.MsgNoError)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -818,7 +818,7 @@ func (portal *Portal) handleMessage(source *User, evt *events.Message) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if len(eventID) != 0 {
|
|
if len(eventID) != 0 {
|
|
- portal.finishHandling(existingMsg, &evt.Info, eventID, dbMsgType, converted.Error)
|
|
|
|
|
|
+ portal.finishHandling(existingMsg, &evt.Info, eventID, intent.UserID, dbMsgType, converted.Error)
|
|
}
|
|
}
|
|
} else if msgType == "reaction" || msgType == "encrypted reaction" {
|
|
} else if msgType == "reaction" || msgType == "encrypted reaction" {
|
|
if evt.Message.GetEncReactionMessage() != nil {
|
|
if evt.Message.GetEncReactionMessage() != nil {
|
|
@@ -863,7 +863,7 @@ func (portal *Portal) isRecentlyHandled(id types.MessageID, error database.Messa
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
|
|
|
|
-func (portal *Portal) markHandled(txn dbutil.Transaction, msg *database.Message, info *types.MessageInfo, mxid id.EventID, isSent, recent bool, msgType database.MessageType, errType database.MessageErrorType) *database.Message {
|
|
|
|
|
|
+func (portal *Portal) markHandled(txn dbutil.Transaction, msg *database.Message, info *types.MessageInfo, mxid id.EventID, senderMXID id.UserID, isSent, recent bool, msgType database.MessageType, errType database.MessageErrorType) *database.Message {
|
|
if msg == nil {
|
|
if msg == nil {
|
|
msg = portal.bridge.DB.Message.New()
|
|
msg = portal.bridge.DB.Message.New()
|
|
msg.Chat = portal.Key
|
|
msg.Chat = portal.Key
|
|
@@ -871,6 +871,7 @@ func (portal *Portal) markHandled(txn dbutil.Transaction, msg *database.Message,
|
|
msg.MXID = mxid
|
|
msg.MXID = mxid
|
|
msg.Timestamp = info.Timestamp
|
|
msg.Timestamp = info.Timestamp
|
|
msg.Sender = info.Sender
|
|
msg.Sender = info.Sender
|
|
|
|
+ msg.SenderMXID = senderMXID
|
|
msg.Sent = isSent
|
|
msg.Sent = isSent
|
|
msg.Type = msgType
|
|
msg.Type = msgType
|
|
msg.Error = errType
|
|
msg.Error = errType
|
|
@@ -922,8 +923,8 @@ func (portal *Portal) getMessageIntent(user *User, info *types.MessageInfo, msgT
|
|
return intent
|
|
return intent
|
|
}
|
|
}
|
|
|
|
|
|
-func (portal *Portal) finishHandling(existing *database.Message, message *types.MessageInfo, mxid id.EventID, msgType database.MessageType, errType database.MessageErrorType) {
|
|
|
|
- portal.markHandled(nil, existing, message, mxid, true, true, msgType, errType)
|
|
|
|
|
|
+func (portal *Portal) finishHandling(existing *database.Message, message *types.MessageInfo, mxid id.EventID, senderMXID id.UserID, msgType database.MessageType, errType database.MessageErrorType) {
|
|
|
|
+ portal.markHandled(nil, existing, message, mxid, senderMXID, true, true, msgType, errType)
|
|
portal.sendDeliveryReceipt(mxid)
|
|
portal.sendDeliveryReceipt(mxid)
|
|
var suffix string
|
|
var suffix string
|
|
if errType == database.MsgErrDecryptionFailed {
|
|
if errType == database.MsgErrDecryptionFailed {
|
|
@@ -1881,19 +1882,20 @@ func (portal *Portal) MainIntent() *appservice.IntentAPI {
|
|
return portal.bridge.Bot
|
|
return portal.bridge.Bot
|
|
}
|
|
}
|
|
|
|
|
|
-func (portal *Portal) addReplyMention(content *event.MessageEventContent, sender types.JID) {
|
|
|
|
- if content.Mentions == nil {
|
|
|
|
|
|
+func (portal *Portal) addReplyMention(content *event.MessageEventContent, sender types.JID, senderMXID id.UserID) {
|
|
|
|
+ if content.Mentions == nil || (sender.IsEmpty() && senderMXID == "") {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- var mxid id.UserID
|
|
|
|
- if user := portal.bridge.GetUserByJID(sender); user != nil {
|
|
|
|
- mxid = user.MXID
|
|
|
|
- } else {
|
|
|
|
- puppet := portal.bridge.GetPuppetByJID(sender)
|
|
|
|
- mxid = puppet.MXID
|
|
|
|
|
|
+ if senderMXID == "" {
|
|
|
|
+ if user := portal.bridge.GetUserByJID(sender); user != nil {
|
|
|
|
+ senderMXID = user.MXID
|
|
|
|
+ } else {
|
|
|
|
+ puppet := portal.bridge.GetPuppetByJID(sender)
|
|
|
|
+ senderMXID = puppet.MXID
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- if slices.Contains(content.Mentions.UserIDs, mxid) {
|
|
|
|
- content.Mentions.UserIDs = append(content.Mentions.UserIDs, mxid)
|
|
|
|
|
|
+ if senderMXID != "" && !slices.Contains(content.Mentions.UserIDs, senderMXID) {
|
|
|
|
+ content.Mentions.UserIDs = append(content.Mentions.UserIDs, senderMXID)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1925,13 +1927,12 @@ func (portal *Portal) SetReply(content *event.MessageEventContent, replyTo *Repl
|
|
if message == nil || message.IsFakeMXID() {
|
|
if message == nil || message.IsFakeMXID() {
|
|
if isBackfill && portal.bridge.Config.Homeserver.Software == bridgeconfig.SoftwareHungry {
|
|
if isBackfill && portal.bridge.Config.Homeserver.Software == bridgeconfig.SoftwareHungry {
|
|
content.RelatesTo = (&event.RelatesTo{}).SetReplyTo(targetPortal.deterministicEventID(replyTo.Sender, replyTo.MessageID, ""))
|
|
content.RelatesTo = (&event.RelatesTo{}).SetReplyTo(targetPortal.deterministicEventID(replyTo.Sender, replyTo.MessageID, ""))
|
|
- portal.addReplyMention(content, replyTo.Sender)
|
|
|
|
|
|
+ portal.addReplyMention(content, replyTo.Sender, "")
|
|
return true
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
return false
|
|
}
|
|
}
|
|
- // TODO store sender mxid in db message
|
|
|
|
- portal.addReplyMention(content, message.Sender)
|
|
|
|
|
|
+ portal.addReplyMention(content, message.Sender, message.SenderMXID)
|
|
content.RelatesTo = (&event.RelatesTo{}).SetReplyTo(message.MXID)
|
|
content.RelatesTo = (&event.RelatesTo{}).SetReplyTo(message.MXID)
|
|
if portal.bridge.Config.Bridge.DisableReplyFallbacks {
|
|
if portal.bridge.Config.Bridge.DisableReplyFallbacks {
|
|
return true
|
|
return true
|
|
@@ -1973,7 +1974,7 @@ func (portal *Portal) HandleMessageReaction(intent *appservice.IntentAPI, user *
|
|
if err != nil {
|
|
if err != nil {
|
|
portal.log.Errorfln("Failed to redact reaction %s/%s from %s to %s: %v", existing.MXID, existing.JID, info.Sender, targetJID, err)
|
|
portal.log.Errorfln("Failed to redact reaction %s/%s from %s to %s: %v", existing.MXID, existing.JID, info.Sender, targetJID, err)
|
|
}
|
|
}
|
|
- portal.finishHandling(existingMsg, info, resp.EventID, database.MsgReaction, database.MsgNoError)
|
|
|
|
|
|
+ portal.finishHandling(existingMsg, info, resp.EventID, intent.UserID, database.MsgReaction, database.MsgNoError)
|
|
existing.Delete()
|
|
existing.Delete()
|
|
} else {
|
|
} else {
|
|
target := portal.bridge.DB.Message.GetByJID(portal.Key, targetJID)
|
|
target := portal.bridge.DB.Message.GetByJID(portal.Key, targetJID)
|
|
@@ -1994,7 +1995,7 @@ func (portal *Portal) HandleMessageReaction(intent *appservice.IntentAPI, user *
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
- portal.finishHandling(existingMsg, info, resp.EventID, database.MsgReaction, database.MsgNoError)
|
|
|
|
|
|
+ portal.finishHandling(existingMsg, info, resp.EventID, intent.UserID, database.MsgReaction, database.MsgNoError)
|
|
portal.upsertReaction(nil, intent, target.JID, info.Sender, resp.EventID, info.ID)
|
|
portal.upsertReaction(nil, intent, target.JID, info.Sender, resp.EventID, info.ID)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -4134,7 +4135,7 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event, timing
|
|
}
|
|
}
|
|
info := portal.generateMessageInfo(sender)
|
|
info := portal.generateMessageInfo(sender)
|
|
if dbMsg == nil {
|
|
if dbMsg == nil {
|
|
- dbMsg = portal.markHandled(nil, nil, info, evt.ID, false, true, dbMsgType, database.MsgNoError)
|
|
|
|
|
|
+ dbMsg = portal.markHandled(nil, nil, info, evt.ID, evt.Sender, false, true, dbMsgType, database.MsgNoError)
|
|
} else {
|
|
} else {
|
|
info.ID = dbMsg.JID
|
|
info.ID = dbMsg.JID
|
|
}
|
|
}
|
|
@@ -4189,7 +4190,7 @@ func (portal *Portal) handleMatrixReaction(sender *User, evt *event.Event) error
|
|
return fmt.Errorf("unknown target event %s", content.RelatesTo.EventID)
|
|
return fmt.Errorf("unknown target event %s", content.RelatesTo.EventID)
|
|
}
|
|
}
|
|
info := portal.generateMessageInfo(sender)
|
|
info := portal.generateMessageInfo(sender)
|
|
- dbMsg := portal.markHandled(nil, nil, info, evt.ID, false, true, database.MsgReaction, database.MsgNoError)
|
|
|
|
|
|
+ dbMsg := portal.markHandled(nil, nil, info, evt.ID, evt.Sender, false, true, database.MsgReaction, database.MsgNoError)
|
|
portal.upsertReaction(nil, nil, target.JID, sender.JID, evt.ID, info.ID)
|
|
portal.upsertReaction(nil, nil, target.JID, sender.JID, evt.ID, info.ID)
|
|
portal.log.Debugln("Sending reaction", evt.ID, "to WhatsApp", info.ID)
|
|
portal.log.Debugln("Sending reaction", evt.ID, "to WhatsApp", info.ID)
|
|
resp, err := portal.sendReactionToWhatsApp(sender, info.ID, target, content.RelatesTo.Key, evt.Timestamp)
|
|
resp, err := portal.sendReactionToWhatsApp(sender, info.ID, target, content.RelatesTo.Key, evt.Timestamp)
|