handlematrix: simplify read receipt bridging
This commit is contained in:
@@ -114,10 +114,42 @@ func (d *DiscordClient) HandleMatrixReadReceipt(ctx context.Context, msg *bridge
|
||||
Str("event_id", string(msg.EventID)).
|
||||
Str("action", "matrix read receipt").Logger()
|
||||
|
||||
sendReadReceipt := func(messageID string) error {
|
||||
var targetMessageID string
|
||||
|
||||
// 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 {
|
||||
targetMessageID = string(msg.ExactMessage.ID)
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Support guilds.
|
||||
channelID := string(msg.Portal.ID)
|
||||
resp, err := d.Session.ChannelMessageAckNoToken(channelID, messageID, discordgo.WithChannelReferer("", channelID))
|
||||
resp, err := d.Session.ChannelMessageAckNoToken(channelID, targetMessageID, discordgo.WithChannelReferer("", channelID))
|
||||
if err != nil {
|
||||
log.Err(err).Msg("Failed to send read receipt to Discord")
|
||||
return err
|
||||
@@ -128,23 +160,6 @@ func (d *DiscordClient) HandleMatrixReadReceipt(ctx context.Context, msg *bridge
|
||||
} 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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user