From 761a850a501f87792e792dec974603d778406c89 Mon Sep 17 00:00:00 2001 From: Skip R Date: Tue, 6 Jan 2026 17:40:14 -0800 Subject: [PATCH] handlematrix: bridge outgoing read receipts --- pkg/connector/handlematrix.go | 40 +++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/pkg/connector/handlematrix.go b/pkg/connector/handlematrix.go index 6299c10..0fa936a 100644 --- a/pkg/connector/handlematrix.go +++ b/pkg/connector/handlematrix.go @@ -109,8 +109,44 @@ func (d *DiscordClient) HandleMatrixMessageRemove(ctx context.Context, removal * } func (d *DiscordClient) HandleMatrixReadReceipt(ctx context.Context, msg *bridgev2.MatrixReadReceipt) error { - //TODO implement me - panic("implement me") + // TODO: Support threads. + log := msg.Portal.Log.With(). + Str("event_id", string(msg.EventID)). + Str("action", "matrix read receipt").Logger() + + sendReadReceipt := func(messageID string) error { + // TODO: Support guilds. + channelID := string(msg.Portal.ID) + resp, err := d.Session.ChannelMessageAckNoToken(channelID, messageID, discordgo.WithChannelReferer("", channelID)) + if err != nil { + log.Err(err).Msg("Failed to send read receipt to Discord") + return err + } else if resp.Token != nil { + log.Debug(). + Str("unexpected_resp_token", *resp.Token). + Msg("Marked message as read on Discord (and got unexpected non-nil token)") + } else { + log.Debug().Msg("Marked message as read on Discord") + } + return nil + } + + if msg.ExactMessage != nil { + messageID := string(msg.ExactMessage.ID) + return sendReadReceipt(messageID) + } + + lastMessage, err := d.UserLogin.Bridge.DB.Message.GetLastPartAtOrBeforeTime(ctx, msg.Portal.PortalKey, msg.ReadUpTo) + if err != nil { + log.Err(err).Msg("Failed to send read receipt, couldn't find last part before ReadUpTo") + return err + } else if lastMessage != nil { + messageID := string(lastMessage.ID) + log.Debug().Str("message_id", messageID).Msg("Bridging read receipt via last message part") + return sendReadReceipt(string(messageID)) + } + + return nil } func (d *DiscordClient) HandleMatrixTyping(ctx context.Context, msg *bridgev2.MatrixTyping) error {