From ec7b330b908d0a954cb3a9d294ac5772a020ec03 Mon Sep 17 00:00:00 2001 From: Guy Van Sanden Date: Sat, 2 May 2026 13:02:27 +0200 Subject: [PATCH] Make bot auto-join rooms --- server/src/config.yml | 4 +++ server/src/requirements.txt | 2 +- server/src/tellmesrv.py | 58 ++++++++++++++++++++++++++++++------- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/server/src/config.yml b/server/src/config.yml index e69de29..3970932 100644 --- a/server/src/config.yml +++ b/server/src/config.yml @@ -0,0 +1,4 @@ +--- +matrix_homeserver: "" +matrix_access_token": "" +matrix_user_id: "" \ No newline at end of file diff --git a/server/src/requirements.txt b/server/src/requirements.txt index 6146dca..b475cdb 100644 --- a/server/src/requirements.txt +++ b/server/src/requirements.txt @@ -1,4 +1,4 @@ flask websocket-client pyyaml -matrix-client +matrix-nio diff --git a/server/src/tellmesrv.py b/server/src/tellmesrv.py index 070bf4a..1ff81dc 100644 --- a/server/src/tellmesrv.py +++ b/server/src/tellmesrv.py @@ -7,7 +7,9 @@ import random import logging import os from pprint import pprint -from matrix_client.client import MatrixClient +from nio import AsyncClient, MatrixRoom, RoomMessageText +from nio.exceptions import OlmUnverifiedDeviceError +import asyncio __version__ = "3.0.0" versionstring='Taurix TellMe server v' + __version__ @@ -71,6 +73,48 @@ def send_smp_message(target, message): return False +async def matrix_login_and_send(homeserver, access_token, user_id, target, message): + client = AsyncClient(homeserver, user_id) + client.access_token = access_token + + invited_rooms = [] + + async def auto_join_callback(room: MatrixRoom, event: RoomMessageText, client: AsyncClient): + pass + + async def invited_callback(room: MatrixRoom, event: RoomMessageText, client: AsyncClient): + invited_rooms.append(room.room_id) + + client.add_event_callback(auto_join_callback, RoomMessageText) + + try: + response = await client.sync(full_state=True) + for room_id, invite_state in client.invited_rooms.items(): + await client.join(room_id) + invited_rooms.append(room_id) + + if target not in client.rooms and target not in invited_rooms: + await client.join(target) + + room = client.rooms.get(target) + if room: + await client.room_send( + room_id=target, + message_type="m.room.message", + content={"msgtype": "m.text", "body": message} + ) + log.info("Sent message to Matrix room %s" % (target)) + return True + else: + log.error("Could not join Matrix room %s" % (target)) + return False + except Exception as e: + log.error("Failed to send Matrix message: %s" % (e)) + return False + finally: + await client.close() + + def send_matrix_message(target, message): try: homeserver = config.get('matrix_homeserver', 'https://matrix.org') @@ -81,15 +125,9 @@ def send_matrix_message(target, message): log.error("Matrix credentials not configured") return False - client = MatrixClient(homeserver) - client.login(token=access_token, user_id=user_id) - - room = client.join_room(target) - room.send_text(message) - - client.logout() - log.info("Sent message to Matrix room %s" % (target)) - return True + return asyncio.get_event_loop().run_until_complete( + matrix_login_and_send(homeserver, access_token, user_id, target, message) + ) except Exception as e: log.error("Failed to send message to Matrix: %s" % (e)) return False