1
0
Fork 0
forked from Mirrors/gomuks

hicli/sync: recalculate unreads on redaction

This commit is contained in:
Tulir Asokan 2024-10-18 00:57:27 +03:00
parent 9254461795
commit 2179fb2c18
3 changed files with 9 additions and 6 deletions

View file

@ -467,15 +467,15 @@ func (e *Event) sqlVariables() []any {
} }
func (e *Event) GetNonPushUnreadType() UnreadType { func (e *Event) GetNonPushUnreadType() UnreadType {
if e.RelationType == event.RelReplace { if e.RelationType == event.RelReplace || e.RedactedBy != "" {
return UnreadTypeNone return UnreadTypeNone
} }
switch e.Type { switch e.Type {
case event.EventMessage.Type, event.EventSticker.Type: case event.EventMessage.Type, event.EventSticker.Type, event.EventUnstablePollStart.Type:
return UnreadTypeNormal return UnreadTypeNormal
case event.EventEncrypted.Type: case event.EventEncrypted.Type:
switch e.DecryptedType { switch e.DecryptedType {
case event.EventMessage.Type, event.EventSticker.Type: case event.EventMessage.Type, event.EventSticker.Type, event.EventUnstablePollStart.Type:
return UnreadTypeNormal return UnreadTypeNormal
} }
} }

View file

@ -31,7 +31,7 @@ const (
JOIN event ON receipt.event_id=event.event_id JOIN event ON receipt.event_id=event.event_id
WHERE receipt.room_id = $1 AND receipt.user_id = $2 WHERE receipt.room_id = $1 AND receipt.user_id = $2
) )
) ) AND unread_type > 0 AND redacted_by IS NULL
` `
) )

View file

@ -489,7 +489,7 @@ func (h *HiClient) processStateAndTimeline(
decryptionQueue := make(map[id.SessionID]*database.SessionRequest) decryptionQueue := make(map[id.SessionID]*database.SessionRequest)
allNewEvents := make([]*database.Event, 0, len(state.Events)+len(timeline.Events)) allNewEvents := make([]*database.Event, 0, len(state.Events)+len(timeline.Events))
newNotifications := make([]SyncNotification, 0) newNotifications := make([]SyncNotification, 0)
recalculatePreviewEvent := false var recalculatePreviewEvent, unreadMessagesWereMaybeRedacted bool
var newUnreadCounts database.UnreadCounts var newUnreadCounts database.UnreadCounts
addOldEvent := func(rowID database.EventRowID, evtID id.EventID) (dbEvt *database.Event, err error) { addOldEvent := func(rowID database.EventRowID, evtID id.EventID) (dbEvt *database.Event, err error) {
if rowID != 0 { if rowID != 0 {
@ -513,6 +513,9 @@ func (h *HiClient) processStateAndTimeline(
if dbEvt == nil { if dbEvt == nil {
return nil return nil
} }
if dbEvt.UnreadType > 0 {
unreadMessagesWereMaybeRedacted = true
}
if dbEvt.RelationType == event.RelReplace || dbEvt.RelationType == event.RelAnnotation { if dbEvt.RelationType == event.RelReplace || dbEvt.RelationType == event.RelAnnotation {
_, err = addOldEvent(0, dbEvt.RelatesTo) _, err = addOldEvent(0, dbEvt.RelatesTo)
if err != nil { if err != nil {
@ -677,7 +680,7 @@ func (h *HiClient) processStateAndTimeline(
return fmt.Errorf("failed to save receipts: %w", err) return fmt.Errorf("failed to save receipts: %w", err)
} }
} }
if len(newOwnReceipts) > 0 && newUnreadCounts.IsZero() { if !room.UnreadCounts.IsZero() && ((len(newOwnReceipts) > 0 && newUnreadCounts.IsZero()) || unreadMessagesWereMaybeRedacted) {
updatedRoom.UnreadCounts, err = h.DB.Room.CalculateUnreads(ctx, room.ID, h.Account.UserID) updatedRoom.UnreadCounts, err = h.DB.Room.CalculateUnreads(ctx, room.ID, h.Account.UserID)
if err != nil { if err != nil {
return fmt.Errorf("failed to recalculate unread counts: %w", err) return fmt.Errorf("failed to recalculate unread counts: %w", err)