mirror of
https://github.com/tulir/mautrix-whatsapp
synced 2024-09-27 20:18:59 +02:00
Use atomic read receipts on hungryserv backfill
This commit is contained in:
parent
2015d6f963
commit
528683372b
1 changed files with 17 additions and 9 deletions
|
@ -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,14 +330,14 @@ func (user *User) backfillInChunks(req *database.Backfill, conv *database.Histor
|
|||
portal.updateBackfillStatus(backfillState)
|
||||
}
|
||||
|
||||
if !conv.MarkedAsUnread && conv.UnreadCount == 0 {
|
||||
if isLatestEvents && !shouldAtomicallyMarkAsRead {
|
||||
if shouldMarkAsRead {
|
||||
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 {
|
||||
} else if conv.MarkedAsUnread && user.bridge.Config.Bridge.SyncManualMarkedUnread {
|
||||
user.markUnread(portal, true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) shouldCreatePortalForHistorySync(conv *database.HistorySyncConversation, portal *Portal) bool {
|
||||
if len(portal.MXID) > 0 {
|
||||
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue