handletelegram: add workaround for instantly deleted messages

This commit is contained in:
Tulir Asokan
2026-04-02 23:53:06 +03:00
parent b6c7b0e78b
commit 693ced7dea
4 changed files with 23 additions and 23 deletions

2
go.mod
View File

@@ -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
)

4
go.sum
View File

@@ -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=

View File

@@ -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(),
}

View File

@@ -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