feat(matrix): add adapter baseline and platform-aware command hints
This commit is contained in:
parent
bcdaea5143
commit
82eb711844
20 changed files with 1127 additions and 3 deletions
145
adapter/matrix/handlers/settings.py
Normal file
145
adapter/matrix/handlers/settings.py
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
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}.")]
|
||||
Loading…
Add table
Add a link
Reference in a new issue