feat: Discord bridge adapter — 完整实现 Discord 作为第三个桥接渠道
新增文件: - discord-adapter.ts: 基于 discord.js v14 的适配器,支持 DM/频道消息、 按钮交互、流式预览(edit-based)、@提及过滤(兼容角色 mention)、 图片附件下载、!→/ 命令归一化、消息去重、typing indicator - markdown/discord.ts: Discord 2000 字符分段,代码块围栏自动平衡 - API routes: settings CRUD(Token 掩码)+ verify(Discord REST 验证) - DiscordBridgeSection.tsx: 设置 UI(凭据、授权、服务器策略、配置指南含 ID 获取方法) - discord-bridge.test.ts: 22 项单元测试(chunking/auth/command/HTML 转换) 修改文件: - bridge-manager.ts: Discord 分段投递 + channel-aware stream config (Discord 默认 1500ms/40chars/1900max vs Telegram 700ms/20/3900) - BridgeLayout/BridgeSection: Discord 渠道开关和侧栏入口 - bridge/settings/route.ts: 新增 14 个 Discord 设置键 - next.config.ts: serverExternalPackages 添加 discord.js/zlib-sync - i18n: 中英文完整翻译(30+ keys) - docs/handover/bridge-system.md: Discord 架构文档 依赖:discord.js ^14.18.0, zlib-sync ^0.1.9 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
538cc1b7fd
commit
113e15e2f4
17 files changed
+1957
-15
No files matched your search
@@ -27,7 +27,10 @@ src/lib/bridge/
|
||||
│ ├── telegram-adapter.ts # Telegram 长轮询 + offset 安全水位 + 图片/相册处理 + 自注册
|
||||
│ ├── telegram-media.ts # Telegram 图片下载、尺寸选择、base64 转换
|
||||
│ ├── telegram-utils.ts # callTelegramApi / sendMessageDraft / escapeHtml / splitMessage
|
||||
│ └── feishu-adapter.ts # 飞书 WSClient + REST 消息收发 + typing 指示器 + 自注册
|
||||
│ ├── feishu-adapter.ts # 飞书 WSClient + REST 消息收发 + typing 指示器 + 自注册
|
||||
│ └── discord-adapter.ts # Discord.js Client + Gateway intents + 按钮交互 + 流式预览 + 自注册
|
||||
├── markdown/
|
||||
│ └── discord.ts # Discord 消息分片(2000 字符限制)+ 代码围栏平衡
|
||||
└── security/
|
||||
├── rate-limiter.ts # 按 chat 滑动窗口限流(20 条/分钟)
|
||||
└── validators.ts # 路径/SessionID/危险输入校验
|
||||
@@ -52,6 +55,33 @@ src/lib/bridge/
|
||||
→ 权限请求 → sendPermissionCard() [schema 2.0 卡片 + /perm 文本命令]
|
||||
```
|
||||
|
||||
### Discord
|
||||
|
||||
```
|
||||
Discord 消息 → discord.js Client (Gateway WebSocket)
|
||||
→ messageCreate → processMessage()
|
||||
→ bot/self 过滤 → 去重(messageId Set 1000) → 授权检查(user+channel)
|
||||
→ guild 策略过滤(allowed_guilds + group_policy) → @提及检查
|
||||
→ !command → /command 规范化
|
||||
→ 图片附件 → fetch(url) → base64 FileAttachment
|
||||
→ enqueue()
|
||||
→ interactionCreate → handleInteraction()
|
||||
→ deferUpdate() (3s Discord 超时) → 存储 Interaction(60s TTL) → enqueue(callbackData)
|
||||
→ BridgeManager.runAdapterLoop() → handleMessage()
|
||||
→ deliverResponse():
|
||||
→ markdownToDiscordChunks(2000 字符, 代码围栏平衡) → 逐块发送
|
||||
→ 权限请求 → ActionRowBuilder + ButtonBuilder 组件
|
||||
→ 流式预览 → channel.send() 首次 / message.edit() 后续 / delete 结束
|
||||
→ typing → channel.sendTyping() 每 8s
|
||||
```
|
||||
|
||||
**Discord 关键设计决策:**
|
||||
- **原生 Markdown**:Discord 原生支持 Markdown,无需 IR→HTML 转换(不同于 Telegram)
|
||||
- **保守流式默认值**:Discord 编辑限速 5/5s/channel,默认 interval 1500ms, minDelta 40 chars
|
||||
- **按钮交互**:deferUpdate() 立即响应(3s Discord 超时),存储 Interaction 对象供 answerCallback 使用,60s TTL 清理
|
||||
- **授权默认拒绝**:空白允许列表 = 拒绝所有(安全优先,同飞书模式)
|
||||
- **`!` 命令别名**:在 adapter 层规范化为 `/` 命令后入队——bridge-manager 命令处理器无需改动
|
||||
|
||||
### Telegram
|
||||
|
||||
```
|
||||
|
||||
Reference in new issue
Block a user