from __future__ import annotations from adapter.matrix.reactions import build_skills_text from core.protocol import IncomingCommand, OutgoingMessage, SettingsAction HELP_TEXT = "\n".join( [ "Команды", "", "!new [название] создать новый чат", "!chats список активных чатов", "!rename <название> переименовать текущий чат", "!archive архивировать текущий чат", "!settings общий обзор настроек", "!skills список навыков", "!soul [поле значение] показать или изменить личность", "!safety [триггер on/off] показать или изменить безопасность", "!status краткий статус", "!whoami показать ваш id", "!yes / !no подтвердить или отменить действие", ] ) def _render_mapping(title: str, data: dict | None) -> str: data = data or {} lines = [title] if not data: lines.append("Нет данных.") else: for key, value in data.items(): lines.append(f"• {key}: {value}") return "\n".join(lines) def _parse_bool(value: str) -> bool: return value.lower() in {"1", "true", "yes", "on", "enable", "enabled"} async def handle_settings( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: settings = await settings_mgr.get(event.user_id) chats = await chat_mgr.list_active(event.user_id) skills_lines = [] for name, enabled in settings.skills.items(): state = "on" if enabled else "off" skills_lines.append(f" {state} {name}") skills_text = "\n".join(skills_lines) if skills_lines else " нет навыков" soul_lines = [] for key, value in (settings.soul or {}).items(): soul_lines.append(f" {key}: {value}") soul_text = "\n".join(soul_lines) if soul_lines else " по умолчанию" safety_lines = [] for key, value in (settings.safety or {}).items(): state = "on" if value else "off" safety_lines.append(f" {state} {key}") safety_text = "\n".join(safety_lines) if safety_lines else " по умолчанию" chat_lines = [f" {chat.display_name} ({chat.chat_id})" for chat in chats] chats_text = "\n".join(chat_lines) if chat_lines else " нет активных чатов" dashboard = "\n".join( [ "Настройки", "", "Скиллы:", skills_text, "", "Личность:", soul_text, "", "Безопасность:", safety_text, "", f"Активные чаты ({len(chats)}):", chats_text, ] ) return [OutgoingMessage(chat_id=event.chat_id, text=dashboard)] async def handle_help( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: return [OutgoingMessage(chat_id=event.chat_id, text=HELP_TEXT)] async def handle_settings_skills( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: settings = await settings_mgr.get(event.user_id) return [OutgoingMessage(chat_id=event.chat_id, text=build_skills_text(settings))] async def handle_settings_connectors( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: settings = await settings_mgr.get(event.user_id) return [ OutgoingMessage( chat_id=event.chat_id, text=_render_mapping("🔗 Коннекторы", settings.connectors) ) ] async def handle_settings_soul( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: if len(event.args) >= 2: field = event.args[0] value = " ".join(event.args[1:]) await settings_mgr.apply( event.user_id, SettingsAction(action="set_soul", payload={"field": field, "value": value}), ) return [ OutgoingMessage(chat_id=event.chat_id, text=f"Личность обновлена: {field} = {value}") ] settings = await settings_mgr.get(event.user_id) return [ OutgoingMessage(chat_id=event.chat_id, text=_render_mapping("🧠 Личность", settings.soul)) ] async def handle_settings_safety( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: if len(event.args) >= 2: trigger = event.args[0] enabled = _parse_bool(event.args[1]) await settings_mgr.apply( event.user_id, SettingsAction(action="set_safety", payload={"trigger": trigger, "enabled": enabled}), ) state = "включена" if enabled else "выключена" return [OutgoingMessage(chat_id=event.chat_id, text=f"Безопасность {trigger} {state}")] settings = await settings_mgr.get(event.user_id) return [ OutgoingMessage( chat_id=event.chat_id, text=_render_mapping("🔒 Безопасность", settings.safety) ) ] async def handle_settings_plan( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: settings = await settings_mgr.get(event.user_id) return [OutgoingMessage(chat_id=event.chat_id, text=_render_mapping("💳 План", settings.plan))] async def handle_settings_status( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: chats = await chat_mgr.list_active(event.user_id) settings = await settings_mgr.get(event.user_id) text = "\n".join( [ "📊 Статус", f"Активных чатов: {len(chats)}", f"Скиллов: {len(settings.skills)}", f"Коннекторов: {len(settings.connectors)}", ] ) return [OutgoingMessage(chat_id=event.chat_id, text=text)] async def handle_settings_whoami( event: IncomingCommand, auth_mgr, platform, chat_mgr, settings_mgr ) -> list: return [OutgoingMessage(chat_id=event.chat_id, text=f"👤 {event.platform}:{event.user_id}")] async def handle_toggle_skill(event, auth_mgr, platform, chat_mgr, settings_mgr) -> list: settings = await settings_mgr.get(event.user_id) keys = list(settings.skills.keys()) skill = event.payload.get("skill") if not skill: idx = event.payload.get("skill_index") if isinstance(idx, int) and 1 <= idx <= len(keys): skill = keys[idx - 1] if not skill: return [OutgoingMessage(chat_id=event.chat_id, text="Ошибка: не удалось определить навык.")] enabled = not bool(settings.skills.get(skill, False)) await settings_mgr.apply( event.user_id, SettingsAction(action="toggle_skill", payload={"skill": skill, "enabled": enabled}), ) state = "включён" if enabled else "выключен" return [OutgoingMessage(chat_id=event.chat_id, text=f"Навык {skill} {state}.")]