From 693ced7dea5826470bcda996d4d0a8bff111fbd7 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Thu, 2 Apr 2026 23:53:06 +0300 Subject: [PATCH] handletelegram: add workaround for instantly deleted messages --- go.mod | 2 +- go.sum | 4 ++-- pkg/connector/client.go | 4 ++++ pkg/connector/handletelegram.go | 36 +++++++++++++++------------------ 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index 2098fd0b..279500bf 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( golang.org/x/sync v0.20.0 golang.org/x/tools v0.43.0 gopkg.in/yaml.v3 v3.0.1 - maunium.net/go/mautrix v0.26.5-0.20260331163037-18917f3bdc14 + maunium.net/go/mautrix v0.26.5-0.20260402195603-eceb664673b8 rsc.io/qr v0.2.0 ) diff --git a/go.sum b/go.sum index 1ee7ea6c..84face88 100644 --- a/go.sum +++ b/go.sum @@ -236,7 +236,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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/mautrix v0.26.5-0.20260331163037-18917f3bdc14 h1:y+4gtqKBMTtcVUiAeWJnvp88JLo/h3myQPsz1rZfNOY= -maunium.net/go/mautrix v0.26.5-0.20260331163037-18917f3bdc14/go.mod h1:RUSMBPky3jhXB7Ux+AptfkEvFlJ4ajZKCYiXI8YzxVE= +maunium.net/go/mautrix v0.26.5-0.20260402195603-eceb664673b8 h1:0fRt2MyB21s0cdKqkmc29OhaJTVEu2NTfIGr9taAtY8= +maunium.net/go/mautrix v0.26.5-0.20260402195603-eceb664673b8/go.mod h1:RUSMBPky3jhXB7Ux+AptfkEvFlJ4ajZKCYiXI8YzxVE= rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 5fead172..8b06803c 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -96,6 +96,8 @@ type TelegramClient struct { availableReactionsList []string isPremiumCache atomic.Bool + recentMessageRooms *exsync.RingBuffer[networkid.MessageID, networkid.PortalKey] + telegramFmtParams *telegramfmt.FormatParams matrixParser *matrixfmt.HTMLParser @@ -171,6 +173,8 @@ func NewTelegramClient(ctx context.Context, tc *TelegramConnector, login *bridge prevReactionPoll: map[networkid.PortalKey]time.Time{}, + recentMessageRooms: exsync.NewRingBuffer[networkid.MessageID, networkid.PortalKey](32), + clientInitialized: exsync.NewEvent(), clientDone: exsync.NewEvent(), } diff --git a/pkg/connector/handletelegram.go b/pkg/connector/handletelegram.go index ce3b15c6..ca67e1d4 100644 --- a/pkg/connector/handletelegram.go +++ b/pkg/connector/handletelegram.go @@ -771,34 +771,30 @@ func (t *TelegramClient) onUserName(ctx context.Context, e tg.Entities, update * func (t *TelegramClient) onDeleteMessages(ctx context.Context, channelID int64, update IGetMessages) error { for _, messageID := range update.GetMessages() { - // TODO have mautrix-go do this part too? - parts, err := t.main.Bridge.DB.Message.GetAllPartsByID(ctx, t.loginID, ids.MakeMessageID(channelID, messageID)) - if err != nil { + wrappedMessageID := ids.MakeMessageID(channelID, messageID) + var portalKey networkid.PortalKey + var ok bool + if portalKey, ok = t.recentMessageRooms.Get(wrappedMessageID); ok { + // key found in cache + } else if parts, err := t.main.Bridge.DB.Message.GetAllPartsByID(ctx, t.loginID, wrappedMessageID); err != nil { return err - } - if len(parts) == 0 { + } else if len(parts) > 0 { + portalKey = parts[0].Room + } else if channelID != 0 { + // This won't work for topics, but should work for any other channels + portalKey = t.makePortalKeyFromPeer(&tg.PeerChannel{ChannelID: channelID}, 0) + } else { zerolog.Ctx(ctx).Debug(). Int("message_id", messageID). - Int64("channel_id", channelID). - Msg("ignoring delete of message we have no parts for") + Msg("Ignoring delete of unknown message") continue } - // TODO can deletes happen across rooms? - portalKey := parts[0].Room - // TODO optimize non-topic portal deletion by using channel ID? - //portalKey = t.makePortalKeyFromPeer(&tg.PeerChannel{ChannelID: channelID}) res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.MessageRemove{ EventMeta: simplevent.EventMeta{ - Type: bridgev2.RemoteEventMessageRemove, - LogContext: func(c zerolog.Context) zerolog.Context { - return c. - Str("action", "delete message"). - Int("message_id", messageID) - }, - PortalKey: portalKey, - CreatePortal: false, + Type: bridgev2.RemoteEventMessageRemove, + PortalKey: portalKey, }, - TargetMessage: ids.MakeMessageID(channelID, messageID), + TargetMessage: wrappedMessageID, }) if err := resultToError(res); err != nil { return err