""" Matrix Client — підключення до Matrix та обробка повідомлень """ import asyncio from typing import Optional, Callable from nio import AsyncClient, MatrixRoom, RoomMessageText from nio.events import Event class MatrixClient: def __init__(self, homeserver: str, user: str, password: str, room_id: str, message_handler: Callable): self.homeserver = homeserver self.user = user self.password = password self.room_id = room_id self.message_handler = message_handler self.client: Optional[AsyncClient] = None self.sync_task: Optional[asyncio.Task] = None async def connect(self): """Підключення до Matrix""" try: self.client = AsyncClient(self.homeserver, self.user) await self.client.login(self.password) print(f"✅ Підключено до Matrix: {self.user}") except Exception as e: print(f"❌ Помилка підключення до Matrix: {e}") raise async def disconnect(self): """Відключення від Matrix""" if self.sync_task: self.sync_task.cancel() if self.client: await self.client.close() print("✅ Відключено від Matrix") async def sync(self): """Синхронізація Matrix (слухання повідомлень)""" if not self.client: raise RuntimeError("Matrix client не підключено") # Callback для обробки повідомлень async def message_callback(room: MatrixRoom, event: RoomMessageText): await self.message_handler(event) # Додаємо callback self.client.add_event_callback(message_callback, RoomMessageText) # Запускаємо синхронізацію в окремому task self.sync_task = asyncio.create_task(self._sync_loop()) async def _sync_loop(self): """Loop для синхронізації Matrix""" while True: try: await self.client.sync(timeout=30000) # 30 секунд except asyncio.CancelledError: break except Exception as e: print(f"⚠️ Помилка синхронізації Matrix: {e}") await asyncio.sleep(5) async def send_message(self, text: str): """Відправка повідомлення в Matrix room""" if not self.client: return try: await self.client.room_send( room_id=self.room_id, message_type="m.room.message", content={ "msgtype": "m.text", "body": text } ) except Exception as e: print(f"❌ Помилка відправки повідомлення в Matrix: {e}")