# 基础命令 **本文引用的文件** - [src/index.ts](file://src/index.ts) - [src/command/index.ts](file://src/command/index.ts) - [src/command/handlers/start.ts](file://src/command/handlers/start.ts) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts) - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts) - [src/client/cosmoe.ts](file://src/client/cosmoe.ts) - [package.json](file://package.json) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能与可靠性考量](#性能与可靠性考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录:命令扩展与最佳实践](#附录命令扩展与最佳实践) ## 简介 本文件聚焦于基础命令的实现与使用,包括 /start、/login、/logout 的功能特性、参数处理、响应格式与错误处理机制,并解释命令注册方式与最佳实践。同时提供调用示例、常见使用场景以及扩展与自定义指导建议,帮助开发者快速理解与维护该机器人。 ## 项目结构 - 入口与命令注册 - 入口文件负责初始化 Bot 并调用命令注册函数,设置命令菜单。 - 命令注册集中在一个模块中,统一挂载命令、对话与回调处理。 - 命令处理器 - 每个命令对应一个处理器文件,职责单一,便于测试与扩展。 - 客户端封装 - 对外服务(Cosmoe)接口通过客户端类统一封装,便于认证与数据交互。 ```mermaid graph TB A["入口
src/index.ts"] --> B["命令注册
src/command/index.ts"] B --> C["开始命令处理器
src/command/handlers/start.ts"] B --> D["登录命令处理器
src/command/handlers/login.ts"] B --> E["登出命令处理器
src/command/handlers/logout.ts"] D --> F["Cosmoe 客户端
src/client/cosmoe.ts"] E --> F ``` 图表来源 - [src/index.ts](file://src/index.ts#L13-L35) - [src/command/index.ts](file://src/command/index.ts#L20-L110) - [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75) - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34) - [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171) 章节来源 - [src/index.ts](file://src/index.ts#L13-L35) - [src/command/index.ts](file://src/command/index.ts#L20-L110) ## 核心组件 - 命令注册器 - 负责安装对话插件、创建对话、注册命令与消息监听、回调处理等。 - 开始命令处理器 - 返回欢迎语与可用命令列表。 - 登录命令处理器 - 基于对话进行交互式登录,调用外部 API 获取令牌并持久化到 KV。 - 登出命令处理器 - 读取并删除用户凭证,清理本地状态。 章节来源 - [src/command/index.ts](file://src/command/index.ts#L20-L110) - [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75) - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34) ## 架构总览 下图展示从请求进入至命令处理与外部服务交互的整体流程。 ```mermaid sequenceDiagram participant U as "用户" participant W as "Webhook 入口
src/index.ts" participant R as "命令注册器
src/command/index.ts" participant H as "处理器
start/login/logout" participant C as "Cosmoe 客户端
src/client/cosmoe.ts" participant K as "KV 存储
COSMOE_CREDENTIALS/COSMOE_STORAGE" U->>W : 发送命令或消息 W->>R : 初始化并注册命令 R->>R : 安装对话插件/创建对话 U->>R : 触发 /start 或 /login 或 /logout alt /start R->>H : 调用 handleStartCommand H-->>U : 返回欢迎与命令列表 else /login R->>H : 进入登录对话 H->>C : 调用 getToken 获取令牌 C-->>H : 返回认证结果 H->>K : 写入用户凭证 H-->>U : 返回登录结果 else /logout R->>H : 调用 handleLogoutCommand H->>K : 删除用户凭证 H-->>U : 返回登出结果 end ``` 图表来源 - [src/index.ts](file://src/index.ts#L13-L35) - [src/command/index.ts](file://src/command/index.ts#L20-L110) - [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75) - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34) - [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171) ## 详细组件分析 ### /start 命令 - 功能特性 - 向用户发送欢迎信息与可用命令提示。 - 参数处理 - 无命令参数;直接读取上下文并回复。 - 响应格式 - 文本消息,包含欢迎语与命令列表。 - 错误处理 - 处理器内未显式抛错;若网络异常由框架层兜底。 - 使用场景 - 新用户首次进入、需要查看可用命令时。 ```mermaid flowchart TD S["收到 /start"] --> P["读取上下文"] P --> R["构造欢迎与命令列表文本"] R --> E["发送回复"] E --> X["结束"] ``` 图表来源 - [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6) 章节来源 - [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6) ### /login 命令 - 功能特性 - 通过交互式对话引导用户提供用户名与密码,调用外部 API 获取令牌并保存到 KV。 - 参数处理 - 无命令参数;通过对话等待用户输入用户名与密码。 - 响应格式 - 文本消息,反馈登录成功或失败原因。 - 错误处理 - 输入缺失时中止并提示;外部 API 失败时返回错误信息;异常捕获后统一提示“稍后重试”。 - 使用场景 - 需要访问受保护资源(如历史记录)前的认证步骤。 ```mermaid sequenceDiagram participant U as "用户" participant R as "命令注册器" participant L as "登录对话处理器" participant C as "Cosmoe 客户端" participant K as "KV 存储" U->>R : 触发 /login R->>L : 进入对话 L->>U : 提示输入用户名 U-->>L : 回复用户名 L->>U : 提示输入密码 U-->>L : 回复密码 L->>C : 调用 getToken C-->>L : 返回认证结果 alt 成功 L->>K : 写入凭证 L-->>U : 登录成功 else 失败 L-->>U : 登录失败 end ``` 图表来源 - [src/command/index.ts](file://src/command/index.ts#L54-L66) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75) - [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171) 章节来源 - [src/command/index.ts](file://src/command/index.ts#L54-L66) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75) - [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171) ### /logout 命令 - 功能特性 - 清除当前用户的凭证信息,完成登出。 - 参数处理 - 无命令参数;根据上下文获取用户 ID。 - 响应格式 - 文本消息,反馈登出成功或失败原因。 - 错误处理 - 无法获取用户身份、KV 读取/删除异常时均给出明确提示。 - 使用场景 - 用户主动登出或切换账号。 ```mermaid flowchart TD S["收到 /logout"] --> G["获取用户ID"] G --> V{"存在凭证?"} V --> |否| N["提示先登录"] --> X["结束"] V --> |是| D["删除凭证"] D --> OK["发送登出成功消息"] --> X ``` 图表来源 - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34) 章节来源 - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34) ## 依赖关系分析 - 运行时依赖 - grammy:Telegram Bot 框架。 - @grammyjs/conversations:对话能力。 - @grammyjs/storage-cloudflare:Cloudflare KV 存储适配器。 - 项目内部依赖 - 命令注册器依赖各处理器;处理器依赖 Cosmoe 客户端;KV 作为凭证存储。 ```mermaid graph LR P["package.json"] --> G["grammy"] P --> C["@grammyjs/conversations"] P --> S["@grammyjs/storage-cloudflare"] IDX["src/command/index.ts"] --> HSTART["handlers/start.ts"] IDX --> HLOGIN["handlers/login.ts"] IDX --> HLOGOUT["handlers/logout.ts"] HLOGIN --> CC["client/cosmoe.ts"] HLOGOUT --> CC ``` 图表来源 - [package.json](file://package.json#L18-L22) - [src/command/index.ts](file://src/command/index.ts#L1-L11) - [src/command/handlers/start.ts](file://src/command/handlers/start.ts#L1-L6) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75) - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34) - [src/client/cosmoe.ts](file://src/client/cosmoe.ts#L113-L171) 章节来源 - [package.json](file://package.json#L18-L22) - [src/command/index.ts](file://src/command/index.ts#L1-L11) ## 性能与可靠性考量 - 对话存储 - 使用 Cloudflare KV 作为对话状态存储,具备跨实例一致性与低延迟特性。 - 异常处理 - 登录与登出处理器均包含 try/catch,避免崩溃并返回友好提示。 - 命令菜单 - 在入口处一次性设置命令菜单,减少重复调用带来的开销。 章节来源 - [src/command/index.ts](file://src/command/index.ts#L20-L52) - [src/index.ts](file://src/index.ts#L23-L32) ## 故障排查指南 - /start 无响应 - 检查命令注册是否生效;确认入口已调用命令注册器。 - /login 无法完成 - 确认外部 API 可达且凭据正确;检查 KV 写入权限;查看控制台日志定位异常。 - /logout 无效 - 确认 KV 中是否存在该用户的凭证;检查删除操作是否成功。 - 命令菜单未显示 - 检查入口设置命令菜单的调用是否执行;关注错误日志。 章节来源 - [src/index.ts](file://src/index.ts#L23-L32) - [src/command/index.ts](file://src/command/index.ts#L20-L52) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L70-L73) - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L30-L33) ## 结论 基础命令围绕“欢迎引导—认证—清理”的核心路径构建,采用清晰的职责分离与健壮的错误处理策略。通过对话与 KV 的结合,实现了良好的用户体验与可维护性。后续扩展可在现有注册器与客户端封装基础上,按需新增命令与对话。 ## 附录:命令扩展与最佳实践 - 命令注册方式 - 在命令注册器中添加 bot.command 或 bot.hears,并绑定对应的处理器。 - 对话型命令通过 createConversation 注册并在命令中 enter 对话。 - 参数与上下文 - 优先从上下文提取用户信息与消息内容;对空值进行显式校验与提示。 - 响应格式 - 统一使用文本消息;必要时配合按钮或内联键盘以提升交互体验。 - 错误处理 - 包裹关键流程在 try/catch 中;对 KV 读写、外部 API 调用分别处理异常。 - 扩展建议 - 将通用逻辑抽象为工具函数(如 KV 访问、API 调用包装),降低重复代码。 - 为每个命令编写单元测试,覆盖正常与异常分支。 - 对敏感信息(如令牌)仅在内存中使用,持久化时确保键名唯一且有时间戳。 章节来源 - [src/command/index.ts](file://src/command/index.ts#L20-L110) - [src/command/handlers/login.ts](file://src/command/handlers/login.ts#L1-L75) - [src/command/handlers/logout.ts](file://src/command/handlers/logout.ts#L1-L34)