Use atomic read receipts on hungryserv backfill

This commit is contained in:
Tulir Asokan 2022-12-09 13:06:36 +02:00
parent 2015d6f963
commit 528683372b

View file

@ -186,7 +186,7 @@ func (user *User) backfillInChunks(req *database.Backfill, conv *database.Histor
var forwardPrevID id.EventID
var timeEnd *time.Time
var isLatestEvents bool
var isLatestEvents, shouldMarkAsRead, shouldAtomicallyMarkAsRead bool
portal.latestEventBackfillLock.Lock()
if req.BackfillType == database.BackfillForward {
// TODO this overrides the TimeStart set when enqueuing the backfill
@ -215,6 +215,11 @@ func (user *User) backfillInChunks(req *database.Backfill, conv *database.Histor
// This might involve sending events at the end of the room as non-historical events,
// make sure we don't process messages until this is done.
defer portal.latestEventBackfillLock.Unlock()
isUnread := conv.MarkedAsUnread || conv.UnreadCount > 0
isTooOld := user.bridge.Config.Bridge.HistorySync.UnreadHoursThreshold > 0 && conv.LastMessageTimestamp.Before(time.Now().Add(time.Duration(-user.bridge.Config.Bridge.HistorySync.UnreadHoursThreshold)*time.Hour))
shouldMarkAsRead = !isUnread || isTooOld
shouldAtomicallyMarkAsRead = shouldMarkAsRead && user.bridge.Config.Homeserver.Software == bridgeconfig.SoftwareHungry
}
allMsgs := user.bridge.DB.HistorySync.GetMessagesBetween(user.MXID, conv.ConversationID, req.TimeStart, timeEnd, req.MaxTotalEvents)
@ -286,7 +291,7 @@ func (user *User) backfillInChunks(req *database.Backfill, conv *database.Histor
if len(msgs) > 0 {
time.Sleep(time.Duration(req.BatchDelay) * time.Second)
user.log.Debugfln("Backfilling %d messages in %s (queue ID: %d)", len(msgs), portal.Key.JID, req.QueueID)
resp := portal.backfill(user, msgs, req.BackfillType == database.BackfillForward, isLatestEvents, forwardPrevID)
resp := portal.backfill(user, msgs, req.BackfillType == database.BackfillForward, isLatestEvents, shouldAtomicallyMarkAsRead, forwardPrevID)
if resp != nil && (resp.BaseInsertionEventID != "" || !isLatestEvents) {
insertionEventIds = append(insertionEventIds, resp.BaseInsertionEventID)
}
@ -325,12 +330,12 @@ func (user *User) backfillInChunks(req *database.Backfill, conv *database.Histor
portal.updateBackfillStatus(backfillState)
}
if !conv.MarkedAsUnread && conv.UnreadCount == 0 {
user.markSelfReadFull(portal)
} else if user.bridge.Config.Bridge.HistorySync.UnreadHoursThreshold > 0 && conv.LastMessageTimestamp.Before(time.Now().Add(time.Duration(-user.bridge.Config.Bridge.HistorySync.UnreadHoursThreshold)*time.Hour)) {
user.markSelfReadFull(portal)
} else if user.bridge.Config.Bridge.SyncManualMarkedUnread {
user.markUnread(portal, true)
if isLatestEvents && !shouldAtomicallyMarkAsRead {
if shouldMarkAsRead {
user.markSelfReadFull(portal)
} else if conv.MarkedAsUnread && user.bridge.Config.Bridge.SyncManualMarkedUnread {
user.markUnread(portal, true)
}
}
}
@ -483,7 +488,7 @@ var (
BackfillStatusEvent = event.Type{Type: "com.beeper.backfill_status", Class: event.StateEventType}
)
func (portal *Portal) backfill(source *User, messages []*waProto.WebMessageInfo, isForward, isLatest bool, prevEventID id.EventID) *mautrix.RespBatchSend {
func (portal *Portal) backfill(source *User, messages []*waProto.WebMessageInfo, isForward, isLatest, atomicMarkAsRead bool, prevEventID id.EventID) *mautrix.RespBatchSend {
var req mautrix.ReqBatchSend
var infos []*wrappedInfo
@ -499,6 +504,9 @@ func (portal *Portal) backfill(source *User, messages []*waProto.WebMessageInfo,
req.PrevEventID = prevEventID
}
req.BeeperNewMessages = isLatest && req.BatchID == ""
if atomicMarkAsRead {
req.BeeperMarkReadBy = source.MXID
}
beforeFirstMessageTimestampMillis := (int64(messages[len(messages)-1].GetMessageTimestamp()) * 1000) - 1
req.StateEventsAtStart = make([]*event.Event, 0)