新增QQ Bot适配器完整代码栈,包含: 1. 基础适配器入口与工具类封装 2. 会话管理、重试队列与流量控制 3. 命令系统与内置指令(ping/help/status等) 4. 富媒体消息处理与格式转换 5. 引用存储与审批管理 6. 凭证备份与会话持久化 7. 健康检查与交互回调系统
103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
from __future__ import annotations
|
|
|
|
import time
|
|
|
|
|
|
from .framework import CommandRegistry, CommandContext, CommandResult
|
|
|
|
_start_time = time.time()
|
|
|
|
|
|
async def _cmd_ping(ctx: CommandContext) -> CommandResult:
|
|
uptime = time.time() - _start_time
|
|
hours = int(uptime // 3600)
|
|
minutes = int((uptime % 3600) // 60)
|
|
seconds = int(uptime % 60)
|
|
|
|
msg = ctx.msg
|
|
user = msg.identity.channel_user_id or "Unknown"
|
|
return CommandResult(
|
|
success=True,
|
|
message=f"Pong! 在线时间: {hours}h {minutes}m {seconds}s\n发送者: {user}",
|
|
)
|
|
|
|
|
|
async def _cmd_help(ctx: CommandContext) -> CommandResult:
|
|
registry = ctx.adapter._command_registry if hasattr(ctx.adapter, "_command_registry") else None
|
|
if registry is None:
|
|
return CommandResult(success=True, message="命令系统未初始化。")
|
|
|
|
lines = ["可用命令:"]
|
|
seen: set[str] = set()
|
|
for name in sorted(registry.command_names):
|
|
cmd = registry._commands.get(name)
|
|
if cmd and name not in seen:
|
|
seen.add(name)
|
|
desc = cmd.description or "(无描述)"
|
|
usage = f" - 用法: {cmd.usage}" if cmd.usage else ""
|
|
lines.append(f" /{name} - {desc}{usage}")
|
|
|
|
return CommandResult(success=True, message="\n".join(lines))
|
|
|
|
|
|
async def _cmd_status(ctx: CommandContext) -> CommandResult:
|
|
adapter = ctx.adapter
|
|
status = getattr(adapter, "status", "unknown")
|
|
reconnect = getattr(adapter, "_reconnect_manager", None)
|
|
reconnect_state = reconnect.state.name if reconnect else "N/A"
|
|
circuit_breaker = getattr(adapter, "_circuit_breaker", None)
|
|
cb_state = "open" if circuit_breaker and circuit_breaker.is_open else "closed"
|
|
|
|
return CommandResult(
|
|
success=True,
|
|
message=(f"状态: {status}\n重连状态: {reconnect_state}\n熔断器: {cb_state}"),
|
|
)
|
|
|
|
|
|
async def _cmd_clearlogs(ctx: CommandContext) -> CommandResult:
|
|
adapter = ctx.adapter
|
|
known_users = getattr(adapter, "_known_users", None)
|
|
group_buffer = getattr(adapter, "_group_buffer", None)
|
|
|
|
if known_users:
|
|
known_users.clear()
|
|
if group_buffer:
|
|
group_buffer.gc()
|
|
|
|
return CommandResult(success=True, message="日志已清理(已知用户记录 + 过期群聊缓冲)。")
|
|
|
|
|
|
def register_builtin_commands(registry: CommandRegistry) -> CommandRegistry:
|
|
registry.register(
|
|
name="ping",
|
|
handler=_cmd_ping,
|
|
description="检测 Bot 是否在线",
|
|
usage="/ping",
|
|
aliases=["p"],
|
|
)
|
|
|
|
registry.register(
|
|
name="help",
|
|
handler=_cmd_help,
|
|
description="显示所有可用命令",
|
|
usage="/help",
|
|
aliases=["h"],
|
|
)
|
|
|
|
registry.register(
|
|
name="status",
|
|
handler=_cmd_status,
|
|
description="查看 Bot 运行状态",
|
|
usage="/status",
|
|
aliases=["st"],
|
|
)
|
|
|
|
registry.register(
|
|
name="clearlogs",
|
|
handler=_cmd_clearlogs,
|
|
description="清理运行日志和缓存",
|
|
usage="/clearlogs",
|
|
)
|
|
|
|
return registry
|