mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-02 10:56:06 -04:00
Fix a couple of bugs in presence handler related to pushing updatesto the correct user. Fix presence tests.
This commit is contained in:
parent
8113eb7c79
commit
5dd38d579b
5 changed files with 200 additions and 90 deletions
|
@ -260,7 +260,6 @@ class PresenceHandler(BaseHandler):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def user_joined_room(self, user, room_id):
|
||||
statuscache = self._get_or_make_usercache(user)
|
||||
|
||||
if user.is_mine:
|
||||
self.push_update_to_local_and_remote(
|
||||
|
@ -268,13 +267,25 @@ class PresenceHandler(BaseHandler):
|
|||
room_ids=[room_id],
|
||||
statuscache=self._get_or_offline_usercache(user),
|
||||
)
|
||||
|
||||
else:
|
||||
self.push_update_to_clients_2(
|
||||
self.push_update_to_clients(
|
||||
observed_user=user,
|
||||
room_ids=[room_id],
|
||||
statuscache=self._get_or_offline_usercache(user),
|
||||
)
|
||||
|
||||
# We also want to tell them about current presence of people.
|
||||
rm_handler = self.homeserver.get_handlers().room_member_handler
|
||||
curr_users = yield rm_handler.get_room_members(room_id)
|
||||
|
||||
for local_user in [c for c in curr_users if c.is_mine]:
|
||||
self.push_update_to_local_and_remote(
|
||||
observed_user=local_user,
|
||||
users_to_push=[user],
|
||||
statuscache=self._get_or_offline_usercache(local_user),
|
||||
)
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def send_invite(self, observer_user, observed_user):
|
||||
if not observer_user.is_mine:
|
||||
|
@ -405,8 +416,13 @@ class PresenceHandler(BaseHandler):
|
|||
|
||||
if state is None:
|
||||
state = yield self.store.get_presence_state(user.localpart)
|
||||
else:
|
||||
# statuscache = self._get_or_make_usercache(user)
|
||||
# self._user_cachemap_latest_serial += 1
|
||||
# statuscache.update(state, self._user_cachemap_latest_serial)
|
||||
pass
|
||||
|
||||
_, remote_domains = yield self.push_update_to_local_and_remote(
|
||||
yield self.push_update_to_local_and_remote(
|
||||
observed_user=user,
|
||||
users_to_push=target_users,
|
||||
room_ids=room_ids,
|
||||
|
@ -417,6 +433,14 @@ class PresenceHandler(BaseHandler):
|
|||
if target_user.is_mine:
|
||||
self._start_polling_local(user, target_user)
|
||||
|
||||
# We want to tell the person that just came online
|
||||
# presence state of people they are interested in?
|
||||
self.push_update_to_clients(
|
||||
observed_user=target_user,
|
||||
users_to_push=[user],
|
||||
statuscache=self._get_or_offline_usercache(target_user),
|
||||
)
|
||||
|
||||
deferreds = []
|
||||
remote_users = [u for u in target_users if not u.is_mine]
|
||||
remoteusers_by_domain = partition(remote_users, lambda u: u.domain)
|
||||
|
@ -544,13 +568,7 @@ class PresenceHandler(BaseHandler):
|
|||
yield self.push_update_to_local_and_remote(
|
||||
observed_user=user,
|
||||
users_to_push=localusers,
|
||||
room_ids=room_ids,
|
||||
statuscache=statuscache,
|
||||
)
|
||||
|
||||
self.push_update_to_clients_2(
|
||||
observed_user=user,
|
||||
users_to_push=localusers,
|
||||
remote_domains=remotedomains,
|
||||
room_ids=room_ids,
|
||||
statuscache=statuscache,
|
||||
)
|
||||
|
@ -570,12 +588,17 @@ class PresenceHandler(BaseHandler):
|
|||
self.clock.time_msec() - state.pop("mtime")
|
||||
)
|
||||
|
||||
user_state = {
|
||||
"user_id": user.to_string(),
|
||||
}
|
||||
user_state.update(**state)
|
||||
|
||||
yield self.federation.send_edu(
|
||||
destination=destination,
|
||||
edu_type="m.presence",
|
||||
content={
|
||||
"push": [
|
||||
dict(user_id=user.to_string(), **state),
|
||||
user_state,
|
||||
],
|
||||
}
|
||||
)
|
||||
|
@ -610,7 +633,7 @@ class PresenceHandler(BaseHandler):
|
|||
self._user_cachemap_latest_serial += 1
|
||||
statuscache.update(state, serial=self._user_cachemap_latest_serial)
|
||||
|
||||
self.push_update_to_clients_2(
|
||||
self.push_update_to_clients(
|
||||
observed_user=user,
|
||||
users_to_push=observers,
|
||||
room_ids=room_ids,
|
||||
|
@ -652,6 +675,7 @@ class PresenceHandler(BaseHandler):
|
|||
@defer.inlineCallbacks
|
||||
def push_update_to_local_and_remote(self, observed_user,
|
||||
users_to_push=[], room_ids=[],
|
||||
remote_domains=[],
|
||||
statuscache=None):
|
||||
|
||||
localusers, remoteusers = partitionbool(
|
||||
|
@ -661,14 +685,15 @@ class PresenceHandler(BaseHandler):
|
|||
|
||||
localusers = set(localusers)
|
||||
|
||||
self.push_update_to_clients_2(
|
||||
observed_user,
|
||||
self.push_update_to_clients(
|
||||
observed_user=observed_user,
|
||||
users_to_push=localusers,
|
||||
room_ids=room_ids,
|
||||
statuscache=statuscache,
|
||||
)
|
||||
|
||||
remote_domains = set([r.domain for r in remoteusers])
|
||||
remote_domains = set(remote_domains)
|
||||
remote_domains |= set([r.domain for r in remoteusers])
|
||||
for room_id in room_ids:
|
||||
remote_domains.update(
|
||||
(yield self.store.get_joined_hosts_for_room(room_id))
|
||||
|
@ -689,10 +714,8 @@ class PresenceHandler(BaseHandler):
|
|||
|
||||
defer.returnValue((localusers, remote_domains))
|
||||
|
||||
def push_update_to_clients_2(self, observed_user, users_to_push=[],
|
||||
def push_update_to_clients(self, observed_user, users_to_push=[],
|
||||
room_ids=[], statuscache=None):
|
||||
statuscache.make_event(user=observed_user, clock=self.clock)
|
||||
|
||||
self.notifier.on_new_user_event(
|
||||
users_to_push,
|
||||
room_ids,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue