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:
7418andClaude Opus 4.6 committed 2026-03-04 23:32:46 +08:00
1 parent 538cc1b7fd
commit 113e15e2f4
17 files changed
+1957 -15

No files matched your search

+31 -1
View File
@@ -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
```