From 3cc3f95017b33ccdbd24573b345bc04bdb836d8c Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 14 Aug 2024 18:58:28 +0300 Subject: [PATCH] bridgev2: ensure m.mentions is always set --- bridgev2/networkinterface.go | 3 +++ bridgev2/portal.go | 14 +++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/bridgev2/networkinterface.go b/bridgev2/networkinterface.go index 041af68a..4fd8a603 100644 --- a/bridgev2/networkinterface.go +++ b/bridgev2/networkinterface.go @@ -138,6 +138,9 @@ type ConvertedEditPart struct { Extra map[string]any // TopLevelExtra can be used to specify custom fields at the top level of the content rather than inside `m.new_content`. TopLevelExtra map[string]any + // NewMentions can be used to specify new mentions that should ping the users again. + // Mentions inside the edited content will not ping. + NewMentions *event.Mentions DontBridge bool } diff --git a/bridgev2/portal.go b/bridgev2/portal.go index c2347239..667f98d2 100644 --- a/bridgev2/portal.go +++ b/bridgev2/portal.go @@ -1609,14 +1609,14 @@ func (portal *Portal) getRelationMeta(ctx context.Context, currentMsg networkid. } func (portal *Portal) applyRelationMeta(content *event.MessageEventContent, replyTo, threadRoot, prevThreadEvent *database.Message) { + if content.Mentions == nil { + content.Mentions = &event.Mentions{} + } if threadRoot != nil && prevThreadEvent != nil { content.GetRelatesTo().SetThread(threadRoot.MXID, prevThreadEvent.MXID) } if replyTo != nil { content.GetRelatesTo().SetReplyTo(replyTo.MXID) - if content.Mentions == nil { - content.Mentions = &event.Mentions{} - } content.Mentions.Add(replyTo.SenderMXID) } } @@ -1869,12 +1869,20 @@ func (portal *Portal) handleRemoteEdit(ctx context.Context, source *UserLogin, e func (portal *Portal) sendConvertedEdit(ctx context.Context, targetID networkid.MessageID, senderID networkid.UserID, converted *ConvertedEdit, intent MatrixAPI, ts time.Time) { log := zerolog.Ctx(ctx) for _, part := range converted.ModifiedParts { + if part.Content.Mentions == nil { + part.Content.Mentions = &event.Mentions{} + } overrideMXID := true if part.Part.Room != portal.PortalKey { part.Part.Room = portal.PortalKey } else if !part.Part.HasFakeMXID() { part.Content.SetEdit(part.Part.MXID) overrideMXID = false + if part.NewMentions != nil { + part.Content.Mentions = part.NewMentions + } else { + part.Content.Mentions = &event.Mentions{} + } } if part.TopLevelExtra == nil { part.TopLevelExtra = make(map[string]any)