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
+4
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(),
}
+16 -20
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