From 7143ef20a1013e73dbb25bd7728b87613bea53fd Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Tue, 26 Apr 2022 14:38:45 +0100 Subject: [PATCH] Don't refresh notifier, use the memberships from the join response instead so that it doesn't load presence for members we are ommitting due to LL --- syncapi/streams/stream_presence.go | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/syncapi/streams/stream_presence.go b/syncapi/streams/stream_presence.go index 11316fa09..0d8bbf28c 100644 --- a/syncapi/streams/stream_presence.go +++ b/syncapi/streams/stream_presence.go @@ -87,22 +87,27 @@ func (p *PresenceStreamProvider) populatePresence( ignoreCache bool, ) error { // add newly joined rooms user presences - newlyJoined := joinedRooms(req.Response, req.Device.UserID) - if len(newlyJoined) > 0 { - // TODO: This refreshes all lists and is quite expensive - // The notifier should update the lists itself - if err := p.notifier.Load(ctx, p.DB); err != nil { - return err - } + if newlyJoined := joinedRooms(req.Response, req.Device.UserID); len(newlyJoined) > 0 { for _, roomID := range newlyJoined { - roomUsers := p.notifier.JoinedUsers(roomID) - for i := range roomUsers { - // we already got a presence from this user - if _, ok := presences[roomUsers[i]]; ok { + room, ok := req.Response.Rooms.Join[roomID] + if !ok { + continue + } + for _, stateEvent := range room.State.Events { + switch { + case stateEvent.Type != gomatrixserverlib.MRoomMember: + fallthrough + case stateEvent.StateKey == nil: + fallthrough + case *stateEvent.StateKey == "": + continue + } + userID := *stateEvent.StateKey + if _, ok := presences[userID]; ok { continue } var err error - presences[roomUsers[i]], err = p.DB.GetPresence(ctx, roomUsers[i]) + presences[userID], err = p.DB.GetPresence(ctx, userID) if err != nil { if err == sql.ErrNoRows { continue