Adapter 适配器
约 592 字大约 2 分钟
2025-09-26
Adapter:与 NapCat/WS 的桥接与 BotAPI 协作
Adapter 是 NcatBot 与底层 NapCat WebSocket 的桥梁:
- 管理 WS 连接与收发循环;
- 将 NapCat 的上行事件解析为内部事件对象(
BaseEventData及其子类); - 提供线程安全的 API 调用通道,供
BotAPI统一封装上行接口; - 把收到的事件分发给由
BotClient注册的事件回调。
与 BotAPI 的协作方式
BotAPI 在构造时被注入了一个异步回调:async_callback = adapter.send。
- 当你调用例如
await bot.api.send_group_msg(...)时,底层会统一路由到Adapter.send(path, params); - Adapter 会:
- 生成
echo并登记一个Queue等待响应; - 通过 WS 发送形如
{ action, params, echo }的 JSON; - 在收到带
echo的响应后,唤醒对应的等待者并返回结果; - 全程使用线程锁与线程到异步的桥接,保证在任意线程/事件循环下都可安全调用。
- 生成
因此:所有对外暴露的 API 都集中在 BotAPI 层,Adapter 仅作为「可靠传输层」。这使得 API 的扩展与适配器的替换相互解耦。
连接与事件处理
await connect_websocket() 会:
- 使用配置中的
ws_uri与ws_token建立连接; - 进入读取循环
recv();对于每条消息:- 若包含
echo:作为 API 响应交给_handle_response(),唤醒等待队列; - 否则:交给
_handle_event()解析为PrivateMessageEvent/GroupMessageEvent/NoticeEvent/RequestEvent/MetaEvent。
- 若包含
- 根据
post_type与子类型从event_callback[event_name]查找并调用回调(由 BotClient 在启动时注册)。
内置的元事件处理:
meta_event.lifecycle.connect会触发OFFICIAL_STARTUP_EVENT;meta_event.heartbeat会触发OFFICIAL_HEARTBEAT_EVENT。
异常管理:
- 主动关闭:抛出
NcatBotConnectionError提示 NapCat 关闭了连接; - 其他异常:清理连接并抛出
NcatBotError;支持CancelledError的优雅收尾。
关键 API
await connect_websocket() -> bool:建立并维护 WS 收包循环。await send(path: str, params: dict = None, timeout: float = 300.0) -> dict:上行请求/响应模式,线程安全。is_websocket_online() -> bool:状态检查。event_callback: Dict[str, Callable[[BaseEventData], None]]:回调注册表,由 BotClient 在启动时填充。
使用建议
- 不要绕过
BotAPI直接调用Adapter.send,以免破坏抽象层次与未来迁移; - 回调中避免阻塞(Adapter 的回调在事件循环里),BotClient 内部会将你的处理器分发到线程池执行;
- 若需自定义适配器(对接其他平台),建议保持与
Adapter同样的回调与send协议,以便与BotAPI无缝集成。
版权所有
版权归属:huan-yp
