소스 검색

Handle redactions from webhook users

Tulir Asokan 2 년 전
부모
커밋
f7c8e03041
1개의 변경된 파일26개의 추가작업 그리고 10개의 파일을 삭제
  1. 26 10
      portal.go

+ 26 - 10
portal.go

@@ -1100,6 +1100,10 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) {
 
 
 	channelID := portal.Key.ChannelID
 	channelID := portal.Key.ChannelID
 	sess := sender.Session
 	sess := sender.Session
+	if sess == nil && portal.RelayWebhookID == "" {
+		// TODO error message
+		return
+	}
 	var threadID string
 	var threadID string
 
 
 	if editMXID := content.GetRelatesTo().GetReplaceID(); editMXID != "" && content.NewContent != nil {
 	if editMXID := content.GetRelatesTo().GetReplaceID(); editMXID != "" && content.NewContent != nil {
@@ -1579,11 +1583,22 @@ func (portal *Portal) handleMatrixRedaction(sender *User, evt *event.Event) {
 		return
 		return
 	}
 	}
 
 
-	// First look if we're redacting a message
+	sess := sender.Session
+	if sess == nil && portal.RelayWebhookID == "" {
+		// TODO metrics
+		return
+	}
+
 	message := portal.bridge.DB.Message.GetByMXID(portal.Key, evt.Redacts)
 	message := portal.bridge.DB.Message.GetByMXID(portal.Key, evt.Redacts)
 	if message != nil {
 	if message != nil {
+		var err error
 		// TODO add support for deleting individual attachments from messages
 		// TODO add support for deleting individual attachments from messages
-		err := sender.Session.ChannelMessageDelete(message.DiscordProtoChannelID(), message.DiscordID)
+		if sess != nil {
+			err = sess.ChannelMessageDelete(message.DiscordProtoChannelID(), message.DiscordID)
+		} else {
+			// TODO pre-validate that the message was sent by the webhook?
+			err = relayClient.WebhookMessageDelete(portal.RelayWebhookID, portal.RelayWebhookSecret, message.DiscordID)
+		}
 		go portal.sendMessageMetrics(evt, err, "Error sending")
 		go portal.sendMessageMetrics(evt, err, "Error sending")
 		if err == nil {
 		if err == nil {
 			message.Delete()
 			message.Delete()
@@ -1591,15 +1606,16 @@ func (portal *Portal) handleMatrixRedaction(sender *User, evt *event.Event) {
 		return
 		return
 	}
 	}
 
 
-	// Now check if it's a reaction.
-	reaction := portal.bridge.DB.Reaction.GetByMXID(evt.Redacts)
-	if reaction != nil && reaction.Channel == portal.Key {
-		err := sender.Session.MessageReactionRemove(reaction.DiscordProtoChannelID(), reaction.MessageID, reaction.EmojiName, reaction.Sender)
-		go portal.sendMessageMetrics(evt, err, "Error sending")
-		if err == nil {
-			reaction.Delete()
+	if sess != nil {
+		reaction := portal.bridge.DB.Reaction.GetByMXID(evt.Redacts)
+		if reaction != nil && reaction.Channel == portal.Key {
+			err := sess.MessageReactionRemove(reaction.DiscordProtoChannelID(), reaction.MessageID, reaction.EmojiName, reaction.Sender)
+			go portal.sendMessageMetrics(evt, err, "Error sending")
+			if err == nil {
+				reaction.Delete()
+			}
+			return
 		}
 		}
-		return
 	}
 	}
 
 
 	go portal.sendMessageMetrics(evt, errTargetNotFound, "Ignoring")
 	go portal.sendMessageMetrics(evt, errTargetNotFound, "Ignoring")