- replace reaction-based helper text with !yes/!no and !skill commands - resolve confirm and cancel through pending confirmation state - render !settings as a read-only status dashboard
174 lines
6.1 KiB
Python
174 lines
6.1 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:
|
|
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,
|
|
"",
|
|
"Изменить: !skills, !soul, !safety",
|
|
]
|
|
)
|
|
|
|
return [OutgoingMessage(chat_id=event.chat_id, text=dashboard)]
|
|
|
|
|
|
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}.")]
|