本文引用的文件
本文件面向 Cosmoe Bot 的核心模块,系统性梳理以下方面:
该项目采用按功能域划分的目录组织方式,核心代码位于 src 目录下:
入口与部署:src/index.ts、wrangler.jsonc、package.json
graph TB
A["src/index.ts<br/>入口与 Webhook/定时触发"] --> B["src/command/index.ts<br/>命令注册与对话插件"]
B --> C["src/command/handlers/*.ts<br/>命令处理器"]
A --> D["src/scheduler/index.ts<br/>定时任务"]
C --> E["src/client/cosmoe.ts<br/>API 客户端"]
D --> E
E --> F["外部 API: https://cos.cx/api/v1<br/>事件/预约/用户相关接口"]
B --> G["KV: COSMOE_CREDENTIALS/COSMOE_STORAGE<br/>凭证与会话/状态存储"]
D --> G
图表来源
章节来源
章节来源
整体交互链路如下:
定时任务周期性拉取活动列表,筛选新活动并向已登录用户推送
sequenceDiagram
participant U as "用户"
participant W as "入口(src/index.ts)"
participant CMD as "命令系统(src/command/index.ts)"
participant H as "处理器(如 login/events/bookEvent)"
participant KV as "KV(COSMOE_CREDENTIALS/STORAGE)"
participant API as "CosmoeClient"
participant S as "后端API(cos.cx)"
U->>W : "发送命令/回调"
W->>CMD : "分发至对应命令"
CMD->>H : "执行处理器逻辑"
H->>KV : "读取/写入用户凭证/会话"
H->>API : "构建请求并调用"
API->>S : "HTTP 请求"
S-->>API : "JSON 响应(code/msg/data)"
API-->>H : "返回解析后的结果"
H-->>U : "发送 Telegram 消息/内联键盘"
图表来源
错误处理
异常捕获:上层处理器统一打印日志并提示用户
classDiagram
class CosmoeClient {
-baseUrl : string
-userId : number
-token : string
+getToken(username, password) Promise~ApiResponse~
+setCredentials(userId, token) void
+getCredentials() {userId, token}|null
+isAuthenticated() boolean
+getEvents() Promise~ApiResponse~Event[]~~
+getEventDetail(eventId) Promise~ApiResponse~EventDetail~~
+getProfile() Promise~ApiResponse~ProfileData~~
+getUserProfile() Promise~ApiResponse~UserProfile~~
+getMyBookings() Promise~ApiResponse~Booking[]~~
+bookEvent(req) Promise~ApiResponse~
+changePassword(old, new) Promise~ApiResponse~
+getAvailableCoupons(eventId) Promise~ApiResponse~Coupon[]~~
+updatePaymentOrder(id, orderId) Promise~ApiResponse~
+updateBookingNote(id, note) Promise~ApiResponse~
+cancelBooking(id) Promise~ApiResponse~
+selfReschedule(id, slot) Promise~ApiResponse~
+selfTransfer(id, user) Promise~ApiResponse~
+register(key, username, email, pwd, identity) Promise~ApiResponse~
}
图表来源
章节来源
会话存储适配
自定义 KV 适配器,负责 JSON 序列化/反序列化与异常处理
flowchart TD
Start(["收到命令/回调"]) --> Route{"命令类型?"}
Route --> |/login| LoginConv["进入登录对话"]
Route --> |/events| Events["获取活动列表并展示"]
Route --> |/event_*| Details["解析活动ID并获取详情"]
Route --> |/book_*_*| Book["解析活动ID/槽位并处理预约"]
Route --> |/history| History["读取凭证并获取预约历史"]
Route --> |/cancel_*| Cancel["解析预约ID并发起取消确认"]
Route --> |/logout| Logout["删除KV中的凭证"]
LoginConv --> Done(["结束"])
Events --> Done
Details --> Done
Book --> Done
History --> Done
Cancel --> Done
Logout --> Done
图表来源
章节来源
安全与健壮性
异常处理:网络错误/解析错误统一捕获并提示用户
sequenceDiagram
participant U as "用户"
participant Conv as "登录对话"
participant KV as "KV(COSMOE_CREDENTIALS)"
participant API as "CosmoeClient"
participant S as "后端API"
U->>Conv : "/login"
Conv->>U : "提示输入用户名"
U-->>Conv : "用户名"
Conv->>U : "提示输入密码"
U-->>Conv : "密码"
Conv->>API : "getToken(用户名, 密码)"
API->>S : "POST /CreatToken.php"
S-->>API : "{code,data : {user_id,token}}"
API-->>Conv : "返回结果"
alt 成功
Conv->>KV : "put(Telegram用户ID, 凭证JSON)"
Conv-->>U : "登录成功"
else 失败
Conv-->>U : "登录失败"
end
图表来源
章节来源
错误处理
API 失败时统一提示;无活动时友好提示
flowchart TD
A["/events"] --> B["CosmoeClient.getEvents()"]
B --> C{"code==200 且有数据?"}
C --> |否| D["提示无活动"]
C --> |是| E["取前N条并生成Markdown列表"]
E --> F["发送消息"]
G["/event_{id}"] --> H["解析ID并getEventDetail()"]
H --> I{"code==200"}
I --> |否| J["提示错误"]
I --> |是| K["计算是否活动当日或之前"]
K --> L["按range排序时间槽"]
L --> M{"剩余容量>0 且活动有效?"}
M --> |是| N["为每个槽位添加 /book_... 链接"]
M --> |否| O["仅显示不可预约"]
N --> P["发送Markdown详情"]
O --> P
图表来源
章节来源
取消流程
确认后调用 cancelBooking 并反馈结果
sequenceDiagram
participant U as "用户"
participant CMD as "命令系统"
participant H as "bookEvent处理器"
participant KV as "KV"
participant API as "CosmoeClient"
participant S as "后端API"
U->>CMD : "/book_{event}_{slot}"
CMD->>H : "解析event_id/slot_index"
H->>KV : "读取凭证"
H->>API : "setCredentials + getEventDetail"
API->>S : "GET /api.php?action=get_event_detail"
S-->>API : "EventDetail"
API-->>H : "返回详情"
H->>H : "排序时间槽并校验索引/剩余"
H->>API : "getAvailableCoupons"
API->>S : "GET /api.php?action=get_available_coupons"
S-->>API : "Coupons"
API-->>H : "返回优惠券列表"
alt 多个优惠券
H-->>U : "内联键盘选择优惠券"
else 一个或无
H->>API : "bookEvent(含可选coupon_code)"
API->>S : "POST /api.php?action=book_event"
S-->>API : "结果"
API-->>H : "返回结果"
H-->>U : "发送成功/失败消息"
end
图表来源
章节来源
章节来源
配置依赖
TypeScript:严格类型检查
graph LR
IDX["src/index.ts"] --> CMD["src/command/index.ts"]
IDX --> SCH["src/scheduler/index.ts"]
CMD --> H1["handlers/start.ts"]
CMD --> H2["handlers/login.ts"]
CMD --> H3["handlers/events.ts"]
CMD --> H4["handlers/eventDetails.ts"]
CMD --> H5["handlers/bookEvent.ts"]
CMD --> H6["handlers/history.ts"]
CMD --> H7["handlers/cancel.ts"]
CMD --> H8["handlers/logout.ts"]
CMD --> CLI["src/client/cosmoe.ts"]
SCH --> CLI
CMD --> KV["KV: COSMOE_CREDENTIALS/STORAGE"]
SCH --> KV
图表来源
章节来源
章节来源
本项目以清晰的功能域划分与模块化设计实现了完整的 Telegram Bot 服务:
章节来源