|
|
|
@ -26,7 +26,6 @@ import synapse.metrics |
|
|
|
|
from ._base import BaseHandler |
|
|
|
|
|
|
|
|
|
import logging |
|
|
|
|
from collections import OrderedDict |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
@ -144,7 +143,7 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
self._remote_offline_serials = [] |
|
|
|
|
|
|
|
|
|
# map any user to a UserPresenceCache |
|
|
|
|
self._user_cachemap = OrderedDict() # keep them sorted by serial |
|
|
|
|
self._user_cachemap = {} |
|
|
|
|
self._user_cachemap_latest_serial = 0 |
|
|
|
|
|
|
|
|
|
metrics.register_callback( |
|
|
|
@ -166,14 +165,6 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
else: |
|
|
|
|
return UserPresenceCache() |
|
|
|
|
|
|
|
|
|
def _bump_serial(self, user=None): |
|
|
|
|
self._user_cachemap_latest_serial += 1 |
|
|
|
|
|
|
|
|
|
if user: |
|
|
|
|
# Move to end |
|
|
|
|
cache = self._user_cachemap.pop(user) |
|
|
|
|
self._user_cachemap[user] = cache |
|
|
|
|
|
|
|
|
|
def registered_user(self, user): |
|
|
|
|
return self.store.create_presence(user.localpart) |
|
|
|
|
|
|
|
|
@ -309,7 +300,7 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
def changed_presencelike_data(self, user, state): |
|
|
|
|
statuscache = self._get_or_make_usercache(user) |
|
|
|
|
|
|
|
|
|
self._bump_serial(user=user) |
|
|
|
|
self._user_cachemap_latest_serial += 1 |
|
|
|
|
statuscache.update(state, serial=self._user_cachemap_latest_serial) |
|
|
|
|
|
|
|
|
|
return self.push_presence(user, statuscache=statuscache) |
|
|
|
@ -331,7 +322,7 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
|
|
|
|
|
# No actual update but we need to bump the serial anyway for the |
|
|
|
|
# event source |
|
|
|
|
self._bump_serial() |
|
|
|
|
self._user_cachemap_latest_serial += 1 |
|
|
|
|
statuscache.update({}, serial=self._user_cachemap_latest_serial) |
|
|
|
|
|
|
|
|
|
self.push_update_to_local_and_remote( |
|
|
|
@ -715,7 +706,7 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
|
|
|
|
|
statuscache = self._get_or_make_usercache(user) |
|
|
|
|
|
|
|
|
|
self._bump_serial(user=user) |
|
|
|
|
self._user_cachemap_latest_serial += 1 |
|
|
|
|
statuscache.update(state, serial=self._user_cachemap_latest_serial) |
|
|
|
|
|
|
|
|
|
if not observers and not room_ids: |
|
|
|
@ -877,15 +868,10 @@ class PresenceEventSource(object): |
|
|
|
|
|
|
|
|
|
updates = [] |
|
|
|
|
# TODO(paul): use a DeferredList ? How to limit concurrency. |
|
|
|
|
for observed_user in reversed(cachemap.keys()): |
|
|
|
|
for observed_user in cachemap.keys(): |
|
|
|
|
cached = cachemap[observed_user] |
|
|
|
|
|
|
|
|
|
# Since this is ordered in descending order of serial, we can just |
|
|
|
|
# stop once we've seen enough |
|
|
|
|
if cached.serial <= from_key: |
|
|
|
|
break |
|
|
|
|
|
|
|
|
|
if cached.serial > max_serial: |
|
|
|
|
if cached.serial <= from_key or cached.serial > max_serial: |
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
if not (yield self.is_visible(observer_user, observed_user)): |
|
|
|
|