from __future__ import annotations import structlog from typing import Any from nio.api import RoomVisibility from nio.responses import RoomCreateError from adapter.matrix.store import ( get_user_meta, next_chat_id, set_room_meta, set_user_meta, ) logger = structlog.get_logger(__name__) async def handle_invite(client: Any, room: Any, event: Any, platform, store, auth_mgr, chat_mgr) -> None: matrix_user_id = getattr(event, "sender", "") display_name = getattr(room, "display_name", None) or matrix_user_id await client.join(room.room_id) existing = await get_user_meta(store, matrix_user_id) if existing and existing.get("space_id"): return user = await platform.get_or_create_user( external_id=matrix_user_id, platform="matrix", display_name=display_name, ) await auth_mgr.confirm(matrix_user_id) homeserver = matrix_user_id.split(":")[-1] space_resp = await client.room_create( name=f"Lambda — {display_name}", space=True, visibility=RoomVisibility.private, invite=[matrix_user_id], ) if isinstance(space_resp, RoomCreateError): logger.error( "space creation failed", user=matrix_user_id, error=getattr(space_resp, "status_code", None), ) return space_id = space_resp.room_id chat_resp = await client.room_create( name="Чат 1", visibility=RoomVisibility.private, is_direct=False, invite=[matrix_user_id], ) if isinstance(chat_resp, RoomCreateError): logger.error( "chat room creation failed", user=matrix_user_id, error=getattr(chat_resp, "status_code", None), ) return chat_room_id = chat_resp.room_id await client.room_put_state( room_id=space_id, event_type="m.space.child", content={"via": [homeserver]}, state_key=chat_room_id, ) chat_id = await next_chat_id(store, matrix_user_id) user_meta = await get_user_meta(store, matrix_user_id) or {} user_meta["space_id"] = space_id await set_user_meta(store, matrix_user_id, user_meta) await set_room_meta( store, chat_room_id, { "room_type": "chat", "chat_id": chat_id, "display_name": "Чат 1", "matrix_user_id": matrix_user_id, "space_id": space_id, }, ) await chat_mgr.get_or_create( user_id=matrix_user_id, chat_id=chat_id, platform="matrix", surface_ref=chat_room_id, name="Чат 1", ) welcome = ( f"Привет, {user.display_name or matrix_user_id}! Пиши — я здесь.\n\n" "Команды: !new · !chats · !rename · !archive · !skills · !soul · !safety · !settings" ) await client.room_send( chat_room_id, "m.room.message", {"msgtype": "m.text", "body": welcome}, )