From 686b1995fa13cd69a518480d1f31731879ddda7c Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 29 May 2022 14:13:34 +0300 Subject: [PATCH] Add initial Discord->Matrix markdown rendering --- go.mod | 4 ++-- go.sum | 4 ++-- portal.go | 32 +++++++++++++++++++++----------- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 0ecc19c..4bcb659 100644 --- a/go.mod +++ b/go.mod @@ -9,8 +9,9 @@ require ( github.com/lib/pq v1.10.6 github.com/mattn/go-sqlite3 v1.14.13 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e + github.com/yuin/goldmark v1.4.12 maunium.net/go/maulogger/v2 v2.3.2 - maunium.net/go/mautrix v0.11.1-0.20220528212725-21d71dc1a1d5 + maunium.net/go/mautrix v0.11.1-0.20220529105558-04789fc73b32 ) require ( @@ -19,7 +20,6 @@ require ( github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/tidwall/sjson v1.2.4 // indirect - github.com/yuin/goldmark v1.4.12 // indirect golang.org/x/crypto v0.0.0-20220513210258-46612604a0f9 // indirect golang.org/x/net v0.0.0-20220513224357-95641704303c // indirect golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect diff --git a/go.sum b/go.sum index b4e8b79..299c495 100644 --- a/go.sum +++ b/go.sum @@ -58,5 +58,5 @@ maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= maunium.net/go/maulogger/v2 v2.3.2 h1:1XmIYmMd3PoQfp9J+PaHhpt80zpfmMqaShzUTC7FwY0= maunium.net/go/maulogger/v2 v2.3.2/go.mod h1:TYWy7wKwz/tIXTpsx8G3mZseIRiC5DoMxSZazOHy68A= -maunium.net/go/mautrix v0.11.1-0.20220528212725-21d71dc1a1d5 h1:HUIEwZ+zgXUhghtUhmcOidcxYBbx+W+/C7MAuhc15o8= -maunium.net/go/mautrix v0.11.1-0.20220528212725-21d71dc1a1d5/go.mod h1:CiKpMhAx5QZFHK03jpWb0iKI3sGU8x6+LfsOjDrcO8I= +maunium.net/go/mautrix v0.11.1-0.20220529105558-04789fc73b32 h1:uAYLJ44nuGvR84XAUYGVrwFRhix30CTKgDIIyVHPD6U= +maunium.net/go/mautrix v0.11.1-0.20220529105558-04789fc73b32/go.mod h1:CiKpMhAx5QZFHK03jpWb0iKI3sGU8x6+LfsOjDrcO8I= diff --git a/portal.go b/portal.go index 6de6287..d133bef 100644 --- a/portal.go +++ b/portal.go @@ -3,11 +3,16 @@ package main import ( "bytes" "fmt" + "regexp" "strconv" "strings" "sync" "time" + "github.com/yuin/goldmark" + + "maunium.net/go/mautrix/format" + "maunium.net/go/mautrix/format/mdext" "maunium.net/go/mautrix/util/variationselector" "github.com/bwmarrin/discordgo" @@ -538,6 +543,17 @@ func (portal *Portal) handleDiscordAttachment(intent *appservice.IntentAPI, msgI } } +var mdRenderer = goldmark.New(format.Extensions, format.HTMLOptions, + goldmark.WithExtensions(mdext.EscapeHTML, mdext.SimpleSpoiler, mdext.DiscordUnderline)) +var escapeFixer = regexp.MustCompile(`\\(__[^_]|\*\*[^*])`) + +func renderDiscordMarkdown(text string) event.MessageEventContent { + text = escapeFixer.ReplaceAllStringFunc(text, func(s string) string { + return s[:2] + `\` + s[2:] + }) + return format.RenderMarkdownCustom(text, mdRenderer) +} + func (portal *Portal) handleDiscordMessageCreate(user *User, msg *discordgo.Message, thread *Thread) { if portal.MXID == "" { portal.log.Warnln("handle message called without a valid portal") @@ -593,11 +609,8 @@ func (portal *Portal) handleDiscordMessageCreate(user *User, msg *discordgo.Mess ts, _ := discordgo.SnowflakeTimestamp(msg.ID) if msg.Content != "" { - content := &event.MessageEventContent{ - Body: msg.Content, - MsgType: event.MsgText, - RelatesTo: threadRelation.Copy(), - } + content := renderDiscordMarkdown(msg.Content) + content.RelatesTo = threadRelation.Copy() if msg.MessageReference != nil { //key := database.PortalKey{msg.MessageReference.ChannelID, user.ID} @@ -610,7 +623,7 @@ func (portal *Portal) handleDiscordMessageCreate(user *User, msg *discordgo.Mess } } - resp, err := portal.sendMatrixMessage(intent, event.EventMessage, content, nil, ts.UnixMilli()) + resp, err := portal.sendMatrixMessage(intent, event.EventMessage, &content, nil, ts.UnixMilli()) if err != nil { portal.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err) return @@ -709,10 +722,7 @@ func (portal *Portal) handleDiscordMessageUpdate(user *User, msg *discordgo.Mess return } - content := &event.MessageEventContent{ - Body: msg.Content, - MsgType: event.MsgText, - } + content := renderDiscordMarkdown(msg.Content) content.SetEdit(existing.MXID) var editTS int64 @@ -720,7 +730,7 @@ func (portal *Portal) handleDiscordMessageUpdate(user *User, msg *discordgo.Mess editTS = msg.EditedTimestamp.UnixMilli() } // TODO figure out some way to deduplicate outgoing edits - _, err := portal.sendMatrixMessage(intent, event.EventMessage, content, nil, editTS) + _, err := portal.sendMatrixMessage(intent, event.EventMessage, &content, nil, editTS) if err != nil { portal.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err)