diff --git a/adapter/matrix/handlers/chat.py b/adapter/matrix/handlers/chat.py index 9d20088..0d87a14 100644 --- a/adapter/matrix/handlers/chat.py +++ b/adapter/matrix/handlers/chat.py @@ -2,9 +2,14 @@ from __future__ import annotations from typing import Any, Awaitable, Callable -from adapter.matrix.store import set_room_meta +import structlog +from nio.responses import RoomCreateError + +from adapter.matrix.store import get_user_meta, next_chat_id, set_room_meta from core.protocol import IncomingCommand, OutgoingMessage +logger = structlog.get_logger(__name__) + async def _fallback_new_chat( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr @@ -40,22 +45,53 @@ def make_handle_new_chat( return await _fallback_new_chat(event, auth_mgr, platform, chat_mgr, settings_mgr) if not await auth_mgr.is_authenticated(event.user_id): - return [OutgoingMessage(chat_id=event.chat_id, text="Введите !start чтобы начать.")] + return [ + OutgoingMessage( + chat_id=event.chat_id, + text="Сначала примите приглашение бота.", + ) + ] + + user_meta = await get_user_meta(store, event.user_id) + space_id = (user_meta or {}).get("space_id") + if not space_id: + return [ + OutgoingMessage( + chat_id=event.chat_id, + text="Ошибка: Space не найден. Примите приглашение бота заново.", + ) + ] name = " ".join(event.args).strip() if event.args else "" - chats = await chat_mgr.list_active(event.user_id) - chat_id = f"C{len(chats) + 1}" + chat_id = await next_chat_id(store, event.user_id) room_name = name or f"Чат {chat_id}" response = await client.room_create( name=room_name, - invite=[event.user_id], + visibility="private", is_direct=False, ) + if isinstance(response, RoomCreateError): + logger.error( + "room_create failed", + user_id=event.user_id, + status_code=getattr(response, "status_code", None), + ) + return [OutgoingMessage(chat_id=event.chat_id, text="Не удалось создать комнату.")] + room_id = getattr(response, "room_id", None) if not room_id: return [OutgoingMessage(chat_id=event.chat_id, text="Не удалось создать комнату.")] + homeserver = event.user_id.split(":")[-1] + await client.room_put_state( + room_id=space_id, + event_type="m.space.child", + content={"via": [homeserver]}, + state_key=room_id, + ) + await client.room_invite(room_id, event.user_id) + await set_room_meta( store, room_id, @@ -64,6 +100,7 @@ def make_handle_new_chat( "chat_id": chat_id, "display_name": room_name, "matrix_user_id": event.user_id, + "space_id": space_id, }, ) ctx = await chat_mgr.get_or_create( @@ -76,7 +113,7 @@ def make_handle_new_chat( return [ OutgoingMessage( chat_id=event.chat_id, - text=f"Создан чат: {ctx.display_name} ({ctx.chat_id})\nКомната: {room_id}", + text=f"Создан чат: {ctx.display_name} ({ctx.chat_id})", ) ]