From 98bc98627d0c81a32a2046a0f4ffe6f7fa8632f5 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 27 Jun 2022 16:13:26 +0300 Subject: [PATCH] Re-add support for deleting attachments --- database/message.go | 8 +++----- portal.go | 22 +++++++++++++++++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/database/message.go b/database/message.go index 1dd692e..bf2ca4e 100644 --- a/database/message.go +++ b/database/message.go @@ -169,12 +169,10 @@ func (m *Message) Insert() { } func (m *Message) Delete() { - query := "DELETE FROM message WHERE dcid=$1 AND dc_chan_id=$2 AND dc_chan_receiver=$3" - - _, err := m.db.Exec(query, m.DiscordID, m.Channel.ChannelID, m.Channel.Receiver) - + query := "DELETE FROM message WHERE dcid=$1 AND dc_chan_id=$2 AND dc_chan_receiver=$3 AND dc_attachment_id=$4" + _, err := m.db.Exec(query, m.DiscordID, m.Channel.ChannelID, m.Channel.Receiver, m.AttachmentID) if err != nil { - m.log.Warnfln("Failed to delete %s@%s: %v", m.DiscordID, m.Channel, err) + m.log.Warnfln("Failed to delete %q of %s@%s: %v", m.AttachmentID, m.DiscordID, m.Channel, err) panic(err) } } diff --git a/portal.go b/portal.go index b940b28..841884c 100644 --- a/portal.go +++ b/portal.go @@ -690,8 +690,27 @@ func (portal *Portal) handleDiscordMessageUpdate(user *User, msg *discordgo.Mess intent := portal.bridge.GetPuppetByID(msg.Author.ID).IntentFor(portal) + attachmentMap := map[string]*database.Message{} + for _, existingPart := range existing { + if existingPart.AttachmentID != "" { + attachmentMap[existingPart.AttachmentID] = existingPart + } + } + for _, attachment := range msg.Attachments { + if _, found := attachmentMap[attachment.ID]; found { + delete(attachmentMap, attachment.ID) + } + } + for _, attachment := range attachmentMap { + _, err := intent.RedactEvent(portal.MXID, attachment.MXID) + if err != nil { + portal.log.Warnfln("Failed to remove attachment %s: %v", attachment.MXID, err) + } + attachment.Delete() + } + if msg.Content == "" || existing[0].AttachmentID != "" { - portal.log.Debugfln("Dropping non-text edit to %s", msg.ID) + portal.log.Debugfln("Dropping non-text edit to %s (message on matrix: %t, text on discord: %t)", msg.ID, existing[0].AttachmentID == "", len(msg.Content) > 0) return } content := renderDiscordMarkdown(msg.Content) @@ -1297,6 +1316,7 @@ func (portal *Portal) handleMatrixRedaction(sender *User, evt *event.Event) { portal.log.Debugfln("Failed to delete discord message %s: %v", message.DiscordID, err) portal.bridge.SendMessageErrorCheckpoint(evt, bridge.MsgStepRemote, err, true, 0) } else { + // TODO add support for deleting individual attachments from messages message.Delete() portal.bridge.SendMessageSuccessCheckpoint(evt, bridge.MsgStepRemote, 0) portal.sendDeliveryReceipt(evt.ID)