Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 27 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@
| **多平台消息接入** | ✅ | OneBot v11 (NapCat/QQ),可扩展至微信/Telegram/Discord |
| **实时消息推送** | ✅ | 双 WebSocket 通道:平台入站 `/onebot/v11/ws` + 客户端出站 `/ws/client` |
| **消息广播中枢** | ✅ | `MessageBroadcaster` 按平台/会话订阅,精准推送 |
| **消息生命周期管理** | ✅ | Pending → Sending → Sent → Failed 全状态流转 |
| **消息生命周期管理** | ✅ | Pending → Sending → Sent → Failed → Canceled 全状态流转 |
| **消息类型识别** | ✅ | Text / Image / File / Video / Audio 五大消息类型 |
| **Web 管理界面** | ✅ | Vanilla JS SPA:仪表盘 / 消息流 / 发送消息 / 平台状态 |
| **暗色模式** | ✅ | 亮色/暗色/Auto 三模式,localStorage 持久化 |
| **RESTful API** | ✅ | 创建/查询消息,健康检查([完整文档](docs/api/README.md)) |
| **RESTful API** | ✅ | 创建/查询/列表/更新状态/删除消息/统计概览 + 健康检查([完整文档](docs/api/README.md)) |
| **CLI 工具** | ✅ | 命令行发送消息 / 查询状态 |
| **Adapter 架构** | ✅ | 可插拔的适配器系统,方便接入新平台 |
| **Plugin 架构** | ✅ | 消息处理插件系统(过滤/转换/加密) |
| **消息发送调度器** | ✅ | 后台 tokio task 轮询 + 重试 + 并发控制 + 原子认领 |
| **SQLite 持久化** | ✅ | 消息数据本地存储,零配置 |
| **结构化日志** | ✅ | tracing + 文件/双输出,文件创建失败自动降级 |

Expand All @@ -51,15 +53,15 @@
▼ ▼ ▼ ▼
MessageEvent OneBotAdapter Message (DB) MessageBroadcaster
│ .send_message() │ (广播中枢)
│ │ │ ▲
▼ ▼ │ │
OneBotAdapter ◀── Message (内部) ◀───────────┘ │
.send_message()
send_group_msg / send_private_msg ──WS──→ NapCat
┌────────────────────────────────────────────────────────────────────────
│ │ │
▼ ▼ │
OneBotAdapter ◀── Message (内部) ◀── MessageDispatcher ◀── 轮询 Pending
.send_message() (调度器 + 重试)
send_group_msg / send_private_msg ──WS──→ NapCat

┌─────────────────────────────────────────────────────────────────────┘
保存 DB ──→ broadcast ──→ 所有订阅该平台的 Web UI 实时收到
Expand All @@ -83,6 +85,7 @@ src/
│ ├── adapter.rs # Adapter trait + AdapterManager
│ ├── broadcaster.rs # 消息广播中枢 (MessageBroadcaster)
│ ├── config.rs # 配置管理
│ ├── dispatcher.rs # 消息发送调度器 (轮询 + 重试 + 原子认领)
│ ├── logging.rs # 日志初始化
│ ├── message.rs # 消息仓库 (SQLite)
│ └── plugin.rs # Plugin trait + PluginManager
Expand Down Expand Up @@ -152,11 +155,15 @@ WS 地址: ws://localhost:8080/onebot/v11/ws

### HTTP API

| 方法 | 路径 | 说明 |
| ------ | -------------------- | ---- |
| `POST` | `/api/messages` | 创建消息 |
| `GET` | `/api/messages/{id}` | 查询消息 |
| `GET` | `/api/health` | 健康检查 |
| 方法 | 路径 | 说明 |
| ------ | -------------------- | ------ |
| `POST` | `/api/messages` | 创建消息 |
| `GET` | `/api/messages` | 消息列表(支持 `?offset=&limit=&status=`) |
| `GET` | `/api/messages/{id}` | 查询单条消息 |
| `PATCH` | `/api/messages/{id}` | 更新消息状态 |
| `DELETE` | `/api/messages/{id}` | 删除消息 |
| `GET` | `/api/stats` | 统计概览 |
| `GET` | `/api/health` | 健康检查 |

### WebSocket 指令

Expand All @@ -182,7 +189,7 @@ WS 地址: ws://localhost:8080/onebot/v11/ws
## ⌨️ 命令行工具

```bash
# 发送消息
# 发送消息 (支持 text / image / file / video / audio)
cargo run -- send -t text -r user1 -c "Hello"

# 查询状态
Expand All @@ -195,7 +202,7 @@ cargo run -- status -i <message-id>

| 页面 | Hash | 功能 |
| ---- | ------------ | ------------------- |
| 仪表盘 | `#dashboard` | 统计卡片 + 最近消息 |
| 仪表盘 | `#dashboard` | 6 状态统计卡片 + 最近消息(调用 `/api/stats`) |
| 消息流 | `#messages` | WebSocket 实时推送 + 筛选 |
| 发送消息 | `#send` | 表单 → 平台发送 |
| 平台状态 | `#platforms` | Adapter 连接状态 |
Expand Down Expand Up @@ -252,12 +259,10 @@ cargo fmt

| 优先级 | 功能 |
| :-: | ---------------------------- |
| 🔴 | 消息发送调度器 (后台任务发送 + 重试) |
| 🟡 | 消息列表分页 API |
| 🟡 | 更多平台适配 (微信/Telegram/Discord) |
| | 更多平台适配 (微信/Telegram/Discord) |
| 🟡 | Redis 消息队列集成 |
| 🟢 | Plugin 实现 (加密/格式化/翻译) |
| 🟢 | 认证授权机制 |
| 🟢 | Docker 部署 |

***

Expand Down
57 changes: 27 additions & 30 deletions compass/todolist.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,26 @@
| 04-30 | CI 格式修复 × 3 | import order / 行宽 / 链式调用换行 |
| 05-01 | 集成测试补全 | 39 个新测试: broadcaster(11) + protocol(21) + auth(7) |
| 05-01 | Phase B: API 补全 | list/stats/PATCH/DELETE 全部完成;status Canceled 拆分修复 |
| 05-01 | Phase C1-C2: 消息流 + Dispatcher | 图片/文件类型扩展、sender 补全、Canceled 跳过、Web 前端同步 |
| 05-01 | Phase C: 消息流完善 | C1 类型识别扩展 Video/Audio;C2 sender/conversation_name 补全 |
| 05-01 | Dispatcher 增强 | try_claim_message 原子认领消除竞态;Canceled 跳过 |
| 05-01 | Web 前端同步 | 仪表盘 6 卡片调用 /api/stats;statusBadge() 状态徽章 |
| 05-01 | MessageType 扩展 | 新增 Video + Audio 变体,8 文件 match 补全 + 前端下拉框 |

---

## 二、下一步开发计划

### 🔴 Phase A: 消息发送调度核心 (P0)
### 🔴 Phase A: 消息发送调度核心 (P0) ✅ 已完成

> 当前 `/ws/client` 的 `send_message` 只调用 `send_to_adapter` 但不处理结果/重试。需要后台调度器
> Dispatcher 已实现:后台 tokio task 轮询 + 重试 + 并发控制 + try_claim_message 原子认领

| # | 任务 | 优先级 | 文件 | 说明 |
|:--|------|:---:|------|------|
| A1 | 创建 `core/dispatcher.rs` | 🔴 | 新建 | 后台 tokio task 轮询 Pending 消息 → 匹配 Adapter 发送 → 更新状态 |
| A2 | `SenderConfig` 接入调度器 | 🔴 | dispatcher.rs | max_retries / retry_interval / batch_size / concurrency |
| A3 | `MessageRepository::update_status()` | 🔴 | message.rs | 发送成功后更新为 Sent,失败后 retry_count++ |
| A4 | 调度器生命周期管理 | 🔴 | main.rs + dispatcher.rs | start / graceful shutdown |
| A5 | 集成测试 | 🔴 | tests/dispatcher.rs | 模拟发送成功/失败/超时/最大重试 |
| A1 | 创建 `core/dispatcher.rs` | | dispatcher.rs | 后台 tokio task 轮询 Pending/Sending 消息 → 匹配 Adapter 发送 → 更新状态 |
| A2 | `SenderConfig` 接入调度器 | | dispatcher.rs | max_retries / retry_interval / batch_size / concurrency |
| A3 | 状态更新 + 原子认领 | ✅ | message.rs | update_message_status / increment_retry / try_claim_message |
| A4 | 调度器生命周期管理 | | main.rs + dispatcher.rs | start / graceful shutdown via AtomicBool |
| A5 | 集成测试 | | tests/dispatcher.rs | 5 场景:发送成功/失败重试/Canceled跳过/原子认领/优雅关闭 |

### 🟡 Phase B: API 补全 ✅ 已完成

Expand All @@ -42,12 +45,12 @@
| B3 | `GET /api/stats` 统计概览 | ✅ | 5种状态计数 + total |
| B4 | `DELETE /api/messages/{id}` | ✅ | 删除消息记录 |

### 🟡 Phase C: 消息流完善 🔴 进行中
### 🟡 Phase C: 消息流完善 ✅ 已完成

| # | 任务 | 优先级 | 说明 |
|:--|------|:---:|------|
| C1 | OneBot 图片/文件消息类型扩展 | ✅ | 根据消息段自动识别 Image/File/Text 类型 |
| C2 | 入站消息 sender 信息补全 | ✅ | conversation_name 从 nickname/群号自动生成 |
| C1 | OneBot 消息类型扩展 | ✅ | segments_message_type 识别 Image/File/Video/Audio/Text 五种 |
| C2 | 入站消息 sender 信息补全 | ✅ | conversation_name 从 nickname/群号自动生成;message_type 动态化 |
| C3 | 多平台支持框架就绪 | 🟢 | adapter 注册机制验证 (QQ 已有,可加 mock 测试微信) |

### 🟢 Phase D: 运维与部署
Expand Down Expand Up @@ -89,25 +92,19 @@
├── OneBot v11 适配器 (入站/出站)
├── Web UI SPA (仪表盘/消息流/发送/平台)
├── Access Token 认证
├── 44 个集成测试 (broadcaster 11 + protocol 21 + auth 7 + repo 5)
├── MessageType 扩展: Text / Image / File / Video / Audio (5 种)
├── MessageStatus 扩展: Pending / Sending / Sent / Failed / Canceled (5 种)
├── 消息发送调度器: 轮询 + 重试 + 并发控制 + try_claim_message 原子认领
├── HTTP API 完整: list / PATCH / DELETE / stats + health
├── Web 前端: 6 状态卡片 / stats API 对接 / statusBadge() 徽章
├── 49 个测试全部通过 (broadcaster 11 + protocol 21 + auth 7 + sender 5 + dispatcher 5)
├── try_claim_message 原子性修复 (跨周期重复认领消除)
└── CI 格式合规

⏳ Phase A: 发送调度器 → 目标 2026-05-02
├── [ ] dispatcher 后台任务
├── [ ] 状态流转 Pending→Sending→Sent/Failed
├── [ ] 重试逻辑 (max_retries + retry_interval)
└── [ ] 端到端验证: Web UI 发送 → NapCat → QQ 群

⏳ Phase B: API 补全 → 目标 2026-05-03
├── [ ] GET /api/messages 分页
├── [ ] PATCH /api/messages/{id}
└── [ ] GET /api/stats

⏳ Phase C-E: 完善 + 部署 → 目标 2026-05-05
├── [✅] 图片/文件类型识别
├── [✅] sender 信息补全
├── [✅] Dispatcher Canceled 跳过
├── [✅] Web 前端状态同步
├── [ ] Docker 部署
└── [ ] 架构优化
⏳ Next: 运维部署 + 架构优化 → 目标 2026-05-05
├── [✅] Dispatcher 集成测试 (5 场景全部通过)
├── [ ] Dockerfile + docker-compose
├── [ ] SQLite WAL 模式
├── [ ] 配置验证
└── [ ] 架构优化 (REPO → Data<T>)
```
Loading
Loading