Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Pull out _calculate_user_changes
Browse files Browse the repository at this point in the history
This didn't use any class instance state, so I made this a free function.
  • Loading branch information
David Robertson committed Dec 6, 2021
1 parent 0af0643 commit 963de4e
Showing 1 changed file with 32 additions and 24 deletions.
56 changes: 32 additions & 24 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -1593,30 +1593,10 @@ async def handle_room_entries(room_entry: "RoomSyncResultBuilder") -> None:
# 5. Work out which users have joined or left rooms we're in. We use this
# to build the device_list part of the sync response in
# `_generate_sync_entry_for_device_list`.
newly_joined_or_invited_or_knocked_users = set()
newly_left_users = set()
if since_token:
for joined_sync in sync_result_builder.joined:
it = itertools.chain(
joined_sync.timeline.events, joined_sync.state.values()
)
for event in it:
if event.type == EventTypes.Member:
if (
event.membership == Membership.JOIN
or event.membership == Membership.INVITE
or event.membership == Membership.KNOCK
):
newly_joined_or_invited_or_knocked_users.add(
event.state_key
)
else:
prev_content = event.unsigned.get("prev_content", {})
prev_membership = prev_content.get("membership", None)
if prev_membership == Membership.JOIN:
newly_left_users.add(event.state_key)

newly_left_users -= newly_joined_or_invited_or_knocked_users
(
newly_joined_or_invited_or_knocked_users,
newly_left_users,
) = _calculate_user_changes(sync_result_builder)

return (
set(newly_joined_rooms),
Expand Down Expand Up @@ -2353,6 +2333,34 @@ class SyncResultBuilder:
to_device: List[JsonDict] = attr.Factory(list)


def _calculate_user_changes(
sync_result_builder: "SyncResultBuilder",
) -> Tuple[Set[str], Set[str]]:
newly_joined_or_invited_or_knocked_users = set()
newly_left_users = set()
if sync_result_builder.since_token:
for joined_sync in sync_result_builder.joined:
it = itertools.chain(
joined_sync.timeline.events, joined_sync.state.values()
)
for event in it:
if event.type == EventTypes.Member:
if (
event.membership == Membership.JOIN
or event.membership == Membership.INVITE
or event.membership == Membership.KNOCK
):
newly_joined_or_invited_or_knocked_users.add(event.state_key)
else:
prev_content = event.unsigned.get("prev_content", {})
prev_membership = prev_content.get("membership", None)
if prev_membership == Membership.JOIN:
newly_left_users.add(event.state_key)

newly_left_users -= newly_joined_or_invited_or_knocked_users
return newly_joined_or_invited_or_knocked_users, newly_left_users


@attr.s(slots=True, auto_attribs=True)
class RoomSyncResultBuilder:
"""Stores information needed to create either a `JoinedSyncResult` or
Expand Down

0 comments on commit 963de4e

Please sign in to comment.