本文引用的文件
本文件面向“会话状态管理”主题,围绕项目中基于 grammY conversations 的集成与配置展开,重点覆盖以下方面:
该项目采用按功能模块划分的组织方式,会话状态管理主要集中在命令入口与处理器层:
客户端:封装外部 API 访问与认证状态管理
graph TB
A["入口文件<br/>src/index.ts"] --> B["命令装配<br/>src/command/index.ts"]
B --> C["对话与插件<br/>conversations/KVAdapter"]
B --> D["命令处理器集合"]
D --> D1["登录处理器<br/>src/command/handlers/login.ts"]
D --> D2["事件列表处理器<br/>src/command/handlers/events.ts"]
D --> D3["活动详情处理器<br/>src/command/handlers/eventDetails.ts"]
D --> D4["预约处理器<br/>src/command/handlers/bookEvent.ts"]
D --> D5["取消处理器<br/>src/command/handlers/cancel.ts"]
D --> D6["历史处理器<br/>src/command/handlers/history.ts"]
D --> D7["登出处理器<br/>src/command/handlers/logout.ts"]
D --> E["客户端封装<br/>src/client/cosmoe.ts"]
图表来源
章节来源
章节来源
下图展示了会话状态管理在系统中的位置与交互路径。
graph TB
subgraph "运行环境"
CF["Cloudflare Workers"]
KV1["KV: COSMOE_CREDENTIALS"]
KV2["KV: COSMOE_STORAGE"]
end
subgraph "应用层"
Bot["Bot 实例<br/>ConversationFlavor"]
Conv["conversations 插件"]
KVAdp["KvAdapter"]
Cmd["命令装配与路由"]
Hdl["命令处理器"]
API["CosmoeClient 封装"]
end
CF --> Bot
Bot --> Conv
Conv --> KVAdp
KVAdp --> KV2
Hdl --> KV1
Hdl --> API
Cmd --> Hdl
图表来源
交互式对话
进入对话后,会话状态在 KV 中持久化;退出后状态可被读取或删除
sequenceDiagram
participant U as "用户"
participant B as "Bot"
participant C as "conversations 插件"
participant K as "KvAdapter(KV)"
participant H as "登录处理器"
U->>B : "/login"
B->>C : "enter('login')"
C->>K : "read(key)"
K-->>C : "状态(若存在)"
C->>H : "进入对话"
H->>U : "提示输入用户名"
U->>H : "发送用户名"
H->>K : "write(key, 状态)"
H->>U : "提示输入密码"
U->>H : "发送密码"
H->>K : "write(key, 最终状态)"
H-->>U : "登录结果"
C-->>B : "对话结束"
图表来源
章节来源
超时与销毁
可通过删除 KV 中对应 key 或调用插件提供的清理接口实现销毁(如需扩展)
flowchart TD
S["开始: 用户触发命令"] --> E["进入对话: enter('...')"]
E --> R["读取状态: KV.read(key)"]
R --> W1["等待输入: conversation.wait()"]
W1 --> U1["更新状态: 写入 KV"]
U1 --> W2["等待输入: conversation.wait()"]
W2 --> U2["更新状态: 写入 KV"]
U2 --> F["完成: 返回结果"]
F --> D{"是否需要销毁?"}
D --> |是| DEL["删除状态: KV.delete(key)"]
D --> |否| END["保持状态"]
图表来源
章节来源
章节来源
章节来源
成功后将认证凭据写入 COSMOE_CREDENTIALS
sequenceDiagram
participant U as "用户"
participant B as "Bot"
participant C as "conversations"
participant K as "KV(COSMOE_STORAGE)"
participant KC as "KV(COSMOE_CREDENTIALS)"
participant L as "登录处理器"
U->>B : "/login"
B->>C : "enter('login')"
C->>K : "read(key)"
K-->>C : "状态"
C->>L : "进入对话"
L->>U : "提示用户名"
U->>L : "用户名"
L->>K : "write(key, 状态)"
L->>U : "提示密码"
U->>L : "密码"
L->>KC : "put(userId, 凭证)"
L-->>U : "登录结果"
图表来源
章节来源
若存在多个优惠券,生成内联键盘供用户选择;选择后继续预约
sequenceDiagram
participant U as "用户"
participant B as "Bot"
participant H as "预约处理器"
participant K as "KV(COSMOE_CREDENTIALS)"
participant C as "CosmoeClient"
U->>B : "/book_{eventId}_{slotIndex}"
B->>H : "handleBookEvent"
H->>K : "get(userId)"
K-->>H : "凭据"
H->>C : "setCredentials"
H->>C : "getEventDetail"
alt 多个优惠券
H-->>U : "内联键盘(选择优惠券)"
U->>B : "callback : select_coupon_..."
B->>H : "handleCouponSelection"
H->>C : "getEventDetail"
end
H->>C : "bookEvent"
C-->>H : "结果"
H-->>U : "预约结果"
图表来源
章节来源
处理器生成确认键盘;用户点击确认后执行取消操作并返回结果
sequenceDiagram
participant U as "用户"
participant B as "Bot"
participant H as "取消处理器"
participant K as "KV(COSMOE_CREDENTIALS)"
participant C as "CosmoeClient"
U->>B : "/cancel_{id}"
B->>H : "handleCancelCommand"
H-->>U : "确认键盘"
U->>B : "callback : confirm_cancel_{id}"
B->>H : "handleCancelConfirmation"
H->>K : "get(userId)"
K-->>H : "凭据"
H->>C : "setCredentials"
H->>C : "cancelBooking"
C-->>H : "结果"
H-->>U : "取消结果"
图表来源
章节来源
项目依赖
通过 package.json 指定版本,确保兼容性
graph LR
P["package.json"] --> G["@grammyjs/conversations"]
P --> S["@grammyjs/storage-cloudflare"]
P --> M["grammy"]
W["wrangler.jsonc"] --> N1["KV: COSMOE_CREDENTIALS"]
W --> N2["KV: COSMOE_STORAGE"]
图表来源
章节来源
章节来源
本项目通过 grammY conversations 与 Cloudflare KV 的组合,实现了可靠的会话状态管理: