from __future__ import annotations from adapter.matrix.reactions import build_skills_text from core.protocol import IncomingCommand, OutgoingMessage, SettingsAction 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: return [ OutgoingMessage( chat_id=event.chat_id, text=( "⚙️ Настройки Matrix\n" "!skills\n" "!connectors\n" "!soul [field value]\n" "!safety [trigger on|off]\n" "!plan\n" "!status\n" "!whoami" ), ) ] 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}.")]