外观
架构总览
VanBotJS 采用适配器模式:每个平台一个适配器,负责「协议 ⇄ 统一内部模型」的转换;所有兼容性 / 标准化业务下沉到内核,插件只写业务。
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ QQ / OneBot │ │ 微信公众号 │ │ B站直播间 │
│ ws / http │ │ http 回调 │ │ wss 弹幕 │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ QQ官方机器人 │ │ Telegram │ │ KOOK/Discord │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ 统一事件 BotEvent │ │
└─────────┬────────┴──────────────────┘
▼
内核归一化(traceId / ID字符串 / 能力集 / 未知段占位)
▼
globalBus (事件总线) + 中间件(快照)
▼
PluginManager → plugin/*.ts(definePlugin.onEvent)
▼
内核发送降级(applySendFallback)→ bot.callApi("send_msg", …)
▼
各适配器 callApi() 把消息翻译回平台并发送职责划分
适配器(协议翻译)
只做原始协议 ⇄ 内部 BotEvent / MessageSegment 的转换,以及 callApi 把统一动作翻译成平台 API。不做兼容业务,不处理降级。
内核(复杂度下沉)
- 事件归一化:traceId / ID 字符串化 / 时间统一 / 未知段占位 / 能力集;
- 中间件(快照追踪);
- 发送降级流水线;
- 插件管理(加载 / 热插拔 / 热重载)。
插件(纯业务)
通过 definePlugin 声明元数据、监听事件、用 ctx.reply 回复、注册 Skill、调用受控代理 API。禁止硬编码平台字符串,只能判断能力标记。
统一发送
插件不区分平台:群聊传 groupId,私聊传 userId,统一走 send_msg;能力不支持的段由内核自动降级。
