From 3d8b9d629117e2c9487b3c24a8808cc4e543d0b2 Mon Sep 17 00:00:00 2001 From: Sumner Evans Date: Tue, 25 Jun 2024 15:21:08 -0600 Subject: [PATCH] client: handle message deletions TG <-> Matrix Signed-off-by: Sumner Evans --- go.mod | 4 ++-- go.sum | 8 ++++---- pkg/connector/client.go | 42 ++++++++++++++++++++++++++++++++++++---- pkg/connector/ids/ids.go | 4 ++++ pkg/connector/matrix.go | 9 ++++++++- 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 8411e9f4..2c41fc73 100644 --- a/go.mod +++ b/go.mod @@ -6,10 +6,10 @@ require ( github.com/gotd/td v0.102.0 github.com/rs/zerolog v1.33.0 github.com/stretchr/testify v1.9.0 - go.mau.fi/util v0.5.0 + go.mau.fi/util v0.5.1-0.20240625085258-678695edd51c go.mau.fi/zerozap v0.1.1 go.uber.org/zap v1.27.0 - maunium.net/go/mautrix v0.19.0-beta.1.0.20240624171009-09a8a5104a6c + maunium.net/go/mautrix v0.19.0-beta.1.0.20240625211524-f246e7041420 ) require ( diff --git a/go.sum b/go.sum index 1bdcaee1..c93d2d86 100644 --- a/go.sum +++ b/go.sum @@ -67,8 +67,8 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.7.2 h1:NjGd7lO7zrUn/A7eKwn5PEOt4ONYGqpxSEeZuduvgxc= github.com/yuin/goldmark v1.7.2/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= -go.mau.fi/util v0.5.0 h1:8yELAl+1CDRrwGe9NUmREgVclSs26Z68pTWePHVxuDo= -go.mau.fi/util v0.5.0/go.mod h1:DsJzUrJAG53lCZnnYvq9/mOyLuPScWwYhvETiTrpdP4= +go.mau.fi/util v0.5.1-0.20240625085258-678695edd51c h1:LAXHOnupWCFvTyx4ZAu5t+6n7zADldeRHIk1s+2luow= +go.mau.fi/util v0.5.1-0.20240625085258-678695edd51c/go.mod h1:DsJzUrJAG53lCZnnYvq9/mOyLuPScWwYhvETiTrpdP4= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= go.mau.fi/zerozap v0.1.1 h1:mxE/dW4wtkqBYOXOEEzXldk5qKB+ahsZXjoTGnvEhZQ= @@ -108,8 +108,8 @@ 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.19.0-beta.1.0.20240624171009-09a8a5104a6c h1:jm1n2dI2mVDnmrxFgRA1a3MfYdkwBYgKseVKgJHv/a4= -maunium.net/go/mautrix v0.19.0-beta.1.0.20240624171009-09a8a5104a6c/go.mod h1:cxv1w6+syudmEpOewHYIQT9yO7TM5UOWmf6xEBVI4H4= +maunium.net/go/mautrix v0.19.0-beta.1.0.20240625211524-f246e7041420 h1:aMBQFbp5DFtLI8F23ab2HWhaYGSDmcYhd4sEYcWbHeY= +maunium.net/go/mautrix v0.19.0-beta.1.0.20240625211524-f246e7041420/go.mod h1:pFbqAannSyJnohVycF4NW3IngBLWUt/f9KYfJcwyQec= nhooyr.io/websocket v1.8.11 h1:f/qXNc2/3DpoSZkHt1DQu6rj4zGC8JmkkLkWss0MgN0= nhooyr.io/websocket v1.8.11/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 864e05e7..488950c7 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -32,7 +32,18 @@ type TelegramClient struct { msgConv *msgconv.MessageConverter } -var _ bridgev2.NetworkAPI = (*TelegramClient)(nil) +var ( + _ bridgev2.NetworkAPI = (*TelegramClient)(nil) + _ bridgev2.EditHandlingNetworkAPI = (*TelegramClient)(nil) + _ bridgev2.ReactionHandlingNetworkAPI = (*TelegramClient)(nil) + _ bridgev2.RedactionHandlingNetworkAPI = (*TelegramClient)(nil) + _ bridgev2.ReadReceiptHandlingNetworkAPI = (*TelegramClient)(nil) + _ bridgev2.ReadReceiptHandlingNetworkAPI = (*TelegramClient)(nil) + _ bridgev2.TypingHandlingNetworkAPI = (*TelegramClient)(nil) + // _ bridgev2.IdentifierResolvingNetworkAPI = (*TelegramClient)(nil) + // _ bridgev2.GroupCreatingNetworkAPI = (*TelegramClient)(nil) + // _ bridgev2.ContactListingNetworkAPI = (*TelegramClient)(nil) +) type UpdateDispatcher struct { tg.UpdateDispatcher @@ -40,9 +51,7 @@ type UpdateDispatcher struct { } func (u UpdateDispatcher) Handle(ctx context.Context, updates tg.UpdatesClass) error { - var ( - e tg.Entities - ) + var e tg.Entities switch u := updates.(type) { case *tg.Updates: e.Users = u.MapUsers().NotEmptyToMap() @@ -87,6 +96,7 @@ func NewTelegramClient(ctx context.Context, tc *TelegramConnector, login *bridge dispatcher.OnNewMessage(client.onUpdateNewMessage) dispatcher.OnNewChannelMessage(client.onUpdateNewChannelMessage) dispatcher.OnUserName(client.onUserName) + dispatcher.OnDeleteMessages(client.onDeleteMessages) store := tc.store.GetScopedStore(loginID) @@ -286,6 +296,30 @@ func (t *TelegramClient) onUserName(ctx context.Context, e tg.Entities, update * return nil } +func (t *TelegramClient) onDeleteMessages(ctx context.Context, e tg.Entities, update *tg.UpdateDeleteMessages) error { + for _, messageID := range update.Messages { + parts, err := t.main.Bridge.DB.Message.GetAllPartsByID(ctx, ids.MakeMessageID(messageID)) + if err != nil { + return err + } + if len(parts) == 0 { + return fmt.Errorf("no parts found for message %d", messageID) + } + t.main.Bridge.QueueRemoteEvent(t.userLogin, &bridgev2.SimpleRemoteEvent[any]{ + Type: bridgev2.RemoteEventMessageRemove, + LogContext: func(c zerolog.Context) zerolog.Context { + return c. + Str("action", "delete message"). + Int("message_id", messageID) + }, + PortalKey: parts[0].Room, + CreatePortal: false, + TargetMessage: ids.MakeMessageID(messageID), + }) + } + return nil +} + func (t *TelegramClient) onEntityUpdate(ctx context.Context, e tg.Entities) error { for userID, user := range e.Users { ghost, err := t.main.Bridge.GetGhostByID(ctx, ids.MakeUserID(userID)) diff --git a/pkg/connector/ids/ids.go b/pkg/connector/ids/ids.go index a07d1892..dbd1da80 100644 --- a/pkg/connector/ids/ids.go +++ b/pkg/connector/ids/ids.go @@ -25,6 +25,10 @@ func MakeMessageID(messageID int) networkid.MessageID { return networkid.MessageID(strconv.Itoa(messageID)) } +func ParseMessageID(messageID networkid.MessageID) (int, error) { + return strconv.Atoi(string(messageID)) +} + type PeerType string const ( diff --git a/pkg/connector/matrix.go b/pkg/connector/matrix.go index 7ad7b352..f6cbecf9 100644 --- a/pkg/connector/matrix.go +++ b/pkg/connector/matrix.go @@ -164,7 +164,14 @@ func (t *TelegramClient) HandleMatrixEdit(ctx context.Context, msg *bridgev2.Mat } func (t *TelegramClient) HandleMatrixMessageRemove(ctx context.Context, msg *bridgev2.MatrixMessageRemove) error { - panic("unimplemented remove") + if dbMsg, err := t.main.Bridge.DB.Message.GetPartByMXID(ctx, msg.TargetMessage.MXID); err != nil { + return err + } else if messageID, err := ids.ParseMessageID(dbMsg.ID); err != nil { + return err + } else { + _, err = message.NewSender(t.client.API()).Self().Revoke().Messages(ctx, messageID) + return err + } } func (t *TelegramClient) PreHandleMatrixReaction(ctx context.Context, msg *bridgev2.MatrixReaction) (bridgev2.MatrixReactionPreResponse, error) {