本文档引用的文件
本文件面向“预约与取消命令”的完整业务流程,深入解析以下命令:
同时解释回调查询处理、按钮交互和实时状态更新机制,并提供预约冲突检测、容量管理与通知推送的扩展实现建议。
该机器人基于 GrammY 框架构建,采用模块化命令处理器与 Cloudflare Workers 运行环境。核心目录与职责如下:
package.json:依赖与脚本
graph TB
subgraph "Telegram 机器人"
CMD["命令入口<br/>src/command/index.ts"]
HANDLERS["命令处理器<br/>src/command/handlers/*"]
SCHED["定时任务<br/>src/scheduler/index.ts"]
end
subgraph "客户端"
CLIENT["Cosmoe 客户端<br/>src/client/cosmoe.ts"]
end
subgraph "Cloudflare Workers"
KV["KV 存储<br/>COSMOE_CREDENTIALS/COSMOE_STORAGE"]
TRIG["计划任务触发器<br/>*/1 * * * *"]
end
CMD --> HANDLERS
HANDLERS --> CLIENT
SCHED --> CLIENT
HANDLERS --> KV
SCHED --> KV
TRIG --> SCHED
图表来源
章节来源
章节来源
下图展示了从用户输入到 API 调用与 KV 存储的整体流程。
sequenceDiagram
participant U as "用户"
participant B as "Telegram Bot"
participant C as "命令处理器"
participant K as "KV 存储"
participant API as "Cosmoe API"
U->>B : 发送命令/回调
B->>C : 路由到对应处理器
C->>K : 读取/写入用户凭证与会话
C->>API : 调用事件/预约/取消接口
API-->>C : 返回结果
C-->>U : 发送消息/内联键盘
图表来源
关键步骤: 1) 解析命令参数,提取活动 ID 与时间槽索引 2) 从 KV 获取用户凭证并校验登录状态 3) 调用 Cosmoe API 获取活动详情与时间槽 4) 校验时间槽剩余容量 5) 查询可用优惠券,若多于一个则弹出内联键盘供用户选择 6) 用户确认后发起预约请求,返回最终价格、预约编号等信息
sequenceDiagram
participant U as "用户"
participant B as "Bot"
participant H as "bookEvent 处理器"
participant K as "KV 存储"
participant API as "Cosmoe API"
U->>B : /book_{event_id}_{slot_index}
B->>H : 路由到处理函数
H->>K : 读取用户凭证
H->>API : 获取活动详情与时间槽
API-->>H : 返回活动数据
H->>H : 校验剩余容量
H->>API : 查询可用优惠券
API-->>H : 返回优惠券列表
alt 多个优惠券
H-->>U : 弹出内联键盘选择优惠券
U->>B : 回调选择优惠券
B->>H : 处理回调
else 单个或无优惠券
H->>H : 自动选择/不使用优惠券
end
H->>API : 提交预约请求
API-->>H : 返回预约结果
H-->>U : 成功/失败消息
图表来源
章节来源
功能要点:
支持 Markdown 格式输出,避免超长消息截断
flowchart TD
Start(["进入 /history"]) --> GetUser["获取 Telegram 用户ID"]
GetUser --> CheckCreds{"KV 中存在凭证?"}
CheckCreds --> |否| PromptLogin["提示先登录"]
CheckCreds --> |是| InitClient["初始化 Cosmoe 客户端"]
InitClient --> FetchBookings["获取我的预约历史"]
FetchBookings --> HasData{"有数据?"}
HasData --> |否| EmptyMsg["提示历史为空"]
HasData --> |是| SortLimit["按时间倒序并限制数量"]
SortLimit --> BuildMsg["构建 Markdown 消息"]
BuildMsg --> CancelLink{"满足可取消条件?"}
CancelLink --> |是| AddLink["添加取消链接"]
CancelLink --> |否| SkipLink["跳过"]
AddLink --> SendMsg["发送消息"]
SkipLink --> SendMsg
PromptLogin --> End(["结束"])
EmptyMsg --> End
SendMsg --> End
图表来源
章节来源
关键步骤: 1) 解析命令参数,获取预约 ID 2) 校验登录态并获取用户历史 3) 在历史中定位目标预约,构造确认内联键盘 4) 用户点击确认后,调用取消接口并更新消息
sequenceDiagram
participant U as "用户"
participant B as "Bot"
participant H as "cancel 处理器"
participant API as "Cosmoe API"
U->>B : /cancel_{booking_id}
B->>H : 路由到处理函数
H->>API : 获取我的预约历史
API-->>H : 返回历史列表
H->>H : 定位目标预约
H-->>U : 弹出确认内联键盘
U->>B : 点击“确认”或“取消”
B->>H : 处理回调
alt 确认取消
H->>API : 调用取消接口
API-->>H : 返回结果
H-->>U : 更新为成功/失败消息
else 取消操作
H-->>U : 提示操作已取消
end
图表来源
章节来源
章节来源
章节来源
Cloudflare Workers 配置定义 KV 绑定与计划任务
graph LR
IDX["命令入口<br/>src/command/index.ts"] --> H_BOOK["预约处理器<br/>src/command/handlers/bookEvent.ts"]
IDX --> H_CANCEL["取消处理器<br/>src/command/handlers/cancel.ts"]
IDX --> H_HISTORY["历史处理器<br/>src/command/handlers/history.ts"]
H_BOOK --> CLIENT["Cosmoe 客户端<br/>src/client/cosmoe.ts"]
H_CANCEL --> CLIENT
H_HISTORY --> CLIENT
SCHED["定时任务<br/>src/scheduler/index.ts"] --> CLIENT
SCHED --> KV["KV 存储"]
IDX --> KV
WRANGLER["Workers 配置<br/>wrangler.jsonc"] --> KV
图表来源
章节来源
章节来源
章节来源
本系统以清晰的模块化设计实现了完整的预约与取消流程,结合 KV 会话存储与回调交互,提供了良好的用户体验。建议后续增强实时状态更新与通知推送能力,进一步提升用户参与度与满意度。
章节来源
章节来源