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