Files
microdao-daarion/infrastructure/matrix-gateway/gateway/matrix_client.py
Apple a0c3c0cbb5 🚀 Matrix Gateway: базова реалізація v1
- Matrix Client (підключення та синхронізація)
- RBAC Checker (перевірка прав через Postgres)
- Job Creator (створення jobs з команд)
- NATS Publisher (публікація jobs у streams)
- K8s deployment
- README з документацією

Команди: !embed, !retrieve, !summarize

TODO: Реальна інтеграція з Matrix homeserver, статуси результатів
2026-01-10 10:40:18 -08:00

82 lines
3.0 KiB
Python

"""
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}")