mirror of
https://github.com/mautrix/telegram.git
synced 2026-05-17 07:25:46 +03:00
handletelegram: add workaround for instantly deleted messages
This commit is contained in:
2
go.mod
2
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
|
||||
)
|
||||
|
||||
|
||||
4
go.sum
4
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=
|
||||
|
||||
@@ -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(),
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user