mirror of
https://github.com/matrix-org/dendrite.git
synced 2026-01-12 08:33:10 -06:00
I was not seeing unread notifications in sync, even if they were written to the db Notifications are in their own stream, but the code was trying to tack them onto the join room stream. If the offsets “happened” to line up, you might get a count here or there, but they would be totally wrong (jump from 1 to 0 to 2, etc) To fix, put them in their own top level object, handle them on the client. Signed-off-by: Austin Ellis <austin@hntlabs.com>
65 lines
1.8 KiB
Go
65 lines
1.8 KiB
Go
package streams
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/matrix-org/dendrite/syncapi/types"
|
|
)
|
|
|
|
type NotificationDataStreamProvider struct {
|
|
StreamProvider
|
|
}
|
|
|
|
func (p *NotificationDataStreamProvider) Setup() {
|
|
p.StreamProvider.Setup()
|
|
|
|
id, err := p.DB.MaxStreamPositionForNotificationData(context.Background())
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
p.latest = id
|
|
}
|
|
|
|
func (p *NotificationDataStreamProvider) CompleteSync(
|
|
ctx context.Context,
|
|
req *types.SyncRequest,
|
|
) types.StreamPosition {
|
|
return p.IncrementalSync(ctx, req, 0, p.LatestPosition(ctx))
|
|
}
|
|
|
|
func (p *NotificationDataStreamProvider) IncrementalSync(
|
|
ctx context.Context,
|
|
req *types.SyncRequest,
|
|
from, to types.StreamPosition,
|
|
) types.StreamPosition {
|
|
// We want counts for all possible rooms, so always start from zero.
|
|
countsByRoom, err := p.DB.GetUserUnreadNotificationCounts(ctx, req.Device.UserID, from, to)
|
|
if err != nil {
|
|
req.Log.WithError(err).Error("GetUserUnreadNotificationCounts failed")
|
|
return from
|
|
}
|
|
|
|
// We're merely decorating existing rooms. Note that the Join map
|
|
// values are not pointers.
|
|
for roomID, jr := range req.Response.Rooms.Join {
|
|
counts := countsByRoom[roomID]
|
|
if counts == nil {
|
|
continue
|
|
}
|
|
jr.UnreadNotifications.HighlightCount = counts.UnreadHighlightCount
|
|
jr.UnreadNotifications.NotificationCount = counts.UnreadNotificationCount
|
|
req.Response.Rooms.Join[roomID] = jr
|
|
}
|
|
|
|
// BEGIN ZION CODE but return all notifications regardless of whether they're in a room we're in.
|
|
for roomID, counts := range countsByRoom {
|
|
unreadNotificationsData := *types.NewUnreadNotificationsResponse()
|
|
|
|
unreadNotificationsData.HighlightCount = counts.UnreadHighlightCount
|
|
unreadNotificationsData.NotificationCount = counts.UnreadNotificationCount
|
|
req.Response.Rooms.UnreadNotifications[roomID] = unreadNotificationsData
|
|
}
|
|
// END ZION CODE
|
|
return to
|
|
}
|