🚀 Matrix Gateway: базова реалізація v1
- Matrix Client (підключення та синхронізація) - RBAC Checker (перевірка прав через Postgres) - Job Creator (створення jobs з команд) - NATS Publisher (публікація jobs у streams) - K8s deployment - README з документацією Команди: !embed, !retrieve, !summarize TODO: Реальна інтеграція з Matrix homeserver, статуси результатів
This commit is contained in:
81
infrastructure/matrix-gateway/gateway/matrix_client.py
Normal file
81
infrastructure/matrix-gateway/gateway/matrix_client.py
Normal file
@@ -0,0 +1,81 @@
|
||||
"""
|
||||
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}")
|
||||
Reference in New Issue
Block a user