handletelegram: add workaround for instantly deleted messages
This commit is contained in:
@@ -42,7 +42,7 @@ require (
|
|||||||
golang.org/x/sync v0.20.0
|
golang.org/x/sync v0.20.0
|
||||||
golang.org/x/tools v0.43.0
|
golang.org/x/tools v0.43.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
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
|
rsc.io/qr v0.2.0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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=
|
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 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M=
|
||||||
maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA=
|
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.20260402195603-eceb664673b8 h1:0fRt2MyB21s0cdKqkmc29OhaJTVEu2NTfIGr9taAtY8=
|
||||||
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/go.mod h1:RUSMBPky3jhXB7Ux+AptfkEvFlJ4ajZKCYiXI8YzxVE=
|
||||||
rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY=
|
rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY=
|
||||||
rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs=
|
rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs=
|
||||||
|
|||||||
@@ -96,6 +96,8 @@ type TelegramClient struct {
|
|||||||
availableReactionsList []string
|
availableReactionsList []string
|
||||||
isPremiumCache atomic.Bool
|
isPremiumCache atomic.Bool
|
||||||
|
|
||||||
|
recentMessageRooms *exsync.RingBuffer[networkid.MessageID, networkid.PortalKey]
|
||||||
|
|
||||||
telegramFmtParams *telegramfmt.FormatParams
|
telegramFmtParams *telegramfmt.FormatParams
|
||||||
matrixParser *matrixfmt.HTMLParser
|
matrixParser *matrixfmt.HTMLParser
|
||||||
|
|
||||||
@@ -171,6 +173,8 @@ func NewTelegramClient(ctx context.Context, tc *TelegramConnector, login *bridge
|
|||||||
|
|
||||||
prevReactionPoll: map[networkid.PortalKey]time.Time{},
|
prevReactionPoll: map[networkid.PortalKey]time.Time{},
|
||||||
|
|
||||||
|
recentMessageRooms: exsync.NewRingBuffer[networkid.MessageID, networkid.PortalKey](32),
|
||||||
|
|
||||||
clientInitialized: exsync.NewEvent(),
|
clientInitialized: exsync.NewEvent(),
|
||||||
clientDone: 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 {
|
func (t *TelegramClient) onDeleteMessages(ctx context.Context, channelID int64, update IGetMessages) error {
|
||||||
for _, messageID := range update.GetMessages() {
|
for _, messageID := range update.GetMessages() {
|
||||||
// TODO have mautrix-go do this part too?
|
wrappedMessageID := ids.MakeMessageID(channelID, messageID)
|
||||||
parts, err := t.main.Bridge.DB.Message.GetAllPartsByID(ctx, t.loginID, ids.MakeMessageID(channelID, messageID))
|
var portalKey networkid.PortalKey
|
||||||
if err != nil {
|
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
|
return err
|
||||||
}
|
} else if len(parts) > 0 {
|
||||||
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().
|
zerolog.Ctx(ctx).Debug().
|
||||||
Int("message_id", messageID).
|
Int("message_id", messageID).
|
||||||
Int64("channel_id", channelID).
|
Msg("Ignoring delete of unknown message")
|
||||||
Msg("ignoring delete of message we have no parts for")
|
|
||||||
continue
|
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{
|
res := t.main.Bridge.QueueRemoteEvent(t.userLogin, &simplevent.MessageRemove{
|
||||||
EventMeta: simplevent.EventMeta{
|
EventMeta: simplevent.EventMeta{
|
||||||
Type: bridgev2.RemoteEventMessageRemove,
|
Type: bridgev2.RemoteEventMessageRemove,
|
||||||
LogContext: func(c zerolog.Context) zerolog.Context {
|
PortalKey: portalKey,
|
||||||
return c.
|
|
||||||
Str("action", "delete message").
|
|
||||||
Int("message_id", messageID)
|
|
||||||
},
|
|
||||||
PortalKey: portalKey,
|
|
||||||
CreatePortal: false,
|
|
||||||
},
|
},
|
||||||
TargetMessage: ids.MakeMessageID(channelID, messageID),
|
TargetMessage: wrappedMessageID,
|
||||||
})
|
})
|
||||||
if err := resultToError(res); err != nil {
|
if err := resultToError(res); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user