diff --git a/portal_convert.go b/portal_convert.go index b8a7a82..c875e23 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -109,7 +109,8 @@ func (portal *Portal) convertDiscordSticker(intent *appservice.IntentAPI, sticke portal.log.Warnfln("Unknown sticker format %d in %s", sticker.FormatType, sticker.ID) } return &ConvertedMessage{ - Type: event.EventSticker, + AttachmentID: sticker.ID, + Type: event.EventSticker, Content: portal.convertDiscordFile("sticker", intent, sticker.ID, sticker.URL(), &event.MessageEventContent{ Body: sticker.Name, // TODO find description from somewhere? Info: &event.FileInfo{ @@ -148,8 +149,9 @@ func (portal *Portal) convertDiscordAttachment(intent *appservice.IntentAPI, att } content = portal.convertDiscordFile("attachment", intent, att.ID, att.URL, content) return &ConvertedMessage{ - Type: event.EventMessage, - Content: content, + AttachmentID: att.ID, + Type: event.EventMessage, + Content: content, } } @@ -214,27 +216,35 @@ func (portal *Portal) convertDiscordMessage(intent *appservice.IntentAPI, msg *d if textPart := portal.convertDiscordTextMessage(intent, msg); textPart != nil { parts = append(parts, textPart) } + handledIDs := make(map[string]struct{}) for _, att := range msg.Attachments { + if _, handled := handledIDs[att.ID]; handled { + continue + } + handledIDs[att.ID] = struct{}{} if part := portal.convertDiscordAttachment(intent, att); part != nil { parts = append(parts, part) } } for _, sticker := range msg.StickerItems { + if _, handled := handledIDs[sticker.ID]; handled { + continue + } + handledIDs[sticker.ID] = struct{}{} if part := portal.convertDiscordSticker(intent, sticker); part != nil { parts = append(parts, part) } } - handledURLs := make(map[string]struct{}) for _, embed := range msg.Embeds { // Ignore non-video embeds, they're handled in convertDiscordTextMessage if getEmbedType(embed) != EmbedVideo { continue } // Discord deduplicates embeds by URL. It makes things easier for us too. - if _, handled := handledURLs[embed.URL]; handled { + if _, handled := handledIDs[embed.URL]; handled { continue } - handledURLs[embed.URL] = struct{}{} + handledIDs[embed.URL] = struct{}{} part := portal.convertDiscordVideoEmbed(intent, embed) if part != nil { parts = append(parts, part)