From 1228a7a3d74485005a15ba2a094fb654bb477ae5 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Tue, 11 Oct 2016 23:52:36 +0100 Subject: [PATCH 1/3] Added new listener filters & state event listening --- matrix_client/client.py | 56 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/matrix_client/client.py b/matrix_client/client.py index fbc67470..4d3eca98 100644 --- a/matrix_client/client.py +++ b/matrix_client/client.py @@ -196,14 +196,20 @@ def get_rooms(self): """ return self.rooms - def add_listener(self, callback): + def add_listener(self, callback, event_type=None): """ Add a listener that will send a callback when the client recieves an event. Args: callback (func(roomchunk)): Callback called when an event arrives. + event_type (str): The event_type to filter for. """ - self.listeners.append(callback) + self.listeners.append( + { + 'callback': callback, + 'event_type': event_type + } + ) def listen_for_events(self, timeout_ms=30000): """Deprecated. sync now pulls events from the request. @@ -238,7 +244,7 @@ def listen_forever(self, timeout_ms=30000): else: raise e except Exception as e: - self.logger.error("Exception thrown during sync\n %s", str(e)) + self.logger.error("Exception thrown during sync\n %s", e) def start_listener_thread(self, timeout_ms=30000): """ Start a listener thread to listen for events in the background. @@ -296,6 +302,13 @@ def _process_state_event(self, state_event, current_room): elif etype == "m.room.aliases": current_room.aliases = state_event["content"].get("aliases", None) + for listener in current_room.state_listeners: + if ( + listener['event_type'] is None or + listener['event_type'] == state_event['type'] + ): + listener['callback'](state_event) + def _sync(self, timeout_ms=30000): # TODO: Deal with presence # TODO: Deal with left rooms @@ -312,6 +325,14 @@ def _sync(self, timeout_ms=30000): for event in sync_room["timeline"]["events"]: room._put_event(event) + # 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) + def get_user(self, user_id): """ Return a User by their id. @@ -345,6 +366,7 @@ def __init__(self, client, room_id): self.room_id = room_id self.client = client self.listeners = [] + self.state_listeners = [] self.events = [] self.event_history_limit = 20 self.name = None @@ -387,21 +409,43 @@ def send_image(self, url, name, **imageinfo): extra_information=imageinfo ) - def add_listener(self, callback): + def add_listener(self, callback, event_type=None): """ Add a callback handler for events going to this room. Args: callback (func(roomchunk)): Callback called when an event arrives. + event_type (str): The event_type to filter for. + """ + self.listeners.append( + { + 'callback': callback, + 'event_type': event_type + } + ) + + def add_state_listener(self, callback, event_type=None): + """ Add a callback handler for state events going to this room. + + Args: + callback (func(roomchunk)): Callback called when an event arrives. + event_type (str): The event_type to filter for. """ - self.listeners.append(callback) + self.state_listeners.append( + { + 'callback': callback, + 'event_type': event_type + } + ) def _put_event(self, event): self.events.append(event) if len(self.events) > self.event_history_limit: self.events.pop(0) + # Dispatch for room-specific listeners for listener in self.listeners: - listener(self, event) + if listener['event_type'] is None or listener['event_type'] == event['type']: + listener['callback'](self, event) def get_events(self): """ Get the most recent events for this room. From 76448abefbd24aad91402b9a8a4fe376fcd9d03c Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Wed, 12 Oct 2016 15:05:10 +0100 Subject: [PATCH 2/3] Made logger global Changed logger.error to logger.exception --- matrix_client/client.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/matrix_client/client.py b/matrix_client/client.py index 4d3eca98..b37b7fb2 100644 --- a/matrix_client/client.py +++ b/matrix_client/client.py @@ -19,6 +19,8 @@ import sys +logger = logging.getLogger(__name__) + class MatrixClient(object): """ The client API for Matrix. For the raw HTTP calls, see MatrixHttpApi. @@ -82,8 +84,6 @@ def __init__(self, base_url, token=None, user_id=None, valid_cert_check=True): self.sync_token = None self.sync_filter = None - self.logger = logging.getLogger("matrix_client") - """ Time to wait before attempting a /sync request after failing.""" self.bad_sync_timeout_limit = 60 * 60 self.rooms = { @@ -234,17 +234,17 @@ def listen_forever(self, timeout_ms=30000): self._sync(timeout_ms) bad_sync_timeout = 5 except MatrixRequestError as e: - self.logger.warning("A MatrixRequestError occured during sync.") + logger.warning("A MatrixRequestError occured during sync.") if e.code >= 500: - self.logger.warning("Problem occured serverside. Waiting %i seconds", - bad_sync_timeout) + logger.warning("Problem occured serverside. Waiting %i seconds", + bad_sync_timeout) sleep(bad_sync_timeout) bad_sync_timeout = min(bad_sync_timeout * 2, self.bad_sync_timeout_limit) else: raise e except Exception as e: - self.logger.error("Exception thrown during sync\n %s", e) + logger.exception("Exception thrown during sync") def start_listener_thread(self, timeout_ms=30000): """ Start a listener thread to listen for events in the background. @@ -259,7 +259,7 @@ def start_listener_thread(self, timeout_ms=30000): thread.start() except: e = sys.exc_info()[0] - self.logger.error("Error: unable to start thread. %s", str(e)) + logger.error("Error: unable to start thread. %s", str(e)) def upload(self, content, content_type): """ Upload content to the home server and recieve a MXC url. From 80ae22f2dd0478549bf500c9764356d12ac62ed7 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Wed, 12 Oct 2016 15:28:40 +0100 Subject: [PATCH 3/3] Update client.py Fix logger spacing --- matrix_client/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix_client/client.py b/matrix_client/client.py index b37b7fb2..e2a0f40d 100644 --- a/matrix_client/client.py +++ b/matrix_client/client.py @@ -18,9 +18,9 @@ import logging import sys - logger = logging.getLogger(__name__) + class MatrixClient(object): """ The client API for Matrix. For the raw HTTP calls, see MatrixHttpApi.