145 lines
5 KiB
Python
145 lines
5 KiB
Python
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}.")]
|