From de5d6709d1c8b486389c118dda678b06e48d6e76 Mon Sep 17 00:00:00 2001 From: mrdumpty Date: Thu, 17 Jan 2019 20:16:32 +0400 Subject: [PATCH 1/3] Added new method to send messages, refactored to be more pythonic --- matrix_bot_api/matrix_bot_api.py | 64 +++++++++++++++++++----------- matrix_bot_api/mcommand_handler.py | 5 +-- matrix_bot_api/mhandler.py | 2 +- matrix_bot_api/mregex_handler.py | 2 +- 4 files changed, 45 insertions(+), 28 deletions(-) diff --git a/matrix_bot_api/matrix_bot_api.py b/matrix_bot_api/matrix_bot_api.py index 962fcc7..72c305d 100644 --- a/matrix_bot_api/matrix_bot_api.py +++ b/matrix_bot_api/matrix_bot_api.py @@ -6,44 +6,44 @@ class MatrixBotAPI: - # username - Matrix username - # password - Matrix password - # server - Matrix server url : port - # rooms - List of rooms ids to operate in, or None to accept all rooms - def __init__(self, username, password, server, rooms=None): + # username - Matrix username + # password - Matrix password + # server - Matrix server url : port + # rooms - List of rooms ids to operate in, or None to accept all rooms + # accept_invites - If true, accept invites to rooms + def __init__(self, username, password, server, rooms=None, accept_invites=True): self.username = username # Authenticate with given credentials self.client = MatrixClient(server) try: - self.client.login_with_password(username, password) + self.client.login(username, password) except MatrixRequestError as e: print(e) if e.code == 403: print("Bad username/password") except Exception as e: - print("Invalid server URL") - traceback.print_exc() - - # Store allowed rooms - self.rooms = rooms + print(e) + # Store allowed rooms. If rooms is None, store empty list + # of rooms and add all rooms we're currently in + if rooms: + self.rooms = rooms + else: + self.rooms = [] + for room in self.client.rooms.values(): + self.rooms.append(room) + print('Комнат: ', len(self.rooms)) # Store empty list of handlers self.handlers = [] - # If rooms is None, we should listen for invites and automatically accept them - if rooms is None: + # we should listen for invites and automatically accept them + if accept_invites: self.client.add_invite_listener(self.handle_invite) - self.rooms = [] - # Add all rooms we're currently in to self.rooms and add their callbacks - for room_id, room in self.client.get_rooms().items(): - room.add_listener(self.handle_message) - self.rooms.append(room_id) - else: - # Add the message callback for all specified rooms - for room in self.rooms: - room.add_listener(self.handle_message) + # Add handlers for all rooms + for room in self.rooms: + room.add_listener(self.handle_message) def add_handler(self, handler): self.handlers.append(handler) @@ -55,7 +55,7 @@ def handle_message(self, room, event): # Loop through all installed handlers and see if they need to be called for handler in self.handlers: - if handler.test_callback(room, event): + if handler.test_callback(event): # This handler needs to be called try: handler.handle_callback(room, event) @@ -65,6 +65,7 @@ def handle_message(self, room, event): def handle_invite(self, room_id, state): print("Got invite to room: " + str(room_id)) print("Joining...") + print(state) room = self.client.join_room(room_id) # Add message callback for this room @@ -73,6 +74,23 @@ def handle_invite(self, room_id, state): # Add room to list self.rooms.append(room) + def send_message(self, message, room_id=None, room_alias=None): + if not room_id: + print('No room id') + if not room_alias: # send to all rooms if no room specified + print('No room alias') + for room in self.rooms: + print(room) + room.send_text(message) + return True + else: # no ID but we have alias, so get room_id from it + room_id = self.client.api.get_room_id(room_alias) + room = self.client.rooms.get(room_id) + if room and room in self.rooms: + room.send_text(message) + return True + return False + def start_polling(self): # Starts polling for messages self.client.start_listener_thread() diff --git a/matrix_bot_api/mcommand_handler.py b/matrix_bot_api/mcommand_handler.py index bc56789..4924316 100644 --- a/matrix_bot_api/mcommand_handler.py +++ b/matrix_bot_api/mcommand_handler.py @@ -2,8 +2,7 @@ Defines a matrix bot handler for commands """ import re - -from matrix_bot_api.mhandler import MHandler +from .mhandler import MHandler class MCommandHandler(MHandler): @@ -17,7 +16,7 @@ def __init__(self, command, handle_callback, cmd_char='!'): self.cmd_char = cmd_char # Function called by Matrix bot api to determine whether or not to handle this message - def test_command(self, room, event): + def test_command(self, event): # Test the message to see if it has our command if event['type'] == "m.room.message": if re.match(self.cmd_char + self.command, event['content']['body']): diff --git a/matrix_bot_api/mhandler.py b/matrix_bot_api/mhandler.py index 9701720..f443f39 100644 --- a/matrix_bot_api/mhandler.py +++ b/matrix_bot_api/mhandler.py @@ -3,7 +3,7 @@ """ -class MHandler(object): +class MHandler: # test_callback - function that takes a room and event and returns a boolean # indicating whether we should pass the message on to handle_callback # diff --git a/matrix_bot_api/mregex_handler.py b/matrix_bot_api/mregex_handler.py index 32aa684..cce81f9 100644 --- a/matrix_bot_api/mregex_handler.py +++ b/matrix_bot_api/mregex_handler.py @@ -15,7 +15,7 @@ def __init__(self, regex_str, handle_callback): MHandler.__init__(self, self.test_regex, handle_callback) self.regex_str = regex_str - def test_regex(self, room, event): + def test_regex(self, event): # Test the message and see if it matches the regex if event['type'] == "m.room.message": if re.search(self.regex_str, event['content']['body']): From 24075d3bb8c9702e7050f3353cedfde87acfbbbd Mon Sep 17 00:00:00 2001 From: mrdumpty Date: Thu, 17 Jan 2019 20:27:47 +0400 Subject: [PATCH 2/3] Removed some test prints --- matrix_bot_api/matrix_bot_api.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/matrix_bot_api/matrix_bot_api.py b/matrix_bot_api/matrix_bot_api.py index 72c305d..8d289e5 100644 --- a/matrix_bot_api/matrix_bot_api.py +++ b/matrix_bot_api/matrix_bot_api.py @@ -65,7 +65,6 @@ def handle_message(self, room, event): def handle_invite(self, room_id, state): print("Got invite to room: " + str(room_id)) print("Joining...") - print(state) room = self.client.join_room(room_id) # Add message callback for this room @@ -76,11 +75,8 @@ def handle_invite(self, room_id, state): def send_message(self, message, room_id=None, room_alias=None): if not room_id: - print('No room id') if not room_alias: # send to all rooms if no room specified - print('No room alias') for room in self.rooms: - print(room) room.send_text(message) return True else: # no ID but we have alias, so get room_id from it From 68fd8fdcee27e633b72a218f45b659d3d2d84d6a Mon Sep 17 00:00:00 2001 From: mrdumpty Date: Thu, 17 Jan 2019 20:45:42 +0400 Subject: [PATCH 3/3] Translate to english --- matrix_bot_api/matrix_bot_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix_bot_api/matrix_bot_api.py b/matrix_bot_api/matrix_bot_api.py index 8d289e5..4594ff8 100644 --- a/matrix_bot_api/matrix_bot_api.py +++ b/matrix_bot_api/matrix_bot_api.py @@ -33,7 +33,7 @@ def __init__(self, username, password, server, rooms=None, accept_invites=True): self.rooms = [] for room in self.client.rooms.values(): self.rooms.append(room) - print('Комнат: ', len(self.rooms)) + print('Total rooms: ', len(self.rooms)) # Store empty list of handlers self.handlers = []