- Matrix Client (підключення та синхронізація) - RBAC Checker (перевірка прав через Postgres) - Job Creator (створення jobs з команд) - NATS Publisher (публікація jobs у streams) - K8s deployment - README з документацією Команди: !embed, !retrieve, !summarize TODO: Реальна інтеграція з Matrix homeserver, статуси результатів
82 lines
3.0 KiB
Python
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}")
|