Add initial Discord->Matrix markdown rendering
This commit is contained in:
4
go.mod
4
go.mod
@@ -9,8 +9,9 @@ require (
|
|||||||
github.com/lib/pq v1.10.6
|
github.com/lib/pq v1.10.6
|
||||||
github.com/mattn/go-sqlite3 v1.14.13
|
github.com/mattn/go-sqlite3 v1.14.13
|
||||||
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
|
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/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 (
|
require (
|
||||||
@@ -19,7 +20,6 @@ require (
|
|||||||
github.com/tidwall/match v1.1.1 // indirect
|
github.com/tidwall/match v1.1.1 // indirect
|
||||||
github.com/tidwall/pretty v1.2.0 // indirect
|
github.com/tidwall/pretty v1.2.0 // indirect
|
||||||
github.com/tidwall/sjson v1.2.4 // 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/crypto v0.0.0-20220513210258-46612604a0f9 // indirect
|
||||||
golang.org/x/net v0.0.0-20220513224357-95641704303c // indirect
|
golang.org/x/net v0.0.0-20220513224357-95641704303c // indirect
|
||||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect
|
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 // indirect
|
||||||
|
|||||||
4
go.sum
4
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/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 h1:1XmIYmMd3PoQfp9J+PaHhpt80zpfmMqaShzUTC7FwY0=
|
||||||
maunium.net/go/maulogger/v2 v2.3.2/go.mod h1:TYWy7wKwz/tIXTpsx8G3mZseIRiC5DoMxSZazOHy68A=
|
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.20220529105558-04789fc73b32 h1:uAYLJ44nuGvR84XAUYGVrwFRhix30CTKgDIIyVHPD6U=
|
||||||
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/go.mod h1:CiKpMhAx5QZFHK03jpWb0iKI3sGU8x6+LfsOjDrcO8I=
|
||||||
|
|||||||
32
portal.go
32
portal.go
@@ -3,11 +3,16 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/yuin/goldmark"
|
||||||
|
|
||||||
|
"maunium.net/go/mautrix/format"
|
||||||
|
"maunium.net/go/mautrix/format/mdext"
|
||||||
"maunium.net/go/mautrix/util/variationselector"
|
"maunium.net/go/mautrix/util/variationselector"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"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) {
|
func (portal *Portal) handleDiscordMessageCreate(user *User, msg *discordgo.Message, thread *Thread) {
|
||||||
if portal.MXID == "" {
|
if portal.MXID == "" {
|
||||||
portal.log.Warnln("handle message called without a valid portal")
|
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)
|
ts, _ := discordgo.SnowflakeTimestamp(msg.ID)
|
||||||
if msg.Content != "" {
|
if msg.Content != "" {
|
||||||
content := &event.MessageEventContent{
|
content := renderDiscordMarkdown(msg.Content)
|
||||||
Body: msg.Content,
|
content.RelatesTo = threadRelation.Copy()
|
||||||
MsgType: event.MsgText,
|
|
||||||
RelatesTo: threadRelation.Copy(),
|
|
||||||
}
|
|
||||||
|
|
||||||
if msg.MessageReference != nil {
|
if msg.MessageReference != nil {
|
||||||
//key := database.PortalKey{msg.MessageReference.ChannelID, user.ID}
|
//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 {
|
if err != nil {
|
||||||
portal.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err)
|
portal.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err)
|
||||||
return
|
return
|
||||||
@@ -709,10 +722,7 @@ func (portal *Portal) handleDiscordMessageUpdate(user *User, msg *discordgo.Mess
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
content := &event.MessageEventContent{
|
content := renderDiscordMarkdown(msg.Content)
|
||||||
Body: msg.Content,
|
|
||||||
MsgType: event.MsgText,
|
|
||||||
}
|
|
||||||
content.SetEdit(existing.MXID)
|
content.SetEdit(existing.MXID)
|
||||||
|
|
||||||
var editTS int64
|
var editTS int64
|
||||||
@@ -720,7 +730,7 @@ func (portal *Portal) handleDiscordMessageUpdate(user *User, msg *discordgo.Mess
|
|||||||
editTS = msg.EditedTimestamp.UnixMilli()
|
editTS = msg.EditedTimestamp.UnixMilli()
|
||||||
}
|
}
|
||||||
// TODO figure out some way to deduplicate outgoing edits
|
// 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 {
|
if err != nil {
|
||||||
portal.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err)
|
portal.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user