From f250ef9e8b1f8889012f0420424336c0dde61998 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Sun, 18 Jul 2021 16:02:55 +0200 Subject: [PATCH 1/3] handle smaller sync responses introduced in synapse 1.38.0 --- matrix_client/client.py | 106 +++++++++++++++++++++------------------- 1 file changed, 57 insertions(+), 49 deletions(-) diff --git a/matrix_client/client.py b/matrix_client/client.py index af0e08f6..bb0db9eb 100644 --- a/matrix_client/client.py +++ b/matrix_client/client.py @@ -583,60 +583,68 @@ def _sync(self, timeout_ms=30000): response = self.api.sync(self.sync_token, timeout_ms, filter=self.sync_filter) self.sync_token = response["next_batch"] - for presence_update in response['presence']['events']: - for callback in self.presence_listeners.values(): - callback(presence_update) - - for room_id, invite_room in response['rooms']['invite'].items(): - for listener in self.invite_listeners: - listener(room_id, invite_room['invite_state']) - - for room_id, left_room in response['rooms']['leave'].items(): - for listener in self.left_listeners: - listener(room_id, left_room) - if room_id in self.rooms: - del self.rooms[room_id] + if 'presence' in response and 'events' in response['presence']: + for presence_update in response['presence']['events']: + for callback in self.presence_listeners.values(): + callback(presence_update) if self._encryption and 'device_one_time_keys_count' in response: self.olm_device.update_one_time_key_counts( response['device_one_time_keys_count']) - for room_id, sync_room in response['rooms']['join'].items(): - if room_id not in self.rooms: - self._mkroom(room_id) - room = self.rooms[room_id] - # TODO: the rest of this for loop should be in room object method - room.prev_batch = sync_room["timeline"]["prev_batch"] - - for event in sync_room["state"]["events"]: - event['room_id'] = room_id - room._process_state_event(event) - - for event in sync_room["timeline"]["events"]: - event['room_id'] = room_id - room._put_event(event) - - # TODO: global listeners can still exist but work by each - # room.listeners[uuid] having reference to global listener - - # Dispatch for client (global) listeners - for listener in self.listeners: - if ( - listener['event_type'] is None or - listener['event_type'] == event['type'] - ): - listener['callback'](event) - - for event in sync_room['ephemeral']['events']: - event['room_id'] = room_id - room._put_ephemeral_event(event) - - for listener in self.ephemeral_listeners: - if ( - listener['event_type'] is None or - listener['event_type'] == event['type'] - ): - listener['callback'](event) + if 'rooms' in response: + if 'invite' in response['rooms']: + for room_id, invite_room in response['rooms']['invite'].items(): + for listener in self.invite_listeners: + listener(room_id, invite_room['invite_state']) + + if 'leave' in response['rooms']: + for room_id, left_room in response['rooms']['leave'].items(): + for listener in self.left_listeners: + listener(room_id, left_room) + if room_id in self.rooms: + del self.rooms[room_id] + + if 'join' in response['rooms']: + for room_id, sync_room in response['rooms']['join'].items(): + if room_id not in self.rooms: + self._mkroom(room_id) + room = self.rooms[room_id] + # TODO: the rest of this for loop should be in room object method + room.prev_batch = sync_room["timeline"]["prev_batch"] + + if "events" in sync_room["state"]: + for event in sync_room["state"]["events"]: + event['room_id'] = room_id + room._process_state_event(event) + + if "events" in sync_room["timeline"]: + for event in sync_room["timeline"]["events"]: + event['room_id'] = room_id + room._put_event(event) + + # TODO: global listeners can still exist but work by each + # room.listeners[uuid] having reference to global listener + + # Dispatch for client (global) listeners + for listener in self.listeners: + if ( + listener['event_type'] is None or + listener['event_type'] == event['type'] + ): + listener['callback'](event) + + if "events" in sync_room["ephemeral"]: + for event in sync_room['ephemeral']['events']: + event['room_id'] = room_id + room._put_ephemeral_event(event) + + for listener in self.ephemeral_listeners: + if ( + listener['event_type'] is None or + listener['event_type'] == event['type'] + ): + listener['callback'](event) def get_user(self, user_id): """Deprecated. Return a User by their id. From 09bc43434b99473477dce040d6b92763ab3c6f04 Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Mon, 19 Jul 2021 14:18:01 +0200 Subject: [PATCH 2/3] added missing checks --- matrix_client/client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/matrix_client/client.py b/matrix_client/client.py index bb0db9eb..63a2f7ee 100644 --- a/matrix_client/client.py +++ b/matrix_client/client.py @@ -613,12 +613,12 @@ def _sync(self, timeout_ms=30000): # TODO: the rest of this for loop should be in room object method room.prev_batch = sync_room["timeline"]["prev_batch"] - if "events" in sync_room["state"]: + if "state" in sync_room and "events" in sync_room["state"]: for event in sync_room["state"]["events"]: event['room_id'] = room_id room._process_state_event(event) - if "events" in sync_room["timeline"]: + if "timeline" in sync_room and "events" in sync_room["timeline"]: for event in sync_room["timeline"]["events"]: event['room_id'] = room_id room._put_event(event) @@ -634,7 +634,7 @@ def _sync(self, timeout_ms=30000): ): listener['callback'](event) - if "events" in sync_room["ephemeral"]: + if "ephemeral" in sync_room and "events" in sync_room["ephemeral"]: for event in sync_room['ephemeral']['events']: event['room_id'] = room_id room._put_ephemeral_event(event) From 570c1fd33ff64f860ee19d99e33f71966f7b5a7b Mon Sep 17 00:00:00 2001 From: Marco Antonio Alvarez Date: Wed, 21 Jul 2021 16:06:35 +0200 Subject: [PATCH 3/3] minor style change to not indent so much --- matrix_client/client.py | 106 ++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/matrix_client/client.py b/matrix_client/client.py index 63a2f7ee..466cc427 100644 --- a/matrix_client/client.py +++ b/matrix_client/client.py @@ -592,59 +592,59 @@ def _sync(self, timeout_ms=30000): self.olm_device.update_one_time_key_counts( response['device_one_time_keys_count']) - if 'rooms' in response: - if 'invite' in response['rooms']: - for room_id, invite_room in response['rooms']['invite'].items(): - for listener in self.invite_listeners: - listener(room_id, invite_room['invite_state']) - - if 'leave' in response['rooms']: - for room_id, left_room in response['rooms']['leave'].items(): - for listener in self.left_listeners: - listener(room_id, left_room) - if room_id in self.rooms: - del self.rooms[room_id] - - if 'join' in response['rooms']: - for room_id, sync_room in response['rooms']['join'].items(): - if room_id not in self.rooms: - self._mkroom(room_id) - room = self.rooms[room_id] - # TODO: the rest of this for loop should be in room object method - room.prev_batch = sync_room["timeline"]["prev_batch"] - - if "state" in sync_room and "events" in sync_room["state"]: - for event in sync_room["state"]["events"]: - event['room_id'] = room_id - room._process_state_event(event) - - if "timeline" in sync_room and "events" in sync_room["timeline"]: - for event in sync_room["timeline"]["events"]: - event['room_id'] = room_id - room._put_event(event) - - # TODO: global listeners can still exist but work by each - # room.listeners[uuid] having reference to global listener - - # Dispatch for client (global) listeners - for listener in self.listeners: - if ( - listener['event_type'] is None or - listener['event_type'] == event['type'] - ): - listener['callback'](event) - - if "ephemeral" in sync_room and "events" in sync_room["ephemeral"]: - for event in sync_room['ephemeral']['events']: - event['room_id'] = room_id - room._put_ephemeral_event(event) - - for listener in self.ephemeral_listeners: - if ( - listener['event_type'] is None or - listener['event_type'] == event['type'] - ): - listener['callback'](event) + rooms = response.get("rooms", {}) + if 'invite' in rooms: + for room_id, invite_room in rooms['invite'].items(): + for listener in self.invite_listeners: + listener(room_id, invite_room['invite_state']) + + if 'leave' in rooms: + for room_id, left_room in rooms['leave'].items(): + for listener in self.left_listeners: + listener(room_id, left_room) + if room_id in self.rooms: + del self.rooms[room_id] + + if 'join' in rooms: + for room_id, sync_room in rooms['join'].items(): + if room_id not in self.rooms: + self._mkroom(room_id) + room = self.rooms[room_id] + # TODO: the rest of this for loop should be in room object method + room.prev_batch = sync_room["timeline"]["prev_batch"] + + if "state" in sync_room and "events" in sync_room["state"]: + for event in sync_room["state"]["events"]: + event['room_id'] = room_id + room._process_state_event(event) + + if "timeline" in sync_room and "events" in sync_room["timeline"]: + for event in sync_room["timeline"]["events"]: + event['room_id'] = room_id + room._put_event(event) + + # TODO: global listeners can still exist but work by each + # room.listeners[uuid] having reference to global listener + + # Dispatch for client (global) listeners + for listener in self.listeners: + if ( + listener['event_type'] is None or + listener['event_type'] == event['type'] + ): + listener['callback'](event) + + if "ephemeral" in sync_room and "events" in sync_room["ephemeral"]: + for event in sync_room['ephemeral']['events']: + event['room_id'] = room_id + room._put_ephemeral_event(event) + + for listener in self.ephemeral_listeners: + if ( + listener['event_type'] is None or + listener['event_type'] == event['type'] + ): + listener['callback'](event) def get_user(self, user_id): """Deprecated. Return a User by their id.