Handle redactions from webhook users

This commit is contained in:
Tulir Asokan
2023-03-01 18:48:40 +02:00
parent d3828f2fb3
commit f7c8e03041

View File

@@ -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")