From a265d03319bd0bf2ff189629004f92fd7e30f31b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 2 Jun 2023 16:13:22 +0300 Subject: [PATCH] Add support for bulk message delete from Discord --- portal.go | 29 ++++++++++++++++++++++++----- user.go | 2 ++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/portal.go b/portal.go index 91f0e13..b4f2005 100644 --- a/portal.go +++ b/portal.go @@ -571,6 +571,8 @@ func (portal *Portal) handleDiscordMessages(msg portalDiscordMessage) { portal.handleDiscordMessageUpdate(msg.user, convertedMsg.Message) case *discordgo.MessageDelete: portal.handleDiscordMessageDelete(msg.user, convertedMsg.Message) + case *discordgo.MessageDeleteBulk: + portal.handleDiscordMessageDeleteBulk(msg.user, convertedMsg.Messages) case *discordgo.MessageReactionAdd: portal.handleDiscordReaction(msg.user, convertedMsg.MessageReaction, true, msg.thread, convertedMsg.Member) case *discordgo.MessageReactionRemove: @@ -929,14 +931,33 @@ func (portal *Portal) handleDiscordMessageUpdate(user *User, msg *discordgo.Mess } func (portal *Portal) handleDiscordMessageDelete(user *User, msg *discordgo.Message) { - existing := portal.bridge.DB.Message.GetByDiscordID(portal.Key, msg.ID) + lastResp := portal.redactAllParts(portal.MainIntent(), msg.ID) + if lastResp != "" { + portal.sendDeliveryReceipt(lastResp) + } +} + +func (portal *Portal) handleDiscordMessageDeleteBulk(user *User, messages []string) { intent := portal.MainIntent() var lastResp id.EventID + for _, msgID := range messages { + newLastResp := portal.redactAllParts(intent, msgID) + if newLastResp != "" { + lastResp = newLastResp + } + } + if lastResp != "" { + portal.sendDeliveryReceipt(lastResp) + } +} + +func (portal *Portal) redactAllParts(intent *appservice.IntentAPI, msgID string) (lastResp id.EventID) { + existing := portal.bridge.DB.Message.GetByDiscordID(portal.Key, msgID) for _, dbMsg := range existing { resp, err := intent.RedactEvent(portal.MXID, dbMsg.MXID) if err != nil { portal.log.Err(err). - Str("message_id", msg.ID). + Str("message_id", msgID). Str("event_id", dbMsg.MXID.String()). Msg("Failed to redact Matrix message") } else if resp != nil && resp.EventID != "" { @@ -944,9 +965,7 @@ func (portal *Portal) handleDiscordMessageDelete(user *User, msg *discordgo.Mess } dbMsg.Delete() } - if lastResp != "" { - portal.sendDeliveryReceipt(lastResp) - } + return } func (portal *Portal) handleDiscordTyping(evt *discordgo.TypingStart) { diff --git a/user.go b/user.go index 9253622..c6f7e0c 100644 --- a/user.go +++ b/user.go @@ -630,6 +630,8 @@ func (user *User) eventHandler(rawEvt any) { user.pushPortalMessage(evt, "message create", evt.ChannelID, evt.GuildID) case *discordgo.MessageDelete: user.pushPortalMessage(evt, "message delete", evt.ChannelID, evt.GuildID) + case *discordgo.MessageDeleteBulk: + user.pushPortalMessage(evt, "bulk message delete", evt.ChannelID, evt.GuildID) case *discordgo.MessageUpdate: user.pushPortalMessage(evt, "message update", evt.ChannelID, evt.GuildID) case *discordgo.MessageReactionAdd: