|
|
|
@ -26,6 +26,7 @@ import synapse.metrics |
|
|
|
|
from ._base import BaseHandler |
|
|
|
|
|
|
|
|
|
import logging |
|
|
|
|
from collections import OrderedDict |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
@ -143,7 +144,7 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
self._remote_offline_serials = [] |
|
|
|
|
|
|
|
|
|
# map any user to a UserPresenceCache |
|
|
|
|
self._user_cachemap = {} |
|
|
|
|
self._user_cachemap = OrderedDict() # keep them sorted by serial |
|
|
|
|
self._user_cachemap_latest_serial = 0 |
|
|
|
|
|
|
|
|
|
metrics.register_callback( |
|
|
|
@ -165,6 +166,14 @@ 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) |
|
|
|
|
|
|
|
|
@ -301,7 +310,7 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
def changed_presencelike_data(self, user, state): |
|
|
|
|
statuscache = self._get_or_make_usercache(user) |
|
|
|
|
|
|
|
|
|
self._user_cachemap_latest_serial += 1 |
|
|
|
|
self._bump_serial(user=user) |
|
|
|
|
statuscache.update(state, serial=self._user_cachemap_latest_serial) |
|
|
|
|
|
|
|
|
|
return self.push_presence(user, statuscache=statuscache) |
|
|
|
@ -323,7 +332,7 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
|
|
|
|
|
# No actual update but we need to bump the serial anyway for the |
|
|
|
|
# event source |
|
|
|
|
self._user_cachemap_latest_serial += 1 |
|
|
|
|
self._bump_serial() |
|
|
|
|
statuscache.update({}, serial=self._user_cachemap_latest_serial) |
|
|
|
|
|
|
|
|
|
self.push_update_to_local_and_remote( |
|
|
|
@ -706,7 +715,7 @@ class PresenceHandler(BaseHandler): |
|
|
|
|
|
|
|
|
|
statuscache = self._get_or_make_usercache(user) |
|
|
|
|
|
|
|
|
|
self._user_cachemap_latest_serial += 1 |
|
|
|
|
self._bump_serial(user=user) |
|
|
|
|
statuscache.update(state, serial=self._user_cachemap_latest_serial) |
|
|
|
|
|
|
|
|
|
if not observers and not room_ids: |
|
|
|
|