From f7c8e03041326473967fc07da3ffd18b484d8e88 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 1 Mar 2023 18:48:40 +0200 Subject: [PATCH] Handle redactions from webhook users --- portal.go | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/portal.go b/portal.go index f5a8083..1836cd4 100644 --- a/portal.go +++ b/portal.go @@ -1100,6 +1100,10 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { channelID := portal.Key.ChannelID sess := sender.Session + if sess == nil && portal.RelayWebhookID == "" { + // TODO error message + return + } var threadID string if editMXID := content.GetRelatesTo().GetReplaceID(); editMXID != "" && content.NewContent != nil { @@ -1579,11 +1583,22 @@ func (portal *Portal) handleMatrixRedaction(sender *User, evt *event.Event) { 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) if message != nil { + var err error // 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") if err == nil { message.Delete() @@ -1591,15 +1606,16 @@ func (portal *Portal) handleMatrixRedaction(sender *User, evt *event.Event) { 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")