diff options
author | Andrew Morgan <andrew@amorgan.xyz> | 2021-03-18 16:14:08 +0000 |
---|---|---|
committer | Andrew Morgan <andrew@amorgan.xyz> | 2021-03-18 16:20:34 +0000 |
commit | 0c49a14aecee72878abf3b7b14c37d2ca7142ac5 (patch) | |
tree | 34d2686d10c046b4f8c821398fdf946a30e8acb1 | |
parent | Add a built-in PresenceRouter class (diff) | |
download | synapse-0c49a14aecee72878abf3b7b14c37d2ca7142ac5.tar.xz |
Modify `get_interested_parties` and `get_interested_remotes` to query PresenceRouter
This commit asks the PresenceRouter for any users - in addition to those from users that they share a room with - that should receive the given presence updates. These methods are called when routing new presence updates around as they come in. * `get_interested_parties` is called when figuring out which local and remote users to send presence to. For local users, their sync streams will be woken up. * `get_interested_remotes` is specifically for figuring out which remote user(s) a given presence update needs to go to.
-rw-r--r-- | synapse/handlers/presence.py | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index 54631b4ee2..872a540b8c 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -1306,14 +1306,15 @@ def handle_update(prev_state, new_state, is_mine, wheel_timer, now): async def get_interested_parties( - store: DataStore, states: List[UserPresenceState] + store: DataStore, presence_router: PresenceRouter, states: List[UserPresenceState] ) -> Tuple[Dict[str, List[UserPresenceState]], Dict[str, List[UserPresenceState]]]: """Given a list of states return which entities (rooms, users) are interested in the given states. Args: - store - states + store: The homeserver's data store. + presence_router: A module for augmenting the destinations for presence updates. + states: A list of incoming user presence updates. Returns: A 2-tuple of `(room_ids_to_states, users_to_states)`, @@ -1329,11 +1330,22 @@ async def get_interested_parties( # Always notify self users_to_states.setdefault(state.user_id, []).append(state) + # Ask a presence routing module for any additional parties if one + # is loaded. + router_users_to_states = await presence_router.get_users_for_states(states) + + # Update the dictionaries with additional destinations and state to send + for user_id, user_states in router_users_to_states.items(): + users_to_states.setdefault(user_id, []).extend(user_states) + return room_ids_to_states, users_to_states async def get_interested_remotes( - store: DataStore, states: List[UserPresenceState], state_handler: StateHandler + store: DataStore, + presence_router: PresenceRouter, + states: List[UserPresenceState], + state_handler: StateHandler, ) -> List[Tuple[Collection[str], List[UserPresenceState]]]: """Given a list of presence states figure out which remote servers should be sent which. @@ -1341,9 +1353,10 @@ async def get_interested_remotes( All the presence states should be for local users only. Args: - store - states - state_handler + store: The homeserver's data store. + presence_router: A module for augmenting the destinations for presence updates. + states: A list of incoming user presence updates. + state_handler: Returns: A list of 2-tuples of destinations and states, where for @@ -1355,7 +1368,9 @@ async def get_interested_remotes( # First we look up the rooms each user is in (as well as any explicit # subscriptions), then for each distinct room we look up the remote # hosts in those rooms. - room_ids_to_states, users_to_states = await get_interested_parties(store, states) + room_ids_to_states, users_to_states = await get_interested_parties( + store, presence_router, states + ) for room_id, states in room_ids_to_states.items(): hosts = await state_handler.get_current_hosts_in_room(room_id) |