diff --git a/formatter.go b/formatter.go index 8e99aa9..6452532 100644 --- a/formatter.go +++ b/formatter.go @@ -74,7 +74,7 @@ var discordRendererWithInlineLinks = goldmark.New( fixIndentedParagraphs, format.HTMLOptions, discordExtensions, ) -func (portal *Portal) renderDiscordMarkdownOnlyHTML(text string, allowInlineLinks bool) string { +func (portal *Portal) renderDiscordMarkdownOnlyHTMLNoUnwrap(text string, allowInlineLinks bool) string { text = escapeFixer.ReplaceAllStringFunc(text, escapeReplacement) var buf strings.Builder @@ -88,7 +88,11 @@ func (portal *Portal) renderDiscordMarkdownOnlyHTML(text string, allowInlineLink if err != nil { panic(fmt.Errorf("markdown parser errored: %w", err)) } - return format.UnwrapSingleParagraph(buf.String()) + return buf.String() +} + +func (portal *Portal) renderDiscordMarkdownOnlyHTML(text string, allowInlineLinks bool) string { + return format.UnwrapSingleParagraph(portal.renderDiscordMarkdownOnlyHTMLNoUnwrap(text, allowInlineLinks)) } const formatterContextPortalKey = "fi.mau.discord.portal" diff --git a/go.mod b/go.mod index 2b779b3..7d67d1b 100644 --- a/go.mod +++ b/go.mod @@ -42,4 +42,4 @@ require ( maunium.net/go/mauflag v1.0.0 // indirect ) -replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20250320154217-0d7f942e6b38 +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20250607214857-f23a8518ece2 diff --git a/go.sum b/go.sum index a81124d..c24d7f4 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/beeper/discordgo v0.0.0-20250320154217-0d7f942e6b38 h1:1WoSvVGM1pI9f+x7EGD2QPaXSUQeF3B7Lox7bmVe//s= -github.com/beeper/discordgo v0.0.0-20250320154217-0d7f942e6b38/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= +github.com/beeper/discordgo v0.0.0-20250607214857-f23a8518ece2 h1:8lgTjYGSIlS90f0jiFfEC4UwxCq9FiUo4dKwjknbupQ= +github.com/beeper/discordgo v0.0.0-20250607214857-f23a8518ece2/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/portal_convert.go b/portal_convert.go index 02218bd..26df0a5 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -34,6 +34,8 @@ import ( "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/format" "maunium.net/go/mautrix/id" + + "go.mau.fi/mautrix-discord/database" ) type ConvertedMessage struct { @@ -664,6 +666,12 @@ func (portal *Portal) convertDiscordMentions(msg *discordgo.Message, syncGhosts return &matrixMentions } +const forwardTemplateHTML = `
+

↷ Forwarded

+%s +

%s

+
` + func (portal *Portal) convertDiscordTextMessage(ctx context.Context, intent *appservice.IntentAPI, msg *discordgo.Message) *ConvertedMessage { log := zerolog.Ctx(ctx) if msg.Type == discordgo.MessageTypeCall { @@ -685,6 +693,36 @@ func (portal *Portal) convertDiscordTextMessage(ctx context.Context, intent *app } if msg.Content != "" && !isPlainGifMessage(msg) { htmlParts = append(htmlParts, portal.renderDiscordMarkdownOnlyHTML(msg.Content, true)) + } else if msg.MessageReference != nil && + msg.MessageReference.Type == discordgo.MessageReferenceTypeForward && + len(msg.MessageSnapshots) > 0 && + msg.MessageSnapshots[0].Message != nil { + forwardedHTML := portal.renderDiscordMarkdownOnlyHTMLNoUnwrap(msg.MessageSnapshots[0].Message.Content, true) + msgTSText := msg.MessageSnapshots[0].Message.Timestamp.Format("2006-01-02 15:04 MST") + origLink := fmt.Sprintf("unknown channel • %s", msgTSText) + forwardedFromPortal := portal.bridge.GetExistingPortalByID(database.NewPortalKey(msg.MessageReference.ChannelID, "")) + if forwardedFromPortal != nil { + origMessage := portal.bridge.DB.Message.GetFirstByDiscordID(forwardedFromPortal.Key, msg.MessageReference.MessageID) + if origMessage != nil { + origLink = fmt.Sprintf( + `#%s • %s`, + forwardedFromPortal.MXID.EventURI(origMessage.MXID, portal.bridge.AS.HomeserverDomain), + forwardedFromPortal.PlainName, + msgTSText, + ) + } else if forwardedFromPortal.MXID != "" { + origLink = fmt.Sprintf( + `#%s • %s`, + forwardedFromPortal.MXID.URI(portal.bridge.AS.HomeserverDomain), + forwardedFromPortal.PlainName, + msgTSText, + ) + } else if forwardedFromPortal.PlainName != "" { + origLink = fmt.Sprintf("%s • %s", forwardedFromPortal.PlainName, msgTSText) + } + } + + htmlParts = append(htmlParts, fmt.Sprintf(forwardTemplateHTML, forwardedHTML, origLink)) } previews := make([]*BeeperLinkPreview, 0) for i, embed := range msg.Embeds {