Skip to content

bridgev2: add interfaces for reading up to stream order #379

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions bridgev2/matrixinterface.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,10 @@ type MatrixAPI interface {
MuteRoom(ctx context.Context, roomID id.RoomID, until time.Time) error
}

type StreamOrderReadingMatrixAPI interface {
MarkStreamOrderRead(ctx context.Context, roomID id.RoomID, streamOrder int64, ts time.Time) error
}

type MarkAsDMMatrixAPI interface {
MarkAsDM(ctx context.Context, roomID id.RoomID, otherUser id.UserID) error
}
5 changes: 5 additions & 0 deletions bridgev2/networkinterface.go
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,11 @@ type RemoteReadReceipt interface {
GetReadUpTo() time.Time
}

type RemoteReadReceiptWithStreamOrder interface {
RemoteReadReceipt
GetReadUpToStreamOrder() int64
}

type RemoteDeliveryReceipt interface {
RemoteEvent
GetReceiptTargets() []networkid.MessageID
Expand Down
28 changes: 21 additions & 7 deletions bridgev2/portal.go
Original file line number Diff line number Diff line change
Expand Up @@ -2693,17 +2693,31 @@ func (portal *Portal) handleRemoteReadReceipt(ctx context.Context, source *UserL
log.Err(err).Time("read_up_to", readUpTo).Msg("Failed to get target message for read receipt")
}
}
if lastTarget == nil {
log.Warn().Msg("No target message found for read receipt")
return
}
sender := evt.GetSender()
intent := portal.GetIntentFor(ctx, sender, source, RemoteEventReadReceipt)
err = intent.MarkRead(ctx, portal.MXID, lastTarget.MXID, getEventTS(evt))
var addTargetLog func(evt *zerolog.Event) *zerolog.Event
if lastTarget == nil {
sevt, evtOK := evt.(RemoteReadReceiptWithStreamOrder)
soIntent, soIntentOK := intent.(StreamOrderReadingMatrixAPI)
if !evtOK || !soIntentOK || sevt.GetReadUpToStreamOrder() == 0 {
log.Warn().Msg("No target message found for read receipt")
return
}
targetStreamOrder := sevt.GetReadUpToStreamOrder()
addTargetLog = func(evt *zerolog.Event) *zerolog.Event {
return evt.Int64("target_stream_order", targetStreamOrder)
}
err = soIntent.MarkStreamOrderRead(ctx, portal.MXID, targetStreamOrder, getEventTS(evt))
} else {
addTargetLog = func(evt *zerolog.Event) *zerolog.Event {
return evt.Stringer("target_mxid", lastTarget.MXID)
}
err = intent.MarkRead(ctx, portal.MXID, lastTarget.MXID, getEventTS(evt))
}
if err != nil {
log.Err(err).Stringer("target_mxid", lastTarget.MXID).Msg("Failed to bridge read receipt")
addTargetLog(log.Err(err)).Msg("Failed to bridge read receipt")
} else {
log.Debug().Stringer("target_mxid", lastTarget.MXID).Msg("Bridged read receipt")
addTargetLog(log.Debug()).Msg("Bridged read receipt")
}
if sender.IsFromMe {
portal.Bridge.DisappearLoop.StartAll(ctx, portal.MXID)
Expand Down
6 changes: 6 additions & 0 deletions bridgev2/simplevent/receipt.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ type Receipt struct {
LastTarget networkid.MessageID
Targets []networkid.MessageID
ReadUpTo time.Time

ReadUpToStreamOrder int64
}

var (
Expand All @@ -38,6 +40,10 @@ func (evt *Receipt) GetReadUpTo() time.Time {
return evt.ReadUpTo
}

func (evt *Receipt) GetReadUpToStreamOrder() int64 {
return evt.ReadUpToStreamOrder
}

type MarkUnread struct {
EventMeta
Unread bool
Expand Down