Remove users from the remote_offline_serials list (and clean up empty elements) when they go online again

This commit is contained in:
Paul "LeoNerd" Evans 2015-04-23 19:01:37 +01:00
parent b3bda8a75f
commit e1e5e53127
2 changed files with 38 additions and 1 deletions

View File

@ -720,14 +720,24 @@ class PresenceHandler(BaseHandler):
statuscache=statuscache, statuscache=statuscache,
) )
user_id = user.to_string()
if state["presence"] == PresenceState.OFFLINE: if state["presence"] == PresenceState.OFFLINE:
self._remote_offline_serials.insert( self._remote_offline_serials.insert(
0, 0,
(self._user_cachemap_latest_serial, set([user.to_string()])) (self._user_cachemap_latest_serial, set([user_id]))
) )
while len(self._remote_offline_serials) > MAX_OFFLINE_SERIALS: while len(self._remote_offline_serials) > MAX_OFFLINE_SERIALS:
self._remote_offline_serials.pop() # remove the oldest self._remote_offline_serials.pop() # remove the oldest
del self._user_cachemap[user] del self._user_cachemap[user]
else:
# Remove the user from remote_offline_serials now that they're
# no longer offline
for idx, elem in enumerate(self._remote_offline_serials):
(_, user_ids) = elem
user_ids.discard(user_id)
if not user_ids:
self._remote_offline_serials.pop(idx)
for poll in content.get("poll", []): for poll in content.get("poll", []):
user = UserID.from_string(poll) user = UserID.from_string(poll)

View File

@ -916,6 +916,33 @@ class PresencePushTestCase(MockedDatastorePresenceTestCase):
] ]
) )
yield self.mock_federation_resource.trigger("PUT",
"/_matrix/federation/v1/send/1000001/",
_make_edu_json("elsewhere", "m.presence",
content={
"push": [
{"user_id": "@potato:remote",
"presence": "online"},
],
}
)
)
self.assertEquals(self.event_source.get_current_key(), 2)
(events, _) = yield self.event_source.get_new_events_for_user(
self.u_apple, 0, None
)
self.assertEquals(events,
[
{"type": "m.presence",
"content": {
"user_id": "@potato:remote",
"presence": ONLINE,
}}
]
)
@defer.inlineCallbacks @defer.inlineCallbacks
def test_join_room_local(self): def test_join_room_local(self):
self.room_members = [self.u_apple, self.u_banana] self.room_members = [self.u_apple, self.u_banana]