diff --git a/bridgev2/networkinterface.go b/bridgev2/networkinterface.go index 0646b2e7..1fd09bb6 100644 --- a/bridgev2/networkinterface.go +++ b/bridgev2/networkinterface.go @@ -913,11 +913,15 @@ type RemoteBackfill interface { GetBackfillData(ctx context.Context, portal *Portal) (*FetchMessagesResponse, error) } -type RemoteChatDelete interface { +type RemoteDeleteOnlyForMe interface { RemoteEvent DeleteOnlyForMe() bool } +type RemoteChatDelete interface { + RemoteDeleteOnlyForMe +} + type RemoteEventThatMayCreatePortal interface { RemoteEvent ShouldCreatePortal() bool diff --git a/bridgev2/portal.go b/bridgev2/portal.go index a5980fae..40e4b6ca 100644 --- a/bridgev2/portal.go +++ b/bridgev2/portal.go @@ -2370,6 +2370,12 @@ func (portal *Portal) handleRemoteMessageRemove(ctx context.Context, source *Use log.Debug().Msg("Target message not found") return } + onlyForMeProvider, ok := evt.(RemoteDeleteOnlyForMe) + onlyForMe := ok && onlyForMeProvider.DeleteOnlyForMe() + if onlyForMe && portal.Receiver == "" { + // TODO check if there are other user logins before deleting + } + intent := portal.GetIntentFor(ctx, evt.GetSender(), source, RemoteEventMessageRemove) if intent == portal.Bridge.Bot && len(targetParts) > 0 { senderIntent, err := portal.getIntentForMXID(ctx, targetParts[0].SenderMXID) diff --git a/bridgev2/simplevent/message.go b/bridgev2/simplevent/message.go index 55d25bd8..f648ab12 100644 --- a/bridgev2/simplevent/message.go +++ b/bridgev2/simplevent/message.go @@ -63,10 +63,18 @@ type MessageRemove struct { EventMeta TargetMessage networkid.MessageID + OnlyForMe bool } -var _ bridgev2.RemoteMessageRemove = (*MessageRemove)(nil) +var ( + _ bridgev2.RemoteMessageRemove = (*MessageRemove)(nil) + _ bridgev2.RemoteDeleteOnlyForMe = (*MessageRemove)(nil) +) func (evt *MessageRemove) GetTargetMessage() networkid.MessageID { return evt.TargetMessage } + +func (evt *MessageRemove) DeleteOnlyForMe() bool { + return evt.OnlyForMe +}