handlematrix: simplify read receipt bridging

This commit is contained in:
Skip R
2026-01-06 18:09:52 -08:00
parent 761a850a50
commit 4314aa9206

View File

@@ -114,36 +114,51 @@ func (d *DiscordClient) HandleMatrixReadReceipt(ctx context.Context, msg *bridge
Str("event_id", string(msg.EventID)). Str("event_id", string(msg.EventID)).
Str("action", "matrix read receipt").Logger() Str("action", "matrix read receipt").Logger()
sendReadReceipt := func(messageID string) error { var targetMessageID string
// 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
}
// Figure out the ID of the Discord message that we'll mark as read. If the
// receipt didn't exactly correspond with a message, try finding one close
// by to use as the target.
if msg.ExactMessage != nil { if msg.ExactMessage != nil {
messageID := string(msg.ExactMessage.ID) targetMessageID = string(msg.ExactMessage.ID)
return sendReadReceipt(messageID) log = log.With().
Str("message_id", targetMessageID).
Logger()
} else {
closestMessage, err := d.UserLogin.Bridge.DB.Message.GetLastPartAtOrBeforeTime(ctx, msg.Portal.PortalKey, msg.ReadUpTo)
if err != nil {
log.Err(err).Msg("Failed to find closest message part")
return err
} else if closestMessage != nil {
// The read receipt didn't specify an exact message but we were able to
// find one close by.
targetMessageID = string(closestMessage.ID)
log = log.With().
Str("closest_message_id", targetMessageID).
Str("closest_event_id", closestMessage.MXID.String()).
Logger()
log.Debug().
Msg("Read receipt target event not found, using closest message")
} else {
log.Debug().Msg("Dropping read receipt: no messages found")
return nil
}
} }
lastMessage, err := d.UserLogin.Bridge.DB.Message.GetLastPartAtOrBeforeTime(ctx, msg.Portal.PortalKey, msg.ReadUpTo) // TODO: Support guilds.
channelID := string(msg.Portal.ID)
resp, err := d.Session.ChannelMessageAckNoToken(channelID, targetMessageID, discordgo.WithChannelReferer("", channelID))
if err != nil { if err != nil {
log.Err(err).Msg("Failed to send read receipt, couldn't find last part before ReadUpTo") log.Err(err).Msg("Failed to send read receipt to Discord")
return err return err
} else if lastMessage != nil { } else if resp.Token != nil {
messageID := string(lastMessage.ID) log.Debug().
log.Debug().Str("message_id", messageID).Msg("Bridging read receipt via last message part") Str("unexpected_resp_token", *resp.Token).
return sendReadReceipt(string(messageID)) 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 return nil