消息与 NapCat
NapcatClient 通过 WebSocket 接收 OneBot 事件。MerryBot 目前只把已配置群的群消息投递给插件;通知事件另经 EventRegister 分发。
flowchart LR
N[NapCat] --> B[BotClient]
B --> L[Logic]
L --> I[MessageService.Ingest]
I --> D[MessageIngress 本地消息快照]
D --> P[解析并投递插件]
P --> R[MessageService.Prefetch 异步预取]
入站处理
BotClient收到群消息后触发OnGroupMessageReceived。Logic先检查群号是否在核心配置QqGroups中;未监听的群直接忽略。MessageService.Ingest创建本地消息快照,提取图片、文件和合并转发的资源描述,并异步持久化。ExtractMessage识别 @ 机器人的AtData;ParseCommand仅解析以/开头的文本。- 宿主按加载顺序向每个启用插件投递异步回调。某插件的拦截器返回
true时,只跳过该插件本次处理;插件异常不会影响其他插件。 - 分发后,
PrefetchAsync异步读取回复、合并转发和媒体资源;预取失败只记日志。
插件收到的是克隆后的 IReadOnlyList<TypedMessage>,因此不应依赖对消息链的就地修改影响其他插件。
消息链
TypedMessage 是 OneBot 消息段的基类。常用类型包括 TextData、AtData、ReplyData、ImageData、FileData、ForwardData、RecordData 和 VideoData;未知段仍会保留为具体消息类型而非被扁平化为文本。
MessageContext 补充平台无关的会话和身份信息:SessionKey("qq", "group", groupId)、发送者 QQ、群名片/昵称和机器人 QQ。插件应以 context.Session 定位会话,以 Channel 发送回复。
本地资源引用
外部图片、文件、回复和转发不会原样交给 WebUI 或 Agent。MessageService 把可持久化媒体映射为 merrybot:// 本地引用,二进制对象由 storage/ 保存,WebUI 再通过本地 API 提供访问。
Interop.MessageService可读取回复消息、合并转发和资源内容。- 资源下载受核心配置
ResourceSizeLimitMb限制。 - 入站消息优先写入内存缓存;相同远端读取会合并为单个进行中的请求,失败不缓存,后续可重试。
这使插件和前端无需直接请求消息中携带的远端 URL,降低 SSRF 与隐私泄露风险。