5255388e2d
* refactor: move builtin stars to astrbot package fixes: #4202 * chore: ruff format * chore: remove print
89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
import aiohttp
|
|
|
|
from astrbot.api import star
|
|
from astrbot.api.event import AstrMessageEvent, MessageEventResult
|
|
from astrbot.core.config.default import VERSION
|
|
from astrbot.core.star import command_management
|
|
from astrbot.core.utils.io import get_dashboard_version
|
|
|
|
|
|
class HelpCommand:
|
|
def __init__(self, context: star.Context):
|
|
self.context = context
|
|
|
|
async def _query_astrbot_notice(self):
|
|
try:
|
|
async with aiohttp.ClientSession(trust_env=True) as session:
|
|
async with session.get(
|
|
"https://astrbot.app/notice.json",
|
|
timeout=2,
|
|
) as resp:
|
|
return (await resp.json())["notice"]
|
|
except BaseException:
|
|
return ""
|
|
|
|
async def _build_reserved_command_lines(self) -> list[str]:
|
|
"""
|
|
使用实时指令配置生成内置指令清单,确保重命名/禁用后与实际生效状态保持一致。
|
|
"""
|
|
try:
|
|
commands = await command_management.list_commands()
|
|
except BaseException:
|
|
return []
|
|
|
|
lines: list[str] = []
|
|
hidden_commands = {"set", "unset", "websearch"}
|
|
|
|
def walk(items: list[dict], indent: int = 0):
|
|
for item in items:
|
|
if not item.get("reserved") or not item.get("enabled"):
|
|
continue
|
|
# 仅展示顶级指令或指令组
|
|
if item.get("type") == "sub_command":
|
|
continue
|
|
if item.get("parent_signature"):
|
|
continue
|
|
|
|
effective = (
|
|
item.get("effective_command")
|
|
or item.get("original_command")
|
|
or item.get("handler_name")
|
|
)
|
|
if not effective:
|
|
continue
|
|
if effective in hidden_commands:
|
|
continue
|
|
|
|
description = item.get("description") or ""
|
|
desc_text = f" - {description}" if description else ""
|
|
indent_prefix = " " * indent
|
|
lines.append(f"{indent_prefix}/{effective}{desc_text}")
|
|
|
|
walk(commands)
|
|
return lines
|
|
|
|
async def help(self, event: AstrMessageEvent):
|
|
"""查看帮助"""
|
|
notice = ""
|
|
try:
|
|
notice = await self._query_astrbot_notice()
|
|
except BaseException:
|
|
pass
|
|
|
|
dashboard_version = await get_dashboard_version()
|
|
command_lines = await self._build_reserved_command_lines()
|
|
commands_section = (
|
|
"\n".join(command_lines) if command_lines else "暂无启用的内置指令"
|
|
)
|
|
|
|
msg_parts = [
|
|
f"AstrBot v{VERSION}(WebUI: {dashboard_version})",
|
|
"内置指令:",
|
|
commands_section,
|
|
]
|
|
if notice:
|
|
msg_parts.append(notice)
|
|
msg = "\n".join(msg_parts)
|
|
|
|
event.set_result(MessageEventResult().message(msg).use_t2i(False))
|