Skip to content

Commit 113e15e

Browse files
7418claude
andcommitted
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>
1 parent 538cc1b commit 113e15e

17 files changed

Lines changed: 1957 additions & 15 deletions

File tree

docs/handover/bridge-system.md

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ src/lib/bridge/
2727
│ ├── telegram-adapter.ts # Telegram 长轮询 + offset 安全水位 + 图片/相册处理 + 自注册
2828
│ ├── telegram-media.ts # Telegram 图片下载、尺寸选择、base64 转换
2929
│ ├── telegram-utils.ts # callTelegramApi / sendMessageDraft / escapeHtml / splitMessage
30-
│ └── feishu-adapter.ts # 飞书 WSClient + REST 消息收发 + typing 指示器 + 自注册
30+
│ ├── feishu-adapter.ts # 飞书 WSClient + REST 消息收发 + typing 指示器 + 自注册
31+
│ └── discord-adapter.ts # Discord.js Client + Gateway intents + 按钮交互 + 流式预览 + 自注册
32+
├── markdown/
33+
│ └── discord.ts # Discord 消息分片(2000 字符限制)+ 代码围栏平衡
3134
└── security/
3235
├── rate-limiter.ts # 按 chat 滑动窗口限流(20 条/分钟)
3336
└── validators.ts # 路径/SessionID/危险输入校验
@@ -52,6 +55,33 @@ src/lib/bridge/
5255
→ 权限请求 → sendPermissionCard() [schema 2.0 卡片 + /perm 文本命令]
5356
```
5457

58+
### Discord
59+
60+
```
61+
Discord 消息 → discord.js Client (Gateway WebSocket)
62+
→ messageCreate → processMessage()
63+
→ bot/self 过滤 → 去重(messageId Set 1000) → 授权检查(user+channel)
64+
→ guild 策略过滤(allowed_guilds + group_policy) → @提及检查
65+
→ !command → /command 规范化
66+
→ 图片附件 → fetch(url) → base64 FileAttachment
67+
→ enqueue()
68+
→ interactionCreate → handleInteraction()
69+
→ deferUpdate() (3s Discord 超时) → 存储 Interaction(60s TTL) → enqueue(callbackData)
70+
→ BridgeManager.runAdapterLoop() → handleMessage()
71+
→ deliverResponse():
72+
→ markdownToDiscordChunks(2000 字符, 代码围栏平衡) → 逐块发送
73+
→ 权限请求 → ActionRowBuilder + ButtonBuilder 组件
74+
→ 流式预览 → channel.send() 首次 / message.edit() 后续 / delete 结束
75+
→ typing → channel.sendTyping() 每 8s
76+
```
77+
78+
**Discord 关键设计决策:**
79+
- **原生 Markdown**:Discord 原生支持 Markdown,无需 IR→HTML 转换(不同于 Telegram)
80+
- **保守流式默认值**:Discord 编辑限速 5/5s/channel,默认 interval 1500ms, minDelta 40 chars
81+
- **按钮交互**:deferUpdate() 立即响应(3s Discord 超时),存储 Interaction 对象供 answerCallback 使用,60s TTL 清理
82+
- **授权默认拒绝**:空白允许列表 = 拒绝所有(安全优先,同飞书模式)
83+
- **`!` 命令别名**:在 adapter 层规范化为 `/` 命令后入队——bridge-manager 命令处理器无需改动
84+
5585
### Telegram
5686

5787
```

next.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const pkg = require("./package.json");
66

77
const nextConfig: NextConfig = {
88
output: 'standalone',
9-
serverExternalPackages: ['better-sqlite3'],
9+
serverExternalPackages: ['better-sqlite3', 'discord.js', '@discordjs/ws', 'zlib-sync'],
1010
env: {
1111
NEXT_PUBLIC_APP_VERSION: pkg.version,
1212
},

0 commit comments

Comments
 (0)