From a0ee1fd50815ac615317518011b72ccd786dfc01 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 13 Nov 2024 14:12:52 +0200 Subject: [PATCH 01/44] .github: update bug report template --- .github/ISSUE_TEMPLATE/bug.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index 02ed284..18862a5 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -5,3 +5,10 @@ about: If something is definitely wrong in the bridge (rather than just a setup labels: bug --- + + From 449c9264d859fea0f6aab3740f371a8f2f487a54 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 13 Nov 2024 14:58:00 +0200 Subject: [PATCH 02/44] dependencies: update discordgo --- go.mod | 2 +- go.sum | 4 ++-- portal.go | 1 - portal_convert.go | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index e647a6f..050f7b0 100644 --- a/go.mod +++ b/go.mod @@ -40,4 +40,4 @@ require ( maunium.net/go/mauflag v1.0.0 // indirect ) -replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20231013182643-f333f2578a3c +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20241113125118-f10d4b845afa diff --git a/go.sum b/go.sum index adee6de..06a4196 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-20231013182643-f333f2578a3c h1:WaJ9eX8eyOBHD8te5t7xzm27uwhfaN94o8vUVFXliyA= -github.com/beeper/discordgo v0.0.0-20231013182643-f333f2578a3c/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= +github.com/beeper/discordgo v0.0.0-20241113125118-f10d4b845afa h1:QeYHs4k99BGFQosL3Ibid0maes+zpqOtWBPMlDqqfJc= +github.com/beeper/discordgo v0.0.0-20241113125118-f10d4b845afa/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.go b/portal.go index a86fa64..c948b6c 100644 --- a/portal.go +++ b/portal.go @@ -1674,7 +1674,6 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { Content: sendReq.Content, Username: username, AvatarURL: avatarURL, - TTS: sendReq.TTS, Files: sendReq.Files, Components: sendReq.Components, Embeds: sendReq.Embeds, diff --git a/portal_convert.go b/portal_convert.go index 90f0100..0ee4fc5 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -101,7 +101,7 @@ func (portal *Portal) cleanupConvertedStickerInfo(content *event.MessageEventCon } } -func (portal *Portal) convertDiscordSticker(ctx context.Context, intent *appservice.IntentAPI, sticker *discordgo.Sticker) *ConvertedMessage { +func (portal *Portal) convertDiscordSticker(ctx context.Context, intent *appservice.IntentAPI, sticker *discordgo.StickerItem) *ConvertedMessage { var mime string switch sticker.FormatType { case discordgo.StickerFormatTypePNG: From 024577d8222b95010a2c6238b940742eb59de378 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 13 Nov 2024 15:15:36 +0200 Subject: [PATCH 03/44] user: catch 40002 responses --- backfill.go | 3 +++ portal.go | 1 + user.go | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/backfill.go b/backfill.go index 6e0f0a1..122181b 100644 --- a/backfill.go +++ b/backfill.go @@ -151,6 +151,9 @@ func (portal *Portal) collectBackfillMessages(log zerolog.Logger, source *User, func (portal *Portal) backfillLimited(log zerolog.Logger, source *User, limit int, after string, thread *Thread) { messages, foundAll, err := portal.collectBackfillMessages(log, source, limit, after, thread) if err != nil { + if source.handlePossible40002(err) { + panic(err) + } log.Err(err).Msg("Error collecting messages to forward backfill") return } diff --git a/portal.go b/portal.go index c948b6c..09c1853 100644 --- a/portal.go +++ b/portal.go @@ -1680,6 +1680,7 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { AllowedMentions: sendReq.AllowedMentions, }) } + sender.handlePossible40002(err) go portal.sendMessageMetrics(evt, err, "Error sending") if msg != nil { dbMsg := portal.bridge.DB.Message.New() diff --git a/user.go b/user.go index 1f08fba..d3c85e5 100644 --- a/user.go +++ b/user.go @@ -7,6 +7,7 @@ import ( "math/rand" "net/http" "os" + "runtime/debug" "sort" "strconv" "strings" @@ -579,6 +580,15 @@ func (user *User) eventHandlerSync(rawEvt any) { } func (user *User) eventHandler(rawEvt any) { + defer func() { + err := recover() + if err != nil { + user.log.Error(). + Bytes(zerolog.ErrorStackFieldName, debug.Stack()). + Any(zerolog.ErrorFieldName, err). + Msg("Panic in Discord event handler") + } + }() switch evt := rawEvt.(type) { case *discordgo.Ready: user.readyHandler(evt) @@ -999,6 +1009,15 @@ func (user *User) invalidAuthHandler(_ *discordgo.InvalidAuth) { go user.Logout(false) } +func (user *User) handlePossible40002(err error) bool { + var restErr *discordgo.RESTError + if !errors.As(err, &restErr) || restErr.Message == nil || restErr.Message.Code != discordgo.ErrCodeActionRequiredVerifiedAccount { + return false + } + user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBadCredentials, Error: "dc-http-40002", Message: restErr.Message.Message}) + return true +} + func (user *User) guildCreateHandler(g *discordgo.GuildCreate) { user.log.Info(). Str("guild_id", g.ID). From 0d148ffad6b24cf4094786320e0010b0a3e66252 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 13 Nov 2024 15:17:33 +0200 Subject: [PATCH 04/44] ci: lock closed issues automatically after 90 days --- .github/workflows/stale.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..0f49322 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,29 @@ +name: 'Lock old issues' + +on: + schedule: + - cron: '0 21 * * *' + workflow_dispatch: + +permissions: + issues: write +# pull-requests: write +# discussions: write + +concurrency: + group: lock-threads + +jobs: + lock-stale: + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v5 + id: lock + with: + issue-inactive-days: 90 + process-only: issues + - name: Log processed threads + run: | + if [ '${{ steps.lock.outputs.issues }}' ]; then + echo "Issues:" && echo '${{ steps.lock.outputs.issues }}' | jq -r '.[] | "https://github.com/\(.owner)/\(.repo)/issues/\(.issue_number)"' + fi From a9df85fdca3b2a6e19fb3796f8bac40fae0b5624 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 14 Nov 2024 22:57:09 +0200 Subject: [PATCH 05/44] portal: add missing `fi.mau.gif` field to gifvs --- portal_convert.go | 1 + 1 file changed, 1 insertion(+) diff --git a/portal_convert.go b/portal_convert.go index 0ee4fc5..66f93fe 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -252,6 +252,7 @@ func (portal *Portal) convertDiscordVideoEmbed(ctx context.Context, intent *apps if content.MsgType == event.MsgVideo && embed.Type == discordgo.EmbedTypeGifv { extra["info"] = map[string]any{ "fi.mau.discord.gifv": true, + "fi.mau.gif": true, "fi.mau.loop": true, "fi.mau.autoplay": true, "fi.mau.hide_controls": true, From 1e3b854ee1661bfd5dc2771a792cc68de55a1aaf Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 15 Nov 2024 13:11:13 +0200 Subject: [PATCH 06/44] dependencies: update golang.org/x deps and bump minimum go version --- .github/workflows/go.yml | 4 ++-- go.mod | 16 +++++++++------- go.sum | 24 ++++++++++++------------ 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 3d392af..fa170a7 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -8,8 +8,8 @@ jobs: strategy: fail-fast: false matrix: - go-version: ["1.21", "1.22"] - name: Lint ${{ matrix.go-version == '1.22' && '(latest)' || '(old)' }} + go-version: ["1.22", "1.23"] + name: Lint ${{ matrix.go-version == '1.23' && '(latest)' || '(old)' }} steps: - uses: actions/checkout@v4 diff --git a/go.mod b/go.mod index 050f7b0..6f4afcc 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module go.mau.fi/mautrix-discord -go 1.21 +go 1.22.0 + +toolchain go1.23.3 require ( github.com/bwmarrin/discordgo v0.27.0 @@ -9,14 +11,14 @@ require ( github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 github.com/lib/pq v1.10.9 - github.com/mattn/go-sqlite3 v1.14.22 + github.com/mattn/go-sqlite3 v1.14.24 github.com/rs/zerolog v1.31.0 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/stretchr/testify v1.8.4 github.com/yuin/goldmark v1.6.0 go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb - golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 - golang.org/x/sync v0.5.0 + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f + golang.org/x/sync v0.9.0 maunium.net/go/maulogger/v2 v2.4.1 maunium.net/go/mautrix v0.16.3-0.20240712164054-e6046fbf432c ) @@ -32,9 +34,9 @@ require ( github.com/tidwall/pretty v1.2.0 // indirect github.com/tidwall/sjson v1.2.5 // indirect go.mau.fi/zeroconfig v0.1.2 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/net v0.18.0 // indirect - golang.org/x/sys v0.14.0 // indirect + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/sys v0.27.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index 06a4196..b22743d 100644 --- a/go.sum +++ b/go.sum @@ -22,8 +22,8 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= -github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -49,19 +49,19 @@ go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb h1:Is+6vDKgINRy9KHodvi7NElxo go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb/go.mod h1:tiBX6nxVSOjU89jVQ7wBh3P8KjM26Lv1k7/I5QdSvBw= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 h1:+iq7lrkxmFNBM7xx+Rae2W6uyPfhPeDWD+n+JgppptE= -golang.org/x/exp v0.0.0-20231219180239-dc181d75b848/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= From c01f502e047547295c74e576db545317f6043e5c Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 16 Nov 2024 18:06:31 +0200 Subject: [PATCH 07/44] Bump version to v0.7.1 --- CHANGELOG.md | 5 +++++ main.go | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a0716e..3ea9416 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v0.7.1 (2024-11-16) + +* Bumped minimum Go version to 1.22. +* Updated Discord version numbers. + # v0.7.0 (2024-07-16) * Bumped minimum Go version to 1.21. diff --git a/main.go b/main.go index 1700d8f..4017229 100644 --- a/main.go +++ b/main.go @@ -185,7 +185,7 @@ func main() { Name: "mautrix-discord", URL: "https://github.com/mautrix/discord", Description: "A Matrix-Discord puppeting bridge.", - Version: "0.7.0", + Version: "0.7.1", ProtocolName: "Discord", BeeperServiceName: "discordgo", BeeperNetworkName: "discord", From 8219516edef8989802f1fb180d7d24d0ae589000 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 22 Nov 2024 00:29:29 +0200 Subject: [PATCH 08/44] dependencies: update discordgo --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6f4afcc..272fe12 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-20241113125118-f10d4b845afa +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20241121222213-424cfdb527f5 diff --git a/go.sum b/go.sum index b22743d..8ad3197 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-20241113125118-f10d4b845afa h1:QeYHs4k99BGFQosL3Ibid0maes+zpqOtWBPMlDqqfJc= -github.com/beeper/discordgo v0.0.0-20241113125118-f10d4b845afa/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= +github.com/beeper/discordgo v0.0.0-20241121222213-424cfdb527f5 h1:3w2UYUgbHJ8HJhmOi4fNSYRPV25rmoCcOoV1T74bzRI= +github.com/beeper/discordgo v0.0.0-20241121222213-424cfdb527f5/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= From b330c5836e4b9de52e627637b7f711ed1373b00f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 29 Nov 2024 19:25:43 +0200 Subject: [PATCH 09/44] client: set referers properly --- attachments.go | 6 ++++++ backfill.go | 4 ++-- commands.go | 4 ++-- commands_botinteraction.go | 6 +++--- directmedia.go | 6 +++++- go.mod | 2 +- go.sum | 4 ++-- portal.go | 30 ++++++++++++++++++++++-------- thread.go | 6 +++++- 9 files changed, 48 insertions(+), 20 deletions(-) diff --git a/attachments.go b/attachments.go index d710849..50d3c0b 100644 --- a/attachments.go +++ b/attachments.go @@ -73,6 +73,12 @@ func uploadDiscordAttachment(url string, data []byte) error { for key, value := range discordgo.DroidFetchHeaders { req.Header.Set(key, value) } + req.Header.Set("Content-Type", "application/octet-stream") + req.Header.Set("Referer", "https://discord.com/") + req.Header.Del("X-Debug-Options") + req.Header.Del("X-Discord-Locale") + req.Header.Del("X-Discord-Timezone") + req.Header.Del("X-Super-Properties") resp, err := http.DefaultClient.Do(req) if err != nil { diff --git a/backfill.go b/backfill.go index 122181b..c4966bd 100644 --- a/backfill.go +++ b/backfill.go @@ -117,7 +117,7 @@ func (portal *Portal) collectBackfillMessages(log zerolog.Logger, source *User, } for { log.Debug().Str("before_id", before).Msg("Fetching messages for backfill") - newMessages, err := source.Session.ChannelMessages(protoChannelID, messageFetchChunkSize, before, "", "") + newMessages, err := source.Session.ChannelMessages(protoChannelID, messageFetchChunkSize, before, "", "", portal.RefererOptIfUser(source.Session, protoChannelID)...) if err != nil { return nil, false, err } @@ -183,7 +183,7 @@ func (portal *Portal) backfillUnlimitedMissed(log zerolog.Logger, source *User, } for { log.Debug().Str("after_id", after).Msg("Fetching chunk of messages to backfill") - messages, err := source.Session.ChannelMessages(protoChannelID, messageFetchChunkSize, "", after, "") + messages, err := source.Session.ChannelMessages(protoChannelID, messageFetchChunkSize, "", after, "", portal.RefererOptIfUser(source.Session, protoChannelID)...) if err != nil { log.Err(err).Msg("Error fetching chunk of messages to forward backfill") return diff --git a/commands.go b/commands.go index ab407ed..060a4ab 100644 --- a/commands.go +++ b/commands.go @@ -468,7 +468,7 @@ func fnSetRelay(ce *WrappedCommandEvent) { return } case "create": - perms, err := ce.User.Session.UserChannelPermissions(ce.User.DiscordID, portal.Key.ChannelID) + perms, err := ce.User.Session.UserChannelPermissions(ce.User.DiscordID, portal.Key.ChannelID, portal.RefererOptIfUser(ce.User.Session, "")...) if err != nil { log.Warn().Err(err).Msg("Failed to check user permissions") ce.Reply("Failed to check if you have permission to create webhooks") @@ -483,7 +483,7 @@ func fnSetRelay(ce *WrappedCommandEvent) { name = strings.Join(ce.Args[1:], " ") } log.Debug().Str("webhook_name", name).Msg("Creating webhook") - webhookMeta, err = ce.User.Session.WebhookCreate(portal.Key.ChannelID, name, "") + webhookMeta, err = ce.User.Session.WebhookCreate(portal.Key.ChannelID, name, "", portal.RefererOptIfUser(ce.User.Session, "")...) if err != nil { log.Warn().Err(err).Msg("Failed to create webhook") ce.Reply("Failed to create webhook: %v", err) diff --git a/commands_botinteraction.go b/commands_botinteraction.go index 28a1340..8dd585a 100644 --- a/commands_botinteraction.go +++ b/commands_botinteraction.go @@ -61,7 +61,7 @@ func (portal *Portal) getCommand(user *User, command string) (*discordgo.Applica defer portal.commandsLock.Unlock() cmd, ok := portal.commands[command] if !ok { - results, err := user.Session.ApplicationCommandsSearch(portal.Key.ChannelID, command) + results, err := user.Session.ApplicationCommandsSearch(portal.Key.ChannelID, command, portal.RefererOpt("")) if err != nil { return nil, err } @@ -247,7 +247,7 @@ func fnCommands(ce *WrappedCommandEvent) { } subcmd := strings.ToLower(ce.Args[0]) if subcmd == "search" { - results, err := ce.User.Session.ApplicationCommandsSearch(ce.Portal.Key.ChannelID, ce.Args[1]) + results, err := ce.User.Session.ApplicationCommandsSearch(ce.Portal.Key.ChannelID, ce.Args[1], ce.Portal.RefererOpt("")) if err != nil { ce.Reply("Error searching for commands: %v", err) return @@ -297,7 +297,7 @@ func fnExec(ce *WrappedCommandEvent) { ce.User.pendingInteractionsLock.Lock() ce.User.pendingInteractions[nonce] = ce ce.User.pendingInteractionsLock.Unlock() - err = ce.User.Session.SendInteractions(ce.Portal.GuildID, ce.Portal.Key.ChannelID, cmd, options, nonce) + err = ce.User.Session.SendInteractions(ce.Portal.GuildID, ce.Portal.Key.ChannelID, cmd, options, nonce, ce.Portal.RefererOpt("")) if err != nil { ce.Reply("Error sending interaction: %v", err) ce.User.pendingInteractionsLock.Lock() diff --git a/directmedia.go b/directmedia.go index c6f8a2b..4499c1a 100644 --- a/directmedia.go +++ b/directmedia.go @@ -357,7 +357,11 @@ func (dma *DirectMediaAPI) fetchNewAttachmentURL(ctx context.Context, meta *Atta var err error messageIDStr := strconv.FormatUint(meta.MessageID, 10) if client.IsUser { - msgs, err = client.ChannelMessages(channelIDStr, 5, "", "", messageIDStr) + var refs []discordgo.RequestOption + if portal != nil { + refs = append(refs, discordgo.WithChannelReferer(portal.GuildID, channelIDStr)) + } + msgs, err = client.ChannelMessages(channelIDStr, 5, "", "", messageIDStr, refs...) } else { var msg *discordgo.Message msg, err = client.ChannelMessage(channelIDStr, messageIDStr) diff --git a/go.mod b/go.mod index 272fe12..c6e4cee 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-20241121222213-424cfdb527f5 +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20241129150404-0ddeff8635e8 diff --git a/go.sum b/go.sum index 8ad3197..978f572 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-20241121222213-424cfdb527f5 h1:3w2UYUgbHJ8HJhmOi4fNSYRPV25rmoCcOoV1T74bzRI= -github.com/beeper/discordgo v0.0.0-20241121222213-424cfdb527f5/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= +github.com/beeper/discordgo v0.0.0-20241129150404-0ddeff8635e8 h1:pJeDjlzwk6z6XTC1N54QNdAplXlnQ+Er+tO6ogquj0Q= +github.com/beeper/discordgo v0.0.0-20241129150404-0ddeff8635e8/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.go b/portal.go index 09c1853..2c91156 100644 --- a/portal.go +++ b/portal.go @@ -1167,7 +1167,7 @@ func (portal *Portal) startThreadFromMatrix(sender *User, threadRoot id.EventID) AutoArchiveDuration: 24 * 60, Type: discordgo.ChannelTypeGuildPublicThread, Location: "Message", - }) + }, portal.RefererOptIfUser(sender.Session, "")...) if err != nil { return "", fmt.Errorf("error starting thread: %v", err) } @@ -1497,6 +1497,20 @@ func (portal *Portal) convertReplyMessageToEmbed(eventID id.EventID, url string) return embed, nil } +func (portal *Portal) RefererOpt(threadID string) discordgo.RequestOption { + if threadID != "" && threadID != portal.Key.ChannelID { + return discordgo.WithThreadReferer(portal.GuildID, portal.Key.ChannelID, threadID) + } + return discordgo.WithChannelReferer(portal.GuildID, portal.Key.ChannelID) +} + +func (portal *Portal) RefererOptIfUser(sess *discordgo.Session, threadID string) []discordgo.RequestOption { + if sess == nil || !sess.IsUser { + return nil + } + return []discordgo.RequestOption{portal.RefererOpt(threadID)} +} + func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { if portal.IsPrivateChat() && sender.DiscordID != portal.Key.Receiver { go portal.sendMessageMetrics(evt, errUserNotReceiver, "Ignoring") @@ -1626,7 +1640,7 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { Name: att.Filename, ID: sender.NextDiscordUploadID(), }}, - }) + }, portal.RefererOpt(threadID)) if err != nil { go portal.sendMessageMetrics(evt, err, "Error preparing to reupload media in") return @@ -1667,7 +1681,7 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { var msg *discordgo.Message var err error if !isWebhookSend { - msg, err = sess.ChannelMessageSendComplex(channelID, &sendReq) + msg, err = sess.ChannelMessageSendComplex(channelID, &sendReq, portal.RefererOptIfUser(sess, threadID)...) } else { username, avatarURL := portal.getRelayUserMeta(sender) msg, err = relayClient.WebhookThreadExecute(portal.RelayWebhookID, portal.RelayWebhookSecret, true, threadID, &discordgo.WebhookParams{ @@ -1915,7 +1929,7 @@ func (portal *Portal) handleMatrixReaction(sender *User, evt *event.Event) { return } - err := sender.Session.MessageReactionAdd(msg.DiscordProtoChannelID(), msg.DiscordID, emojiID) + err := sender.Session.MessageReactionAddUser(portal.GuildID, msg.DiscordProtoChannelID(), msg.DiscordID, emojiID) go portal.sendMessageMetrics(evt, err, "Error sending") if err == nil { dbReaction := portal.bridge.DB.Reaction.New() @@ -2051,7 +2065,7 @@ func (portal *Portal) handleMatrixRedaction(sender *User, evt *event.Event) { var err error // TODO add support for deleting individual attachments from messages if sess != nil { - err = sess.ChannelMessageDelete(message.DiscordProtoChannelID(), message.DiscordID) + err = sess.ChannelMessageDelete(message.DiscordProtoChannelID(), message.DiscordID, portal.RefererOptIfUser(sess, message.ThreadID)...) } else { // TODO pre-validate that the message was sent by the webhook? err = relayClient.WebhookMessageDelete(portal.RelayWebhookID, portal.RelayWebhookSecret, message.DiscordID) @@ -2066,7 +2080,7 @@ func (portal *Portal) handleMatrixRedaction(sender *User, evt *event.Event) { 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) + err := sess.MessageReactionRemoveUser(portal.GuildID, reaction.DiscordProtoChannelID(), reaction.MessageID, reaction.EmojiName, reaction.Sender) go portal.sendMessageMetrics(evt, err, "Error sending") if err == nil { reaction.Delete() @@ -2135,7 +2149,7 @@ func (portal *Portal) HandleMatrixReadReceipt(brUser bridge.User, eventID id.Eve Msg("Dropping read receipt: thread ID mismatch") return } - resp, err := sender.Session.ChannelMessageAckNoToken(msg.DiscordProtoChannelID(), msg.DiscordID) + resp, err := sender.Session.ChannelMessageAckNoToken(msg.DiscordProtoChannelID(), msg.DiscordID, portal.RefererOpt(msg.DiscordProtoChannelID())) if err != nil { log.Err(err).Msg("Failed to send read receipt to Discord") } else if resp.Token != nil { @@ -2169,7 +2183,7 @@ func (portal *Portal) HandleMatrixTyping(newTyping []id.UserID) { user := portal.bridge.GetUserByMXID(userID) if user != nil && user.Session != nil { user.ViewingChannel(portal) - err := user.Session.ChannelTyping(portal.Key.ChannelID) + err := user.Session.ChannelTyping(portal.Key.ChannelID, portal.RefererOptIfUser(user.Session, "")...) if err != nil { portal.log.Warn().Err(err). Str("user_id", user.MXID.String()). diff --git a/thread.go b/thread.go index 5de2410..6e6aa7b 100644 --- a/thread.go +++ b/thread.go @@ -112,6 +112,10 @@ func (thread *Thread) maybeInitialBackfill(source *User) { thread.Parent.forwardBackfillInitial(source, thread) } +func (thread *Thread) RefererOpt() discordgo.RequestOption { + return discordgo.WithThreadReferer(thread.Parent.GuildID, thread.ParentID, thread.ID) +} + func (thread *Thread) Join(user *User) { if user.IsInPortal(thread.ID) { return @@ -137,7 +141,7 @@ func (thread *Thread) Join(user *User) { var err error if user.Session.IsUser { - err = user.Session.ThreadJoinWithLocation(thread.ID, discordgo.ThreadJoinLocationContextMenu) + err = user.Session.ThreadJoin(thread.ID, discordgo.WithLocationParam(discordgo.ThreadJoinLocationContextMenu), thread.RefererOpt()) } else { err = user.Session.ThreadJoin(thread.ID) } From 8b61dc5352c508ce48350fc70a01496429c2c5d1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 29 Nov 2024 19:26:47 +0200 Subject: [PATCH 10/44] config: add support for using a proxy --- attachments.go | 10 +++++----- config/bridge.go | 2 ++ config/upgrade.go | 1 + example-config.yaml | 2 ++ portal.go | 2 +- user.go | 14 ++++++++++++++ 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/attachments.go b/attachments.go index 50d3c0b..befef9e 100644 --- a/attachments.go +++ b/attachments.go @@ -29,7 +29,7 @@ import ( "go.mau.fi/mautrix-discord/database" ) -func downloadDiscordAttachment(url string, maxSize int64) ([]byte, error) { +func downloadDiscordAttachment(cli *http.Client, url string, maxSize int64) ([]byte, error) { req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return nil, err @@ -38,7 +38,7 @@ func downloadDiscordAttachment(url string, maxSize int64) ([]byte, error) { req.Header.Set(key, value) } - resp, err := http.DefaultClient.Do(req) + resp, err := cli.Do(req) if err != nil { return nil, err } @@ -65,7 +65,7 @@ func downloadDiscordAttachment(url string, maxSize int64) ([]byte, error) { } } -func uploadDiscordAttachment(url string, data []byte) error { +func uploadDiscordAttachment(cli *http.Client, url string, data []byte) error { req, err := http.NewRequest(http.MethodPut, url, bytes.NewReader(data)) if err != nil { return err @@ -80,7 +80,7 @@ func uploadDiscordAttachment(url string, data []byte) error { req.Header.Del("X-Discord-Timezone") req.Header.Del("X-Super-Properties") - resp, err := http.DefaultClient.Do(req) + resp, err := cli.Do(req) if err != nil { return err } @@ -301,7 +301,7 @@ func (br *DiscordBridge) copyAttachmentToMatrix(intent *appservice.IntentAPI, ur }() var data []byte - data, onceErr = downloadDiscordAttachment(url, br.MediaConfig.UploadSize) + data, onceErr = downloadDiscordAttachment(http.DefaultClient, url, br.MediaConfig.UploadSize) if onceErr != nil { return } diff --git a/config/bridge.go b/config/bridge.go index dd6ad4e..2f78ed7 100644 --- a/config/bridge.go +++ b/config/bridge.go @@ -57,6 +57,8 @@ type BridgeConfig struct { EnableWebhookAvatars bool `yaml:"enable_webhook_avatars"` UseDiscordCDNUpload bool `yaml:"use_discord_cdn_upload"` + Proxy string `yaml:"proxy"` + CacheMedia string `yaml:"cache_media"` DirectMedia DirectMedia `yaml:"direct_media"` diff --git a/config/upgrade.go b/config/upgrade.go index f84d9ef..041e8e6 100644 --- a/config/upgrade.go +++ b/config/upgrade.go @@ -63,6 +63,7 @@ func DoUpgrade(helper *up.Helper) { helper.Copy(up.Bool, "bridge", "prefix_webhook_messages") helper.Copy(up.Bool, "bridge", "enable_webhook_avatars") helper.Copy(up.Bool, "bridge", "use_discord_cdn_upload") + helper.Copy(up.Str|up.Null, "bridge", "proxy") helper.Copy(up.Str, "bridge", "cache_media") helper.Copy(up.Bool, "bridge", "direct_media", "enabled") helper.Copy(up.Str, "bridge", "direct_media", "server_name") diff --git a/example-config.yaml b/example-config.yaml index 7fca846..54792f9 100644 --- a/example-config.yaml +++ b/example-config.yaml @@ -168,6 +168,8 @@ bridge: # like the official client does? The other option is sending the media in the message send request as a form part # (which is always used by bots and webhooks). use_discord_cdn_upload: true + # Proxy for Discord connections + proxy: # Should mxc uris copied from Discord be cached? # This can be `never` to never cache, `unencrypted` to only cache unencrypted mxc uris, or `always` to cache everything. # If you have a media repo that generates non-unique mxc uris, you should set this to never. diff --git a/portal.go b/portal.go index 2c91156..9a094d3 100644 --- a/portal.go +++ b/portal.go @@ -1647,7 +1647,7 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { } prepared := prep.Attachments[0] att.UploadedFilename = prepared.UploadFilename - err = uploadDiscordAttachment(prepared.UploadURL, data) + err = uploadDiscordAttachment(sender.Session.Client, prepared.UploadURL, data) if err != nil { go portal.sendMessageMetrics(evt, err, "Error reuploading media in") return diff --git a/user.go b/user.go index d3c85e5..63ede61 100644 --- a/user.go +++ b/user.go @@ -2,10 +2,12 @@ package main import ( "context" + "crypto/tls" "errors" "fmt" "math/rand" "net/http" + "net/url" "os" "runtime/debug" "sort" @@ -547,6 +549,18 @@ func (user *User) Connect() error { if err != nil { return err } + if user.bridge.Config.Bridge.Proxy != "" { + u, _ := url.Parse(user.bridge.Config.Bridge.Proxy) + tlsConf := &tls.Config{ + InsecureSkipVerify: os.Getenv("DISCORD_SKIP_TLS_VERIFICATION") == "true", + } + session.Client.Transport = &http.Transport{ + Proxy: http.ProxyURL(u), + TLSClientConfig: tlsConf, + } + session.Dialer.Proxy = http.ProxyURL(u) + session.Dialer.TLSClientConfig = tlsConf + } // TODO move to config if os.Getenv("DISCORD_DEBUG") == "1" { session.LogLevel = discordgo.LogDebug From f2897d9b14dd86a8dc5f192bcd4424419b6bffdc Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 29 Nov 2024 20:14:34 +0200 Subject: [PATCH 11/44] client: load version number dynamically --- attachments.go | 9 ++++----- go.mod | 2 +- go.sum | 4 ++-- user.go | 10 ++++++++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/attachments.go b/attachments.go index befef9e..15efbbd 100644 --- a/attachments.go +++ b/attachments.go @@ -70,15 +70,14 @@ func uploadDiscordAttachment(cli *http.Client, url string, data []byte) error { if err != nil { return err } - for key, value := range discordgo.DroidFetchHeaders { + for key, value := range discordgo.DroidBaseHeaders { req.Header.Set(key, value) } req.Header.Set("Content-Type", "application/octet-stream") req.Header.Set("Referer", "https://discord.com/") - req.Header.Del("X-Debug-Options") - req.Header.Del("X-Discord-Locale") - req.Header.Del("X-Discord-Timezone") - req.Header.Del("X-Super-Properties") + req.Header.Set("Sec-Fetch-Dest", "empty") + req.Header.Set("Sec-Fetch-Mode", "cors") + req.Header.Set("Sec-Fetch-Site", "cross-site") resp, err := cli.Do(req) if err != nil { diff --git a/go.mod b/go.mod index c6e4cee..b2c95a9 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-20241129150404-0ddeff8635e8 +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20241129181343-6f7633fc47bd diff --git a/go.sum b/go.sum index 978f572..4a67e07 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-20241129150404-0ddeff8635e8 h1:pJeDjlzwk6z6XTC1N54QNdAplXlnQ+Er+tO6ogquj0Q= -github.com/beeper/discordgo v0.0.0-20241129150404-0ddeff8635e8/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= +github.com/beeper/discordgo v0.0.0-20241129181343-6f7633fc47bd h1:wq/LmW+im+L5MTCxkIiRW6DYosEDuCoOqx8J7vkGucA= +github.com/beeper/discordgo v0.0.0-20241129181343-6f7633fc47bd/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/user.go b/user.go index 63ede61..426da9d 100644 --- a/user.go +++ b/user.go @@ -555,8 +555,9 @@ func (user *User) Connect() error { InsecureSkipVerify: os.Getenv("DISCORD_SKIP_TLS_VERIFICATION") == "true", } session.Client.Transport = &http.Transport{ - Proxy: http.ProxyURL(u), - TLSClientConfig: tlsConf, + Proxy: http.ProxyURL(u), + TLSClientConfig: tlsConf, + ForceAttemptHTTP2: true, } session.Dialer.Proxy = http.ProxyURL(u) session.Dialer.TLSClientConfig = tlsConf @@ -576,6 +577,11 @@ func (user *User) Connect() error { } session.EventHandler = user.eventHandlerSync + err = session.LoadMainPage(context.TODO()) + if err != nil { + user.log.Warn().Err(err).Msg("Failed to load main page") + } + user.Session = session for { From 5a029367b3ca24247213a0ff8ff2589298bfb8a6 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 29 Nov 2024 20:20:07 +0200 Subject: [PATCH 12/44] dependencies: update --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index b2c95a9..83cb1c1 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.3 require ( github.com/bwmarrin/discordgo v0.27.0 - github.com/gabriel-vasile/mimetype v1.4.3 + github.com/gabriel-vasile/mimetype v1.4.7 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 @@ -14,7 +14,7 @@ require ( github.com/mattn/go-sqlite3 v1.14.24 github.com/rs/zerolog v1.31.0 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.10.0 github.com/yuin/goldmark v1.6.0 go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f @@ -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-20241129181343-6f7633fc47bd +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20241129182205-d6dffc9bf133 diff --git a/go.sum b/go.sum index 4a67e07..71109af 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,13 @@ 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-20241129181343-6f7633fc47bd h1:wq/LmW+im+L5MTCxkIiRW6DYosEDuCoOqx8J7vkGucA= -github.com/beeper/discordgo v0.0.0-20241129181343-6f7633fc47bd/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= +github.com/beeper/discordgo v0.0.0-20241129182205-d6dffc9bf133 h1:vTaMCjc0g0Cexadep0CaDxoJb0S37ZcUl5zTlDJ2adQ= +github.com/beeper/discordgo v0.0.0-20241129182205-d6dffc9bf133/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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= +github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -32,8 +32,8 @@ github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= From 0e59e2da68deb6e0fb0c319cc6000dab90cb2d19 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 16 Dec 2024 16:06:33 +0200 Subject: [PATCH 13/44] dependencies: update --- go.mod | 16 ++++++++-------- go.sum | 27 ++++++++++++++------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 83cb1c1..20f5882 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-discord go 1.22.0 -toolchain go1.23.3 +toolchain go1.23.4 require ( github.com/bwmarrin/discordgo v0.27.0 @@ -17,8 +17,8 @@ require ( github.com/stretchr/testify v1.10.0 github.com/yuin/goldmark v1.6.0 go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb - golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f - golang.org/x/sync v0.9.0 + golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e + golang.org/x/sync v0.10.0 maunium.net/go/maulogger/v2 v2.4.1 maunium.net/go/mautrix v0.16.3-0.20240712164054-e6046fbf432c ) @@ -29,14 +29,14 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/tidwall/gjson v1.17.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect go.mau.fi/zeroconfig v0.1.2 // indirect - golang.org/x/crypto v0.29.0 // indirect - golang.org/x/net v0.31.0 // indirect - golang.org/x/sys v0.27.0 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.32.0 // indirect + golang.org/x/sys v0.28.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index 71109af..c170cd9 100644 --- a/go.sum +++ b/go.sum @@ -35,12 +35,13 @@ github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDq github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM= -github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.6.0 h1:boZcn2GTjpsynOsC0iJHnBWa4Bi0qzfJjthwauItG68= @@ -49,19 +50,19 @@ go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb h1:Is+6vDKgINRy9KHodvi7NElxo go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb/go.mod h1:tiBX6nxVSOjU89jVQ7wBh3P8KjM26Lv1k7/I5QdSvBw= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= -golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= -golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= -golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= -golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= -golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= -golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= -golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= -golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e h1:4qufH0hlUYs6AO6XmZC3GqfDPGSXHVXUFR6OND+iJX4= +golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= +golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= -golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= From 4aad353603455e28e1eff0d5660336a188d80a70 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 16 Dec 2024 16:07:46 +0200 Subject: [PATCH 14/44] Bump version to v0.7.2 --- CHANGELOG.md | 4 ++++ main.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ea9416..8459e87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# v0.7.2 (2024-12-16) + +* Fixed some headers being set incorrectly. + # v0.7.1 (2024-11-16) * Bumped minimum Go version to 1.22. diff --git a/main.go b/main.go index 4017229..5fffb9d 100644 --- a/main.go +++ b/main.go @@ -185,7 +185,7 @@ func main() { Name: "mautrix-discord", URL: "https://github.com/mautrix/discord", Description: "A Matrix-Discord puppeting bridge.", - Version: "0.7.1", + Version: "0.7.2", ProtocolName: "Discord", BeeperServiceName: "discordgo", BeeperNetworkName: "discord", From 4a8e9f5c21d2e5d5865729bc18331eeb7d8e68cd Mon Sep 17 00:00:00 2001 From: mat <27899617+mat-1@users.noreply.github.com> Date: Sat, 8 Feb 2025 18:34:44 -0600 Subject: [PATCH 15/44] portal: fix per-message profiles for guild-specific avatars (#172) --- portal_convert.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/portal_convert.go b/portal_convert.go index 66f93fe..f4ef4cb 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -342,10 +342,10 @@ func (puppet *Puppet) addMemberMeta(part *ConvertedMessage, msg *discordgo.Messa var discordAvatarURL string if msg.Member.Avatar != "" { var err error - avatarURL, discordAvatarURL, err = puppet.bridge.reuploadUserAvatar(puppet.DefaultIntent(), msg.GuildID, msg.Author.ID, msg.Author.Avatar) + avatarURL, discordAvatarURL, err = puppet.bridge.reuploadUserAvatar(puppet.DefaultIntent(), msg.GuildID, msg.Author.ID, msg.Member.Avatar) if err != nil { puppet.log.Warn().Err(err). - Str("avatar_id", msg.Author.Avatar). + Str("avatar_id", msg.Member.Avatar). Msg("Failed to reupload guild user avatar") } } From 65ef2c4ff6780dd1664f216ad47d71fdf461267d Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 19 Dec 2024 22:44:04 +0200 Subject: [PATCH 16/44] portal: add support for no-mention replies --- portal.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/portal.go b/portal.go index 9a094d3..6181eea 100644 --- a/portal.go +++ b/portal.go @@ -13,6 +13,7 @@ import ( "net/http" "reflect" "regexp" + "slices" "strconv" "strings" "sync" @@ -1590,9 +1591,12 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { } } - if replyToMXID := content.RelatesTo.GetNonFallbackReplyTo(); replyToMXID != "" { + replyToMXID := content.RelatesTo.GetNonFallbackReplyTo() + var replyToUser id.UserID + if replyToMXID != "" { replyTo := portal.bridge.DB.Message.GetByMXID(portal.Key, replyToMXID) if replyTo != nil && replyTo.ThreadID == threadID { + replyToUser = replyTo.SenderMXID if isWebhookSend { messageURL := fmt.Sprintf("https://discord.com/channels/%s/%s/%s", portal.GuildID, channelID, replyTo.DiscordID) embed, err := portal.convertReplyMessageToEmbed(replyTo.MXID, messageURL) @@ -1663,10 +1667,22 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { go portal.sendMessageMetrics(evt, fmt.Errorf("%w %q", errUnknownMsgType, content.MsgType), "Ignoring") return } + silentReply := content.Mentions != nil && replyToMXID != "" && + (len(content.Mentions.UserIDs) == 0 || (replyToUser != "" && !slices.Contains(content.Mentions.UserIDs, replyToUser))) + if silentReply && sendReq.AllowedMentions != nil { + sendReq.AllowedMentions.RepliedUser = false + } if !isWebhookSend { // AllowedMentions must not be set for real users, and it's also not that useful for personal bots. // It's only important for relaying, where the webhook may have higher permissions than the user on Matrix. - sendReq.AllowedMentions = nil + if silentReply { + sendReq.AllowedMentions = &discordgo.MessageAllowedMentions{ + Parse: []discordgo.AllowedMentionType{discordgo.AllowedMentionTypeUsers, discordgo.AllowedMentionTypeRoles, discordgo.AllowedMentionTypeEveryone}, + RepliedUser: false, + } + } else { + sendReq.AllowedMentions = nil + } } else if strings.Contains(sendReq.Content, "@everyone") || strings.Contains(sendReq.Content, "@here") { powerLevels, err := portal.MainIntent().PowerLevels(portal.MXID) if err != nil { From b8892ed59fa89b5705d34cb43041e004bb765088 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 22 Feb 2025 19:56:58 +0200 Subject: [PATCH 17/44] dependencies: update --- .github/workflows/go.yml | 4 ++-- go.mod | 16 ++++++++-------- go.sum | 24 ++++++++++++------------ 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index fa170a7..27a602f 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -8,8 +8,8 @@ jobs: strategy: fail-fast: false matrix: - go-version: ["1.22", "1.23"] - name: Lint ${{ matrix.go-version == '1.23' && '(latest)' || '(old)' }} + go-version: ["1.23", "1.24"] + name: Lint ${{ matrix.go-version == '1.24' && '(latest)' || '(old)' }} steps: - uses: actions/checkout@v4 diff --git a/go.mod b/go.mod index 20f5882..03671f1 100644 --- a/go.mod +++ b/go.mod @@ -1,24 +1,24 @@ module go.mau.fi/mautrix-discord -go 1.22.0 +go 1.23.0 -toolchain go1.23.4 +toolchain go1.24.0 require ( github.com/bwmarrin/discordgo v0.27.0 - github.com/gabriel-vasile/mimetype v1.4.7 + github.com/gabriel-vasile/mimetype v1.4.8 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 github.com/lib/pq v1.10.9 github.com/mattn/go-sqlite3 v1.14.24 - github.com/rs/zerolog v1.31.0 + github.com/rs/zerolog v1.33.0 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/stretchr/testify v1.10.0 github.com/yuin/goldmark v1.6.0 go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb - golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e - golang.org/x/sync v0.10.0 + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa + golang.org/x/sync v0.11.0 maunium.net/go/maulogger/v2 v2.4.1 maunium.net/go/mautrix v0.16.3-0.20240712164054-e6046fbf432c ) @@ -35,11 +35,11 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect go.mau.fi/zeroconfig v0.1.2 // indirect golang.org/x/crypto v0.31.0 // indirect - golang.org/x/net v0.32.0 // indirect + golang.org/x/net v0.33.0 // indirect golang.org/x/sys v0.28.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect ) -replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20241129182205-d6dffc9bf133 +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20250222175443-74051f604a97 diff --git a/go.sum b/go.sum index c170cd9..598add8 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,13 @@ 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-20241129182205-d6dffc9bf133 h1:vTaMCjc0g0Cexadep0CaDxoJb0S37ZcUl5zTlDJ2adQ= -github.com/beeper/discordgo v0.0.0-20241129182205-d6dffc9bf133/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= +github.com/beeper/discordgo v0.0.0-20250222175443-74051f604a97 h1:nHlHtg4cPC24Rqq82LWnSGIGZENA/rn0Bj04a8bLtGM= +github.com/beeper/discordgo v0.0.0-20250222175443-74051f604a97/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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.7 h1:SKFKl7kD0RiPdbht0s7hFtjl489WcQ1VyPW8ZzUMYCA= -github.com/gabriel-vasile/mimetype v1.4.7/go.mod h1:GDlAgAyIRT27BhFl53XNAFtfjzOkLaF35JdEG0P7LtU= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -28,8 +28,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= -github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= @@ -52,12 +52,12 @@ go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e h1:4qufH0hlUYs6AO6XmZC3GqfDPGSXHVXUFR6OND+iJX4= -golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= -golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= -golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 31a75d871f404b3d4a111502bb37d3aa73471c04 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 22 Feb 2025 20:04:57 +0200 Subject: [PATCH 18/44] login: add filename when sending QR image --- commands.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/commands.go b/commands.go index 060a4ab..88b737c 100644 --- a/commands.go +++ b/commands.go @@ -239,9 +239,10 @@ func sendQRCode(ce *WrappedCommandEvent, code string) id.EventID { } content := event.MessageEventContent{ - MsgType: event.MsgImage, - Body: code, - URL: url.CUString(), + MsgType: event.MsgImage, + Body: code, + FileName: "qr.png", + URL: url.CUString(), } resp, err := ce.Bot.SendMessageEvent(ce.RoomID, event.EventMessage, &content) From 4d67dbcd00e8fc164121ab7471f1367cf4e9b2e1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 22 Feb 2025 20:05:08 +0200 Subject: [PATCH 19/44] client: only load main page for users --- user.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/user.go b/user.go index 426da9d..86d86a4 100644 --- a/user.go +++ b/user.go @@ -577,9 +577,11 @@ func (user *User) Connect() error { } session.EventHandler = user.eventHandlerSync - err = session.LoadMainPage(context.TODO()) - if err != nil { - user.log.Warn().Err(err).Msg("Failed to load main page") + if session.IsUser { + err = session.LoadMainPage(context.TODO()) + if err != nil { + user.log.Warn().Err(err).Msg("Failed to load main page") + } } user.Session = session From 9605992758768fab334d1b0850ecb84d4e5b4443 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 20 Mar 2025 16:21:34 +0200 Subject: [PATCH 20/44] portal: add id field for per-message profiles Closes #176 --- portal_convert.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/portal_convert.go b/portal_convert.go index f4ef4cb..8d7cb99 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -18,6 +18,8 @@ package main import ( "context" + "crypto/sha256" + "encoding/hex" "fmt" "html" "strconv" @@ -357,8 +359,7 @@ func (puppet *Puppet) addMemberMeta(part *ConvertedMessage, msg *discordgo.Messa } if msg.Member.Nick != "" || !avatarURL.IsEmpty() { perMessageProfile := map[string]any{ - "is_multiple_users": false, - + "id": fmt.Sprintf("%s_%s", msg.GuildID, msg.Author.ID), "displayname": msg.Member.Nick, "avatar_url": avatarURL.String(), } @@ -396,9 +397,9 @@ func (puppet *Puppet) addWebhookMeta(part *ConvertedMessage, msg *discordgo.Mess "avatar_url": msg.Author.AvatarURL(""), "avatar_mxc": avatarURL.String(), } + profileID := sha256.Sum256(fmt.Appendf(nil, "%s:%s", msg.Author.Username, msg.Author.Avatar)) part.Extra["com.beeper.per_message_profile"] = map[string]any{ - "is_multiple_users": true, - + "id": hex.EncodeToString(profileID[:]), "avatar_url": avatarURL.String(), "displayname": msg.Author.Username, } From 5854ad0c14492f36f411a0d1a1972c13c5617e37 Mon Sep 17 00:00:00 2001 From: ginnyTheCat Date: Thu, 20 Mar 2025 15:22:37 +0100 Subject: [PATCH 21/44] portal: fix typo in msc1767 field name (#177) --- portal_convert.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portal_convert.go b/portal_convert.go index 8d7cb99..cb4dc7b 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -167,7 +167,7 @@ func (portal *Portal) convertDiscordAttachment(ctx context.Context, intent *apps if att.Waveform != nil { // TODO convert waveform extra = map[string]any{ - "org.matrix.1767.audio": map[string]any{ + "org.matrix.msc1767.audio": map[string]any{ "duration": int(att.DurationSeconds * 1000), }, "org.matrix.msc3245.voice": map[string]any{}, From 84e56c73fac2fd1304d5dcc05427d5ddd4ce8407 Mon Sep 17 00:00:00 2001 From: batuhan Date: Thu, 20 Mar 2025 15:23:00 +0100 Subject: [PATCH 22/44] portal: add `com.beeper.room_type.v2` to `m.bridge` events (#178) --- portal.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/portal.go b/portal.go index 6181eea..4a45a63 100644 --- a/portal.go +++ b/portal.go @@ -301,7 +301,8 @@ func (portal *Portal) MainIntent() *appservice.IntentAPI { type CustomBridgeInfoContent struct { event.BridgeEventContent - RoomType string `json:"com.beeper.room_type,omitempty"` + RoomType string `json:"com.beeper.room_type,omitempty"` + RoomTypeV2 string `json:"com.beeper.room_type.v2,omitempty"` } func init() { @@ -344,7 +345,14 @@ func (portal *Portal) getBridgeInfo() (string, CustomBridgeInfoContent) { if portal.Type == discordgo.ChannelTypeDM || portal.Type == discordgo.ChannelTypeGroupDM { roomType = "dm" } - return bridgeInfoStateKey, CustomBridgeInfoContent{bridgeInfo, roomType} + var roomTypeV2 string + if portal.Type == discordgo.ChannelTypeDM { + roomTypeV2 = "dm" + } else if portal.Type == discordgo.ChannelTypeGroupDM { + roomTypeV2 = "group_dm" + } + + return bridgeInfoStateKey, CustomBridgeInfoContent{bridgeInfo, roomType, roomTypeV2} } func (portal *Portal) UpdateBridgeInfo() { From ef093b129fcf1267009af3d2a00fc2b28773539e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 20 Mar 2025 17:43:03 +0200 Subject: [PATCH 23/44] dependencies: update discordgo --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 03671f1..fb2f851 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-discord go 1.23.0 -toolchain go1.24.0 +toolchain go1.24.1 require ( github.com/bwmarrin/discordgo v0.27.0 @@ -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-20250222175443-74051f604a97 +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20250320154217-0d7f942e6b38 diff --git a/go.sum b/go.sum index 598add8..fe3a114 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-20250222175443-74051f604a97 h1:nHlHtg4cPC24Rqq82LWnSGIGZENA/rn0Bj04a8bLtGM= -github.com/beeper/discordgo v0.0.0-20250222175443-74051f604a97/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= +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/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= From d37b5028e13210ccf122df18dee0492b0027d7cf Mon Sep 17 00:00:00 2001 From: Ping Chen Date: Wed, 9 Apr 2025 20:37:25 +0900 Subject: [PATCH 24/44] portal: fix isPlainGifMessage to get link preview working (#179) --- portal_convert.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portal_convert.go b/portal_convert.go index cb4dc7b..62621ba 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -634,7 +634,7 @@ func isPlainGifMessage(msg *discordgo.Message) bool { } embed := msg.Embeds[0] isGifVideo := embed.Type == discordgo.EmbedTypeGifv && embed.Video != nil - isGifImage := embed.Type == discordgo.EmbedTypeImage && embed.Image == nil && embed.Thumbnail != nil + isGifImage := embed.Type == discordgo.EmbedTypeImage && embed.Image == nil && embed.Thumbnail != nil && embed.Title == "" contentIsOnlyURL := msg.Content == embed.URL || discordLinkRegexFull.MatchString(msg.Content) return contentIsOnlyURL && (isGifVideo || isGifImage) } From 001c88c400df3fe8969f8395c7268f7b4137327e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 16 Apr 2025 12:42:15 +0300 Subject: [PATCH 25/44] Bump version to v0.7.3 --- CHANGELOG.md | 16 ++++++++++++++++ go.mod | 18 +++++++++--------- go.sum | 34 +++++++++++++++++----------------- main.go | 2 +- 4 files changed, 43 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8459e87..7f4a8df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# v0.7.3 (2025-04-16) + +* Added support for sending no-mention replies from Matrix + (uses intentional mentions and requires client support). +* Added file name to QR image message when logging in to fix rendering in dumb + clients that validate the file extension. +* Added `id` field to per-message profiles to match [MSC4144]. +* Fixed guild avatars in per-message profiles (thanks to [@mat-1] in [#172]). +* Fixed typo in MSC1767 field name in voice messages (thanks to [@ginnyTheCat] in [#177]). + +[@mat-1]: https://github.com/mat-1 +[@ginnyTheCat]: https://github.com/ginnyTheCat +[#172]: https://github.com/mautrix/discord/pull/172 +[#177]: https://github.com/mautrix/discord/pull/177 +[MSC4144]: https://github.com/matrix-org/matrix-spec-proposals/pull/4144 + # v0.7.2 (2024-12-16) * Fixed some headers being set incorrectly. diff --git a/go.mod b/go.mod index fb2f851..22d12bb 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-discord go 1.23.0 -toolchain go1.24.1 +toolchain go1.24.2 require ( github.com/bwmarrin/discordgo v0.27.0 @@ -11,14 +11,14 @@ require ( github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 github.com/lib/pq v1.10.9 - github.com/mattn/go-sqlite3 v1.14.24 - github.com/rs/zerolog v1.33.0 + github.com/mattn/go-sqlite3 v1.14.27 + github.com/rs/zerolog v1.34.0 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/stretchr/testify v1.10.0 - github.com/yuin/goldmark v1.6.0 + github.com/yuin/goldmark v1.7.10 go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb - golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa - golang.org/x/sync v0.11.0 + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 + golang.org/x/sync v0.13.0 maunium.net/go/maulogger/v2 v2.4.1 maunium.net/go/mautrix v0.16.3-0.20240712164054-e6046fbf432c ) @@ -34,9 +34,9 @@ require ( github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect go.mau.fi/zeroconfig v0.1.2 // indirect - golang.org/x/crypto v0.31.0 // indirect - golang.org/x/net v0.33.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/net v0.39.0 // indirect + golang.org/x/sys v0.32.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index fe3a114..da2ece7 100644 --- a/go.sum +++ b/go.sum @@ -22,14 +22,14 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= -github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.27 h1:drZCnuvf37yPfs95E5jd9s3XhdVWLal+6BOK6qrv6IU= +github.com/mattn/go-sqlite3 v1.14.27/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= -github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= @@ -44,25 +44,25 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/yuin/goldmark v1.6.0 h1:boZcn2GTjpsynOsC0iJHnBWa4Bi0qzfJjthwauItG68= -github.com/yuin/goldmark v1.6.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.10 h1:S+LrtBjRmqMac2UdtB6yyCEJm+UILZ2fefI4p7o0QpI= +github.com/yuin/goldmark v1.7.10/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb h1:Is+6vDKgINRy9KHodvi7NElxoDaWA8sc2S3cF3+QWjs= go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb/go.mod h1:tiBX6nxVSOjU89jVQ7wBh3P8KjM26Lv1k7/I5QdSvBw= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= -golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= diff --git a/main.go b/main.go index 5fffb9d..e3700ad 100644 --- a/main.go +++ b/main.go @@ -185,7 +185,7 @@ func main() { Name: "mautrix-discord", URL: "https://github.com/mautrix/discord", Description: "A Matrix-Discord puppeting bridge.", - Version: "0.7.2", + Version: "0.7.3", ProtocolName: "Discord", BeeperServiceName: "discordgo", BeeperNetworkName: "discord", From ccc6c77911d3ca7e8f34d03bb29ad4403a8ffbfc Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 3 May 2025 22:13:06 +0300 Subject: [PATCH 26/44] Update mautrix-go to enable MSC4190. Closes #181 --- config/upgrade.go | 1 + example-config.yaml | 6 ++++++ go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/config/upgrade.go b/config/upgrade.go index 041e8e6..1c9fe56 100644 --- a/config/upgrade.go +++ b/config/upgrade.go @@ -99,6 +99,7 @@ func DoUpgrade(helper *up.Helper) { helper.Copy(up.Bool, "bridge", "encryption", "default") helper.Copy(up.Bool, "bridge", "encryption", "require") helper.Copy(up.Bool, "bridge", "encryption", "appservice") + helper.Copy(up.Bool, "bridge", "encryption", "msc4190") helper.Copy(up.Bool, "bridge", "encryption", "allow_key_sharing") helper.Copy(up.Bool, "bridge", "encryption", "plaintext_mentions") helper.Copy(up.Bool, "bridge", "encryption", "delete_keys", "delete_outbound_on_ack") diff --git a/example-config.yaml b/example-config.yaml index 54792f9..9530a2b 100644 --- a/example-config.yaml +++ b/example-config.yaml @@ -266,7 +266,13 @@ bridge: # This will cause the bridge bot to be in private chats for the encryption to work properly. default: false # Whether to use MSC2409/MSC3202 instead of /sync long polling for receiving encryption-related data. + # Changing this option requires updating the appservice registration file. appservice: false + # Whether to use MSC4190 instead of appservice login to create the bridge bot device. + # Requires the homeserver to support MSC4190 and the device masquerading parts of MSC3202. + # Only relevant when using end-to-bridge encryption, required when using encryption with next-gen auth (MSC3861). + # Changing this option requires updating the appservice registration file. + msc4190: false # Require encryption, drop any unencrypted messages. require: false # Enable key sharing? If enabled, key requests for rooms where users are in will be fulfilled. diff --git a/go.mod b/go.mod index 22d12bb..e60ea04 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 golang.org/x/sync v0.13.0 maunium.net/go/maulogger/v2 v2.4.1 - maunium.net/go/mautrix v0.16.3-0.20240712164054-e6046fbf432c + maunium.net/go/mautrix v0.16.3-0.20250503191143-e173d97939b4 ) require ( diff --git a/go.sum b/go.sum index da2ece7..3fe5ff8 100644 --- a/go.sum +++ b/go.sum @@ -73,5 +73,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.4.1 h1:N7zSdd0mZkB2m2JtFUsiGTQQAdP0YeFWT7YMc80yAL8= maunium.net/go/maulogger/v2 v2.4.1/go.mod h1:omPuYwYBILeVQobz8uO3XC8DIRuEb5rXYlQSuqrbCho= -maunium.net/go/mautrix v0.16.3-0.20240712164054-e6046fbf432c h1:LHjqti3fFzrC8LXkkxxKYlLbuI/CJcwa2JN4Ppg2GK0= -maunium.net/go/mautrix v0.16.3-0.20240712164054-e6046fbf432c/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= +maunium.net/go/mautrix v0.16.3-0.20250503191143-e173d97939b4 h1:54y/T8ukHgmQsaSYoRWwhxLAijVVyLbOsTsglyjZ7Ro= +maunium.net/go/mautrix v0.16.3-0.20250503191143-e173d97939b4/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= From d69e4e98813a4bf53211a47178f2c894362e7217 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 8 Jun 2025 00:15:45 +0300 Subject: [PATCH 27/44] Update mautrix-go to rename cross-room reply field --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e60ea04..2b779b3 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 golang.org/x/sync v0.13.0 maunium.net/go/maulogger/v2 v2.4.1 - maunium.net/go/mautrix v0.16.3-0.20250503191143-e173d97939b4 + maunium.net/go/mautrix v0.16.3-0.20250607210618-e8c453870ba1 ) require ( diff --git a/go.sum b/go.sum index 3fe5ff8..a81124d 100644 --- a/go.sum +++ b/go.sum @@ -73,5 +73,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.4.1 h1:N7zSdd0mZkB2m2JtFUsiGTQQAdP0YeFWT7YMc80yAL8= maunium.net/go/maulogger/v2 v2.4.1/go.mod h1:omPuYwYBILeVQobz8uO3XC8DIRuEb5rXYlQSuqrbCho= -maunium.net/go/mautrix v0.16.3-0.20250503191143-e173d97939b4 h1:54y/T8ukHgmQsaSYoRWwhxLAijVVyLbOsTsglyjZ7Ro= -maunium.net/go/mautrix v0.16.3-0.20250503191143-e173d97939b4/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= +maunium.net/go/mautrix v0.16.3-0.20250607210618-e8c453870ba1 h1:ygjIlb7rEvHb8rzlGSNpXADAnUZV+zp4SS32DLozDU0= +maunium.net/go/mautrix v0.16.3-0.20250607210618-e8c453870ba1/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= From a6fca7ce4378d3b9761a175b6398ba51563f5720 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 8 Jun 2025 00:24:19 +0300 Subject: [PATCH 28/44] Add channel is bridgeable check to channel update handler --- user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user.go b/user.go index 86d86a4..29653aa 100644 --- a/user.go +++ b/user.go @@ -1153,7 +1153,7 @@ func (user *User) channelUpdateHandler(c *discordgo.ChannelUpdate) { portal := user.GetPortalByMeta(c.Channel) if c.GuildID == "" { user.handlePrivateChannel(portal, c.Channel, time.Now(), true, user.IsInSpace(portal.Key.String())) - } else { + } else if user.channelIsBridgeable(c.Channel) { portal.UpdateInfo(user, c.Channel) } } From dc4538aab6d33543d552950b03c7fcb82e1d528a Mon Sep 17 00:00:00 2001 From: LeaPhant Date: Sat, 7 Jun 2025 23:27:29 +0200 Subject: [PATCH 29/44] Add support for MSC4193 media spoilers (#189) --- portal.go | 4 ++++ portal_convert.go | 17 ++++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/portal.go b/portal.go index 4a45a63..94a2cf7 100644 --- a/portal.go +++ b/portal.go @@ -1639,6 +1639,10 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { sendReq.Content, sendReq.AllowedMentions = portal.parseMatrixHTML(content) } + if evt.Content.Raw["page.codeberg.everypizza.msc4193.spoiler"] == true { + filename = "SPOILER_" + filename + } + if portal.bridge.Config.Bridge.UseDiscordCDNUpload && !isWebhookSend && sess.IsUser { att := &discordgo.MessageAttachment{ ID: "0", diff --git a/portal_convert.go b/portal_convert.go index 62621ba..02218bd 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -154,24 +154,27 @@ func (portal *Portal) convertDiscordAttachment(ctx context.Context, intent *apps Size: att.Size, }, } + + var extra = make(map[string]any) + + if strings.HasPrefix(att.Filename, "SPOILER_") { + extra["page.codeberg.everypizza.msc4193.spoiler"] = true + } + if att.Description != "" { content.Body = att.Description content.FileName = att.Filename } - var extra map[string]any - switch strings.ToLower(strings.Split(att.ContentType, "/")[0]) { case "audio": content.MsgType = event.MsgAudio if att.Waveform != nil { // TODO convert waveform - extra = map[string]any{ - "org.matrix.msc1767.audio": map[string]any{ - "duration": int(att.DurationSeconds * 1000), - }, - "org.matrix.msc3245.voice": map[string]any{}, + extra["org.matrix.msc1767.audio"] = map[string]any{ + "duration": int(att.DurationSeconds * 1000), } + extra["org.matrix.msc3245.voice"] = map[string]any{} } case "image": content.MsgType = event.MsgImage From 9fd89cdfc568d9d1e3aa7135a2b8dee928992c31 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 8 Jun 2025 00:49:16 +0300 Subject: [PATCH 30/44] Add support for forwarded messages Fixes #170 Closes #182 --- formatter.go | 8 ++++++-- go.mod | 2 +- go.sum | 4 ++-- portal_convert.go | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 5 deletions(-) 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 { From 847d4cb98e64ad1712afb621a008b3afeafa9cb8 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 8 Jun 2025 00:57:57 +0300 Subject: [PATCH 31/44] Update Docker image to Alpine 3.22 Closes #183 --- Dockerfile | 6 +++--- Dockerfile.ci | 4 ++-- Dockerfile.dev | 18 ------------------ 3 files changed, 5 insertions(+), 23 deletions(-) delete mode 100644 Dockerfile.dev diff --git a/Dockerfile b/Dockerfile index 1287e60..4913b13 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM dock.mau.dev/tulir/lottieconverter:alpine-3.18 AS lottie +FROM dock.mau.dev/tulir/lottieconverter:alpine-3.22 AS lottie -FROM golang:1-alpine3.18 AS builder +FROM golang:1-alpine3.22 AS builder RUN apk add --no-cache git ca-certificates build-base su-exec olm-dev @@ -8,7 +8,7 @@ COPY . /build WORKDIR /build RUN go build -o /usr/bin/mautrix-discord -FROM alpine:3.18 +FROM alpine:3.22 ENV UID=1337 \ GID=1337 diff --git a/Dockerfile.ci b/Dockerfile.ci index 0237eec..9e6d845 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -1,6 +1,6 @@ -FROM dock.mau.dev/tulir/lottieconverter:alpine-3.18 AS lottie +FROM dock.mau.dev/tulir/lottieconverter:alpine-3.22 AS lottie -FROM alpine:3.18 +FROM alpine:3.22 ENV UID=1337 \ GID=1337 diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index 11901df..0000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,18 +0,0 @@ -FROM dock.mau.dev/tulir/lottieconverter:alpine-3.18 AS lottie - -FROM golang:1-alpine3.18 AS builder - -RUN apk add --no-cache git ca-certificates build-base su-exec olm-dev bash jq yq curl \ - zlib libpng giflib libstdc++ libgcc - -COPY --from=lottie /usr/lib/librlottie.so* /usr/lib/ -COPY --from=lottie /usr/local/bin/lottieconverter /usr/local/bin/lottieconverter -COPY . /build -WORKDIR /build -RUN go build -o /usr/bin/mautrix-discord - -# Setup development stack using gow -RUN go install github.com/mitranim/gow@latest -RUN echo 'gow run /build $@' > /usr/bin/mautrix-discord \ - && chmod +x /usr/bin/mautrix-discord -VOLUME /data From 30c2cd94a7876abda2159985372971e1b009bd4f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 16 Jun 2025 18:53:05 +0300 Subject: [PATCH 32/44] Bump version to v0.7.4 --- CHANGELOG.md | 12 ++++++++++++ go.mod | 16 ++++++++-------- go.sum | 28 ++++++++++++++-------------- main.go | 2 +- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f4a8df..730123d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# v0.7.4 (2025-06-16) + +* Added support for forwarded messages +* Added support for [MSC4193] media spoilers (thanks to [@LeaPhant] in [#189]). +* Added support for [MSC4190] for MAS-compatible encryption. +* Updated Docker image to Alpine 3.22 + +[MSC4193]: https://github.com/matrix-org/matrix-spec-proposals/pull/4193 +[MSC4190]: https://github.com/matrix-org/matrix-spec-proposals/pull/4190 +[@LeaPhant]: https://github.com/mautrix/discord/pull/189 +[#189]: https://github.com/mautrix/discord/pull/189 + # v0.7.3 (2025-04-16) * Added support for sending no-mention replies from Matrix diff --git a/go.mod b/go.mod index 7d67d1b..40e59ce 100644 --- a/go.mod +++ b/go.mod @@ -2,23 +2,23 @@ module go.mau.fi/mautrix-discord go 1.23.0 -toolchain go1.24.2 +toolchain go1.24.4 require ( github.com/bwmarrin/discordgo v0.27.0 - github.com/gabriel-vasile/mimetype v1.4.8 + github.com/gabriel-vasile/mimetype v1.4.9 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/gorilla/mux v1.8.0 github.com/gorilla/websocket v1.5.0 github.com/lib/pq v1.10.9 - github.com/mattn/go-sqlite3 v1.14.27 + github.com/mattn/go-sqlite3 v1.14.28 github.com/rs/zerolog v1.34.0 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/stretchr/testify v1.10.0 - github.com/yuin/goldmark v1.7.10 + github.com/yuin/goldmark v1.7.12 go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 - golang.org/x/sync v0.13.0 + golang.org/x/sync v0.15.0 maunium.net/go/maulogger/v2 v2.4.1 maunium.net/go/mautrix v0.16.3-0.20250607210618-e8c453870ba1 ) @@ -34,9 +34,9 @@ require ( github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect go.mau.fi/zeroconfig v0.1.2 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/sys v0.32.0 // indirect + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/net v0.41.0 // indirect + golang.org/x/sys v0.33.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index c24d7f4..4776e23 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8 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= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= -github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY= +github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -22,8 +22,8 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-sqlite3 v1.14.27 h1:drZCnuvf37yPfs95E5jd9s3XhdVWLal+6BOK6qrv6IU= -github.com/mattn/go-sqlite3 v1.14.27/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= +github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -44,25 +44,25 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/yuin/goldmark v1.7.10 h1:S+LrtBjRmqMac2UdtB6yyCEJm+UILZ2fefI4p7o0QpI= -github.com/yuin/goldmark v1.7.10/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/yuin/goldmark v1.7.12 h1:YwGP/rrea2/CnCtUHgjuolG/PnMxdQtPMO5PvaE2/nY= +github.com/yuin/goldmark v1.7.12/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb h1:Is+6vDKgINRy9KHodvi7NElxoDaWA8sc2S3cF3+QWjs= go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb/go.mod h1:tiBX6nxVSOjU89jVQ7wBh3P8KjM26Lv1k7/I5QdSvBw= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= -golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= diff --git a/main.go b/main.go index e3700ad..e364509 100644 --- a/main.go +++ b/main.go @@ -185,7 +185,7 @@ func main() { Name: "mautrix-discord", URL: "https://github.com/mautrix/discord", Description: "A Matrix-Discord puppeting bridge.", - Version: "0.7.3", + Version: "0.7.4", ProtocolName: "Discord", BeeperServiceName: "discordgo", BeeperNetworkName: "discord", From e2151defc6d3d91f0b6ccc5c4410134386123460 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 29 Jun 2025 19:15:00 +0300 Subject: [PATCH 33/44] Update mautrix-go to fix federation key response [skip cd] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 40e59ce..cd2f53c 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 golang.org/x/sync v0.15.0 maunium.net/go/maulogger/v2 v2.4.1 - maunium.net/go/mautrix v0.16.3-0.20250607210618-e8c453870ba1 + maunium.net/go/mautrix v0.16.3-0.20250629161415-a29d782e6638 ) require ( diff --git a/go.sum b/go.sum index 4776e23..453e647 100644 --- a/go.sum +++ b/go.sum @@ -73,5 +73,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.4.1 h1:N7zSdd0mZkB2m2JtFUsiGTQQAdP0YeFWT7YMc80yAL8= maunium.net/go/maulogger/v2 v2.4.1/go.mod h1:omPuYwYBILeVQobz8uO3XC8DIRuEb5rXYlQSuqrbCho= -maunium.net/go/mautrix v0.16.3-0.20250607210618-e8c453870ba1 h1:ygjIlb7rEvHb8rzlGSNpXADAnUZV+zp4SS32DLozDU0= -maunium.net/go/mautrix v0.16.3-0.20250607210618-e8c453870ba1/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= +maunium.net/go/mautrix v0.16.3-0.20250629161415-a29d782e6638 h1:tZEmq1FBuueW6cmxoa2BkXYbfMknW8XPPMiZfD5PKto= +maunium.net/go/mautrix v0.16.3-0.20250629161415-a29d782e6638/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= From d4e72893150a8ccc1a29cf5af674209ab424774b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 1 Jul 2025 00:59:17 +0300 Subject: [PATCH 34/44] Update prefix_webhook_messages option to use MSC4144 fallbacks --- example-config.yaml | 9 ++++++--- portal_convert.go | 22 +++++++++++++--------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/example-config.yaml b/example-config.yaml index 9530a2b..ea392bb 100644 --- a/example-config.yaml +++ b/example-config.yaml @@ -91,7 +91,7 @@ bridge: # .System - Whether the user is an official system user # .Webhook - Whether the user is a webhook and is not an application # .Application - Whether the user is an application - displayname_template: '{{or .GlobalName .Username}}{{if .Bot}} (bot){{end}}' + displayname_template: '{{if .Webhook}}Webhook{{else}}{{or .GlobalName .Username}}{{if .Bot}} (bot){{end}}{{end}}' # Displayname template for Discord channels (bridged as rooms, or spaces when type=4). # Available variables: # .Name - Channel name, or user displayname (pre-formatted with displayname_template) in DMs. @@ -161,9 +161,12 @@ bridge: federate_rooms: true # Prefix messages from webhooks with the profile info? This can be used along with a custom displayname_template # to better handle webhooks that change their name all the time (like ones used by bridges). - prefix_webhook_messages: false + # + # This will use the fallback mode in MSC4144, which means clients that support MSC4144 will not show the prefix + # (and will instead show the name and avatar as the message sender). + prefix_webhook_messages: true # Bridge webhook avatars? - enable_webhook_avatars: true + enable_webhook_avatars: false # Should the bridge upload media to the Discord CDN directly before sending the message when using a user token, # like the official client does? The other option is sending the media in the message send request as a form part # (which is always used by bots and webhooks). diff --git a/portal_convert.go b/portal_convert.go index 26df0a5..6823e2c 100644 --- a/portal_convert.go +++ b/portal_convert.go @@ -403,10 +403,20 @@ func (puppet *Puppet) addWebhookMeta(part *ConvertedMessage, msg *discordgo.Mess "avatar_mxc": avatarURL.String(), } profileID := sha256.Sum256(fmt.Appendf(nil, "%s:%s", msg.Author.Username, msg.Author.Avatar)) + hasFallback := false + if msg.ApplicationID == "" && + puppet.bridge.Config.Bridge.PrefixWebhookMessages && + (part.Content.MsgType == event.MsgText || part.Content.MsgType == event.MsgNotice || (part.Content.FileName != "" && part.Content.FileName != part.Content.Body)) { + part.Content.EnsureHasHTML() + part.Content.Body = fmt.Sprintf("%s: %s", msg.Author.Username, part.Content.Body) + part.Content.FormattedBody = fmt.Sprintf("%s: %s", html.EscapeString(msg.Author.Username), part.Content.FormattedBody) + hasFallback = true + } part.Extra["com.beeper.per_message_profile"] = map[string]any{ - "id": hex.EncodeToString(profileID[:]), - "avatar_url": avatarURL.String(), - "displayname": msg.Author.Username, + "id": hex.EncodeToString(profileID[:]), + "avatar_url": avatarURL.String(), + "displayname": msg.Author.Username, + "has_fallback": hasFallback, } } @@ -765,11 +775,5 @@ func (portal *Portal) convertDiscordTextMessage(ctx context.Context, intent *app "com.beeper.linkpreviews": previews, } - if msg.WebhookID != "" && msg.ApplicationID == "" && portal.bridge.Config.Bridge.PrefixWebhookMessages { - content.EnsureHasHTML() - content.Body = fmt.Sprintf("%s: %s", msg.Author.Username, content.Body) - content.FormattedBody = fmt.Sprintf("%s: %s", html.EscapeString(msg.Author.Username), content.FormattedBody) - } - return &ConvertedMessage{Type: event.EventMessage, Content: &content, Extra: extraContent} } From 111824486b291ab3a8dabdf2a01909dfe357bd25 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 15 Jul 2025 14:19:16 +0300 Subject: [PATCH 35/44] Hardcode v11 for new rooms Upcoming breaking changes in room v12 prevent safely using the default room version and security embargoes prevent fixing them ahead of time. --- guildportal.go | 1 + portal.go | 1 + user.go | 1 + 3 files changed, 3 insertions(+) diff --git a/guildportal.go b/guildportal.go index 8230361..d7be670 100644 --- a/guildportal.go +++ b/guildportal.go @@ -205,6 +205,7 @@ func (guild *Guild) CreateMatrixRoom(user *User, meta *discordgo.Guild) error { Preset: "private_chat", InitialState: initialState, CreationContent: creationContent, + RoomVersion: "11", }) if err != nil { guild.log.Warnln("Failed to create room:", err) diff --git a/portal.go b/portal.go index 94a2cf7..bb4af98 100644 --- a/portal.go +++ b/portal.go @@ -489,6 +489,7 @@ func (portal *Portal) CreateMatrixRoom(user *User, channel *discordgo.Channel) e IsDirect: portal.IsPrivateChat(), InitialState: initialState, CreationContent: creationContent, + RoomVersion: "11", } if !portal.shouldSetDMRoomMetadata() && !portal.FriendNick { req.Name = "" diff --git a/user.go b/user.go index 29653aa..f209b33 100644 --- a/user.go +++ b/user.go @@ -344,6 +344,7 @@ func (user *User) getSpaceRoom(ptr *id.RoomID, name, topic string, parent id.Roo user.MXID: 50, }, }, + RoomVersion: "11", }) if err != nil { From 40a699215142849f763dc7329c3f66f3ed3f4737 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 16 Jul 2025 11:45:58 +0300 Subject: [PATCH 36/44] Bump version to v0.7.5 --- CHANGELOG.md | 8 ++++++++ go.mod | 12 ++++++------ go.sum | 20 ++++++++++---------- main.go | 2 +- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 730123d..6f53a95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# v0.7.5 (2025-07-16) + +* Fixed federation key response when using direct media. +* Changed `prefix_webhook_messages` option to generate [MSC4144] fallbacks, + so that any compatible clients will hide the prefix. +* Changed new room creation to hardcode room v11 to avoid v12 rooms being + created before proper support for them can be added. + # v0.7.4 (2025-06-16) * Added support for forwarded messages diff --git a/go.mod b/go.mod index cd2f53c..8a2d827 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module go.mau.fi/mautrix-discord go 1.23.0 -toolchain go1.24.4 +toolchain go1.24.5 require ( github.com/bwmarrin/discordgo v0.27.0 @@ -17,8 +17,8 @@ require ( github.com/stretchr/testify v1.10.0 github.com/yuin/goldmark v1.7.12 go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb - golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 - golang.org/x/sync v0.15.0 + golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc + golang.org/x/sync v0.16.0 maunium.net/go/maulogger/v2 v2.4.1 maunium.net/go/mautrix v0.16.3-0.20250629161415-a29d782e6638 ) @@ -34,9 +34,9 @@ require ( github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect go.mau.fi/zeroconfig v0.1.2 // indirect - golang.org/x/crypto v0.39.0 // indirect - golang.org/x/net v0.41.0 // indirect - golang.org/x/sys v0.33.0 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sys v0.34.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect maunium.net/go/mauflag v1.0.0 // indirect diff --git a/go.sum b/go.sum index 453e647..82d49bb 100644 --- a/go.sum +++ b/go.sum @@ -50,19 +50,19 @@ go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb h1:Is+6vDKgINRy9KHodvi7NElxo go.mau.fi/util v0.2.2-0.20231228160422-22fdd4bbddeb/go.mod h1:tiBX6nxVSOjU89jVQ7wBh3P8KjM26Lv1k7/I5QdSvBw= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= -golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= -golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= -golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc h1:TS73t7x3KarrNd5qAipmspBDS1rkMcgVG/fS1aRb4Rc= +golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= diff --git a/main.go b/main.go index e364509..8986507 100644 --- a/main.go +++ b/main.go @@ -185,7 +185,7 @@ func main() { Name: "mautrix-discord", URL: "https://github.com/mautrix/discord", Description: "A Matrix-Discord puppeting bridge.", - Version: "0.7.4", + Version: "0.7.5", ProtocolName: "Discord", BeeperServiceName: "discordgo", BeeperNetworkName: "discord", From 3f7622be191732eb2db97aa2369627241616d742 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 17 Jul 2025 00:31:43 +0300 Subject: [PATCH 37/44] Add support for following tombstones --- main.go | 2 ++ portal.go | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/main.go b/main.go index 8986507..5b6f635 100644 --- a/main.go +++ b/main.go @@ -26,6 +26,7 @@ import ( "golang.org/x/sync/semaphore" "maunium.net/go/mautrix/bridge" "maunium.net/go/mautrix/bridge/commands" + "maunium.net/go/mautrix/event" "maunium.net/go/mautrix/id" "go.mau.fi/mautrix-discord/config" @@ -95,6 +96,7 @@ func (br *DiscordBridge) GetConfigPtr() interface{} { func (br *DiscordBridge) Init() { br.CommandProcessor = commands.NewProcessor(&br.Bridge) br.RegisterCommands() + br.EventProcessor.On(event.StateTombstone, br.HandleTombstone) matrixHTMLParser.PillConverter = br.pillConverter diff --git a/portal.go b/portal.go index bb4af98..926bd0c 100644 --- a/portal.go +++ b/portal.go @@ -2535,3 +2535,74 @@ func (portal *Portal) UpdateInfo(source *User, meta *discordgo.Channel) *discord } return meta } + +func (br *DiscordBridge) HandleTombstone(evt *event.Event) { + if evt.StateKey == nil || *evt.StateKey != "" { + return + } + content, ok := evt.Content.Parsed.(*event.TombstoneEventContent) + if !ok { + return + } + defer br.MatrixHandler.TrackEventDuration(evt.Type)() + portal := br.GetPortalByMXID(evt.RoomID) + if portal == nil { + return + } + logEvt := portal.log.Debug(). + Stringer("sender", evt.Sender). + Stringer("replacement_room", content.ReplacementRoom). + Str("body", content.Body) + if content.ReplacementRoom == "" { + logEvt.Msg("Received tombstone event with no replacement room, cleaning up portal") + portal.cleanup(true) + portal.RemoveMXID() + return + } + logEvt.Msg("Received tombstone event, joining new room") + _, err := br.Bot.JoinRoom(content.ReplacementRoom.String(), evt.Sender.Homeserver(), nil) + if err != nil { + portal.log.Err(err).Msg("Failed to join replacement room") + return + } + _, err = br.Bot.State(content.ReplacementRoom) + if err != nil { + portal.log.Err(err).Msg("Failed to get state of replacement room") + return + } + + encrypted := br.AS.StateStore.IsEncrypted(portal.MXID) + br.portalsLock.Lock() + defer br.portalsLock.Unlock() + if portal.MXID != evt.RoomID { + portal.log.Warn(). + Stringer("old_mxid", evt.RoomID). + Stringer("new_mxid", portal.MXID). + Msg("Portal MXID changed while processing tombstone event, not updating") + return + } + _, alreadyAPortal := br.portalsByMXID[content.ReplacementRoom] + if alreadyAPortal { + portal.log.Warn(). + Stringer("replacement_room", content.ReplacementRoom). + Msg("Replacement room is already a portal, not updating") + return + } + delete(portal.bridge.portalsByMXID, portal.MXID) + portal.MXID = content.ReplacementRoom + portal.bridge.portalsByMXID[portal.MXID] = portal + portal.log = portal.bridge.ZLog.With(). + Str("channel_id", portal.Key.ChannelID). + Str("channel_receiver", portal.Key.Receiver). + Str("room_id", portal.MXID.String()). + Logger() + portal.AvatarSet = false + portal.NameSet = false + portal.TopicSet = false + portal.Encrypted = encrypted + portal.InSpace = "" + portal.FirstEventID = "" + portal.Update() + portal.log.Info().Msg("Followed tombstone and updated portal MXID") + portal.UpdateBridgeInfo() +} From d2988096e413607bc36170ad4caf495ffc43b79f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 17 Jul 2025 00:35:47 +0300 Subject: [PATCH 38/44] Allow v12 rooms to be created --- guildportal.go | 1 - portal.go | 1 - user.go | 4 +--- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/guildportal.go b/guildportal.go index d7be670..8230361 100644 --- a/guildportal.go +++ b/guildportal.go @@ -205,7 +205,6 @@ func (guild *Guild) CreateMatrixRoom(user *User, meta *discordgo.Guild) error { Preset: "private_chat", InitialState: initialState, CreationContent: creationContent, - RoomVersion: "11", }) if err != nil { guild.log.Warnln("Failed to create room:", err) diff --git a/portal.go b/portal.go index 926bd0c..d5dc879 100644 --- a/portal.go +++ b/portal.go @@ -489,7 +489,6 @@ func (portal *Portal) CreateMatrixRoom(user *User, channel *discordgo.Channel) e IsDirect: portal.IsPrivateChat(), InitialState: initialState, CreationContent: creationContent, - RoomVersion: "11", } if !portal.shouldSetDMRoomMetadata() && !portal.FriendNick { req.Name = "" diff --git a/user.go b/user.go index f209b33..c227490 100644 --- a/user.go +++ b/user.go @@ -340,11 +340,9 @@ func (user *User) getSpaceRoom(ptr *id.RoomID, name, topic string, parent id.Roo }, PowerLevelOverride: &event.PowerLevelsEventContent{ Users: map[id.UserID]int{ - user.bridge.Bot.UserID: 9001, - user.MXID: 50, + user.MXID: 50, }, }, - RoomVersion: "11", }) if err != nil { From 16469259f7df86fa93506078053dbb483662687b Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 18 Jul 2025 17:11:32 +0300 Subject: [PATCH 39/44] Update issue templates --- .github/ISSUE_TEMPLATE/bug.md | 10 ++++++---- .github/ISSUE_TEMPLATE/enhancement.md | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index 18862a5..3703df9 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -1,14 +1,16 @@ --- name: Bug report about: If something is definitely wrong in the bridge (rather than just a setup issue), - file a bug report. Remember to include relevant logs. -labels: bug + file a bug report. Remember to include relevant logs. Asking in the Matrix room first + is strongly recommended. +type: Bug --- diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md index 264e67f..a04fe58 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.md +++ b/.github/ISSUE_TEMPLATE/enhancement.md @@ -1,6 +1,6 @@ --- name: Enhancement request about: Submit a feature request or other suggestion -labels: enhancement +type: Feature --- From 52ebc21d9b0f9ddb7db19d32ea1c7f82f38bd76f Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 10 Aug 2025 23:28:01 +0300 Subject: [PATCH 40/44] Update mautrix-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8a2d827..db7f22f 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc golang.org/x/sync v0.16.0 maunium.net/go/maulogger/v2 v2.4.1 - maunium.net/go/mautrix v0.16.3-0.20250629161415-a29d782e6638 + maunium.net/go/mautrix v0.16.3-0.20250810202616-6bc5698125c2 ) require ( diff --git a/go.sum b/go.sum index 82d49bb..51356d2 100644 --- a/go.sum +++ b/go.sum @@ -73,5 +73,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.4.1 h1:N7zSdd0mZkB2m2JtFUsiGTQQAdP0YeFWT7YMc80yAL8= maunium.net/go/maulogger/v2 v2.4.1/go.mod h1:omPuYwYBILeVQobz8uO3XC8DIRuEb5rXYlQSuqrbCho= -maunium.net/go/mautrix v0.16.3-0.20250629161415-a29d782e6638 h1:tZEmq1FBuueW6cmxoa2BkXYbfMknW8XPPMiZfD5PKto= -maunium.net/go/mautrix v0.16.3-0.20250629161415-a29d782e6638/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= +maunium.net/go/mautrix v0.16.3-0.20250810202616-6bc5698125c2 h1:8PdwIklPNHTL/tI9tG2S0Tf9UvAgRt8yZjJbjV0XIpA= +maunium.net/go/mautrix v0.16.3-0.20250810202616-6bc5698125c2/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= From 820951cb6e7a3261703c83f4ef8dea1d12e742a6 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 10 Aug 2025 23:47:39 +0300 Subject: [PATCH 41/44] Add support for disabling link previews via MSC4095 --- formatter.go | 14 ++++++++++++-- portal.go | 29 ++++++++++++++++++++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/formatter.go b/formatter.go index 6452532..2112b04 100644 --- a/formatter.go +++ b/formatter.go @@ -98,6 +98,7 @@ func (portal *Portal) renderDiscordMarkdownOnlyHTML(text string, allowInlineLink const formatterContextPortalKey = "fi.mau.discord.portal" const formatterContextAllowedMentionsKey = "fi.mau.discord.allowed_mentions" const formatterContextInputAllowedMentionsKey = "fi.mau.discord.input_allowed_mentions" +const formatterContextInputAllowedLinkPreviewsKey = "fi.mau.discord.input_allowed_link_previews" func appendIfNotContains(arr []string, newItem string) []string { for _, item := range arr { @@ -221,16 +222,24 @@ var matrixHTMLParser = &format.HTMLParser{ return fmt.Sprintf("||%s||", text) }, LinkConverter: func(text, href string, ctx format.Context) string { + linkPreviews := ctx.ReturnData[formatterContextInputAllowedLinkPreviewsKey].([]string) + allowPreview := linkPreviews == nil || slices.Contains(linkPreviews, href) if text == href { + if !allowPreview { + return fmt.Sprintf("<%s>", text) + } return text } else if !discordLinkRegexFull.MatchString(href) { return fmt.Sprintf("%s (%s)", escapeDiscordMarkdown(text), escapeDiscordMarkdown(href)) + } else if !allowPreview { + return fmt.Sprintf("[%s](<%s>)", escapeDiscordMarkdown(text), href) + } else { + return fmt.Sprintf("[%s](%s)", escapeDiscordMarkdown(text), href) } - return fmt.Sprintf("[%s](%s)", escapeDiscordMarkdown(text), href) }, } -func (portal *Portal) parseMatrixHTML(content *event.MessageEventContent) (string, *discordgo.MessageAllowedMentions) { +func (portal *Portal) parseMatrixHTML(content *event.MessageEventContent, allowedLinkPreviews []string) (string, *discordgo.MessageAllowedMentions) { allowedMentions := &discordgo.MessageAllowedMentions{ Parse: []discordgo.AllowedMentionType{}, Users: []string{}, @@ -238,6 +247,7 @@ func (portal *Portal) parseMatrixHTML(content *event.MessageEventContent) (strin } if content.Format == event.FormatHTML && len(content.FormattedBody) > 0 { ctx := format.NewContext() + ctx.ReturnData[formatterContextInputAllowedLinkPreviewsKey] = allowedLinkPreviews ctx.ReturnData[formatterContextPortalKey] = portal ctx.ReturnData[formatterContextAllowedMentionsKey] = allowedMentions if content.Mentions != nil { diff --git a/portal.go b/portal.go index d5dc879..439cdfd 100644 --- a/portal.go +++ b/portal.go @@ -1544,7 +1544,8 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { if editMXID := content.GetRelatesTo().GetReplaceID(); editMXID != "" && content.NewContent != nil { edits := portal.bridge.DB.Message.GetByMXID(portal.Key, editMXID) if edits != nil { - discordContent, allowedMentions := portal.parseMatrixHTML(content.NewContent) + newContentRaw, _ := evt.Content.Raw["m.new_content"].(map[string]any) + discordContent, allowedMentions := portal.parseMatrixHTML(content.NewContent, parseAllowedLinkPreviews(newContentRaw)) var err error var msg *discordgo.Message if !isWebhookSend { @@ -1623,7 +1624,7 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { } switch content.MsgType { case event.MsgText, event.MsgEmote, event.MsgNotice: - sendReq.Content, sendReq.AllowedMentions = portal.parseMatrixHTML(content) + sendReq.Content, sendReq.AllowedMentions = portal.parseMatrixHTML(content, parseAllowedLinkPreviews(evt.Content.Raw)) if content.MsgType == event.MsgEmote { sendReq.Content = fmt.Sprintf("_%s_", sendReq.Content) } @@ -1636,7 +1637,7 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { filename := content.Body if content.FileName != "" && content.FileName != content.Body { filename = content.FileName - sendReq.Content, sendReq.AllowedMentions = portal.parseMatrixHTML(content) + sendReq.Content, sendReq.AllowedMentions = portal.parseMatrixHTML(content, parseAllowedLinkPreviews(evt.Content.Raw)) } if evt.Content.Raw["page.codeberg.everypizza.msc4193.spoiler"] == true { @@ -1744,6 +1745,28 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { } } +func parseAllowedLinkPreviews(raw map[string]any) []string { + if raw == nil { + return nil + } + linkPreviews, ok := raw["com.beeper.linkpreviews"].([]any) + if !ok { + return nil + } + allowedLinkPreviews := make([]string, 0, len(linkPreviews)) + for _, preview := range linkPreviews { + previewMap, ok := preview.(map[string]any) + if !ok { + continue + } + matchedURL, _ := previewMap["matched_url"].(string) + if matchedURL != "" { + allowedLinkPreviews = append(allowedLinkPreviews, matchedURL) + } + } + return allowedLinkPreviews +} + func (portal *Portal) sendDeliveryReceipt(eventID id.EventID) { if portal.bridge.Config.Bridge.DeliveryReceipts { err := portal.bridge.Bot.MarkRead(portal.MXID, eventID) From 98e5e9de4a0f596653fa6a6f9e6555e0a47962e0 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sat, 16 Aug 2025 23:58:52 +0300 Subject: [PATCH 42/44] Revert "Allow v12 rooms to be created" This reverts commit d2988096e413607bc36170ad4caf495ffc43b79f. The bridge can handle v12 rooms fine, but creation requires additional considerations Fixes #193 --- guildportal.go | 1 + portal.go | 1 + user.go | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/guildportal.go b/guildportal.go index 8230361..d7be670 100644 --- a/guildportal.go +++ b/guildportal.go @@ -205,6 +205,7 @@ func (guild *Guild) CreateMatrixRoom(user *User, meta *discordgo.Guild) error { Preset: "private_chat", InitialState: initialState, CreationContent: creationContent, + RoomVersion: "11", }) if err != nil { guild.log.Warnln("Failed to create room:", err) diff --git a/portal.go b/portal.go index 439cdfd..3a5db83 100644 --- a/portal.go +++ b/portal.go @@ -489,6 +489,7 @@ func (portal *Portal) CreateMatrixRoom(user *User, channel *discordgo.Channel) e IsDirect: portal.IsPrivateChat(), InitialState: initialState, CreationContent: creationContent, + RoomVersion: "11", } if !portal.shouldSetDMRoomMetadata() && !portal.FriendNick { req.Name = "" diff --git a/user.go b/user.go index c227490..f209b33 100644 --- a/user.go +++ b/user.go @@ -340,9 +340,11 @@ func (user *User) getSpaceRoom(ptr *id.RoomID, name, topic string, parent id.Roo }, PowerLevelOverride: &event.PowerLevelsEventContent{ Users: map[id.UserID]int{ - user.MXID: 50, + user.bridge.Bot.UserID: 9001, + user.MXID: 50, }, }, + RoomVersion: "11", }) if err != nil { From 5c22ed85a7bcb95f7e74ff50e786e635539198f0 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Sun, 17 Aug 2025 00:02:45 +0300 Subject: [PATCH 43/44] Bump minimum Go version to 1.24 --- .github/workflows/go.yml | 4 ++-- go.mod | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 27a602f..173e36a 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -8,8 +8,8 @@ jobs: strategy: fail-fast: false matrix: - go-version: ["1.23", "1.24"] - name: Lint ${{ matrix.go-version == '1.24' && '(latest)' || '(old)' }} + go-version: ["1.24", "1.25"] + name: Lint ${{ matrix.go-version == '1.25' && '(latest)' || '(old)' }} steps: - uses: actions/checkout@v4 diff --git a/go.mod b/go.mod index db7f22f..3cfd6aa 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module go.mau.fi/mautrix-discord -go 1.23.0 +go 1.24.0 -toolchain go1.24.5 +toolchain go1.25.0 require ( github.com/bwmarrin/discordgo v0.27.0 From d92d7c4314db355fcc02c4384fcd48cd399b10a1 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Tue, 19 Aug 2025 17:44:20 +0300 Subject: [PATCH 44/44] Install lottieconverter from Alpine repos --- Dockerfile | 7 +------ Dockerfile.ci | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4913b13..4664399 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,3 @@ -FROM dock.mau.dev/tulir/lottieconverter:alpine-3.22 AS lottie - FROM golang:1-alpine3.22 AS builder RUN apk add --no-cache git ca-certificates build-base su-exec olm-dev @@ -13,11 +11,8 @@ FROM alpine:3.22 ENV UID=1337 \ GID=1337 -RUN apk add --no-cache ffmpeg su-exec ca-certificates olm bash jq yq curl \ - zlib libpng giflib libstdc++ libgcc +RUN apk add --no-cache ffmpeg su-exec ca-certificates olm bash jq curl yq-go lottieconverter -COPY --from=lottie /usr/lib/librlottie.so* /usr/lib/ -COPY --from=lottie /usr/local/bin/lottieconverter /usr/local/bin/lottieconverter COPY --from=builder /usr/bin/mautrix-discord /usr/bin/mautrix-discord COPY --from=builder /build/example-config.yaml /opt/mautrix-discord/example-config.yaml COPY --from=builder /build/docker-run.sh /docker-run.sh diff --git a/Dockerfile.ci b/Dockerfile.ci index 9e6d845..32b9c35 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -1,15 +1,10 @@ -FROM dock.mau.dev/tulir/lottieconverter:alpine-3.22 AS lottie - FROM alpine:3.22 ENV UID=1337 \ GID=1337 -RUN apk add --no-cache ffmpeg su-exec ca-certificates bash jq curl yq \ - zlib libpng giflib libstdc++ libgcc +RUN apk add --no-cache ffmpeg su-exec ca-certificates bash jq curl yq-go lottieconverter -COPY --from=lottie /usr/lib/librlottie.so* /usr/lib/ -COPY --from=lottie /usr/local/bin/lottieconverter /usr/local/bin/lottieconverter ARG EXECUTABLE=./mautrix-discord COPY $EXECUTABLE /usr/bin/mautrix-discord COPY ./example-config.yaml /opt/mautrix-discord/example-config.yaml