mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-05 15:11:15 +00:00
Introduced the new napcat-protocol package to unify protocol adapter management for OneBot and Satori. Updated napcat-framework and napcat-shell to use ProtocolManager instead of direct adapter instantiation. Added protocol info definitions to napcat-common, and integrated protocol configuration and management APIs into the web UI backend and frontend. This refactor improves maintainability, extensibility, and encapsulation of protocol logic, while maintaining backward compatibility.
6.3 KiB
6.3 KiB
NapCat Protocol Manager
统一管理 NapCat 的多协议适配器(OneBot 和 Satori)。
特性
- 🔌 统一接口: 提供统一的协议管理接口
- 🎯 插件化设计: 支持动态注册和管理协议适配器
- 🔄 热重载: 支持协议配置的热重载
- 📦 开箱即用: 内置 OneBot11 和 Satori 协议支持
架构
napcat-protocol
├── types.ts # 协议接口定义
├── manager.ts # 协议管理器
├── adapters/
│ ├── onebot.ts # OneBot11 协议适配器包装
│ └── satori.ts # Satori 协议适配器包装
└── index.ts # 导出入口
使用方法
基础使用
import { ProtocolManager } from 'napcat-protocol';
// 创建协议管理器
const protocolManager = new ProtocolManager(core, context, pathWrapper);
// 初始化所有协议
await protocolManager.initAllProtocols();
// 获取协议适配器
const onebotAdapter = protocolManager.getOneBotAdapter();
const satoriAdapter = protocolManager.getSatoriAdapter();
单独初始化协议
// 只初始化 OneBot11
await protocolManager.initProtocol('onebot11');
// 只初始化 Satori
await protocolManager.initProtocol('satori');
获取原始适配器
// 获取 OneBot 原始适配器
const onebotAdapter = protocolManager.getOneBotAdapter();
if (onebotAdapter) {
const rawOneBot = onebotAdapter.getRawAdapter();
// 使用 NapCatOneBot11Adapter 的所有功能
}
// 获取 Satori 原始适配器
const satoriAdapter = protocolManager.getSatoriAdapter();
if (satoriAdapter) {
const rawSatori = satoriAdapter.getRawAdapter();
// 使用 NapCatSatoriAdapter 的所有功能
}
配置重载
// 重载 OneBot 配置
await protocolManager.reloadProtocolConfig('onebot11', prevConfig, newConfig);
// 重载 Satori 配置
await protocolManager.reloadProtocolConfig('satori', prevConfig, newConfig);
查询协议状态
// 获取所有已注册的协议信息
const protocols = protocolManager.getRegisteredProtocols();
// 检查协议是否已初始化
const isInitialized = protocolManager.isProtocolInitialized('onebot11');
// 获取所有已初始化的协议ID
const initializedIds = protocolManager.getInitializedProtocolIds();
销毁协议
// 销毁指定协议
await protocolManager.destroyProtocol('onebot11');
// 销毁所有协议
await protocolManager.destroyAllProtocols();
在 Framework 中使用
// packages/napcat-framework/napcat.ts
import { ProtocolManager } from 'napcat-protocol';
const protocolManager = new ProtocolManager(core, context, pathWrapper);
await protocolManager.initAllProtocols();
// 注册到 WebUI
const onebotAdapter = protocolManager.getOneBotAdapter();
if (onebotAdapter) {
WebUiDataRuntime.setOneBotContext(onebotAdapter.getRawAdapter());
}
const satoriAdapter = protocolManager.getSatoriAdapter();
if (satoriAdapter) {
WebUiDataRuntime.setSatoriContext(satoriAdapter.getRawAdapter());
}
在 Shell 中使用
// packages/napcat-shell/base.ts
import { ProtocolManager } from 'napcat-protocol';
export class NapCatShell {
public protocolManager?: ProtocolManager;
async InitNapCat() {
await this.core.initCore();
this.protocolManager = new ProtocolManager(
this.core,
this.context,
this.context.pathWrapper
);
await this.protocolManager.initAllProtocols();
}
}
扩展自定义协议
如果需要添加新的协议支持,可以实现 IProtocolAdapter 和 IProtocolAdapterFactory 接口:
import { IProtocolAdapter, IProtocolAdapterFactory } from 'napcat-protocol';
// 实现协议适配器
class MyProtocolAdapter implements IProtocolAdapter {
readonly name = 'MyProtocol';
readonly id = 'myprotocol';
readonly version = '1.0.0';
readonly description = '我的自定义协议';
async init(): Promise<void> {
// 初始化逻辑
}
async destroy(): Promise<void> {
// 清理逻辑
}
async reloadConfig(prevConfig: unknown, newConfig: unknown): Promise<void> {
// 配置重载逻辑
}
}
// 实现工厂
class MyProtocolAdapterFactory implements IProtocolAdapterFactory {
readonly protocolId = 'myprotocol';
readonly protocolName = 'MyProtocol';
readonly protocolVersion = '1.0.0';
readonly protocolDescription = '我的自定义协议';
create(core, context, pathWrapper) {
return new MyProtocolAdapter(core, context, pathWrapper);
}
}
// 注册到管理器
protocolManager.registerFactory(new MyProtocolAdapterFactory());
await protocolManager.initProtocol('myprotocol');
API 文档
ProtocolManager
方法
registerFactory(factory: IProtocolAdapterFactory): 注册协议工厂getRegisteredProtocols(): 获取所有已注册的协议信息initProtocol(protocolId: string): 初始化指定协议initAllProtocols(): 初始化所有协议destroyProtocol(protocolId: string): 销毁指定协议destroyAllProtocols(): 销毁所有协议getAdapter<T>(protocolId: string): 获取协议适配器getOneBotAdapter(): 获取 OneBot 协议适配器getSatoriAdapter(): 获取 Satori 协议适配器reloadProtocolConfig(protocolId, prevConfig, newConfig): 重载协议配置isProtocolInitialized(protocolId: string): 检查协议是否已初始化getInitializedProtocolIds(): 获取所有已初始化的协议ID
IProtocolAdapter
协议适配器接口,所有协议适配器都需要实现此接口。
属性
name: string: 协议名称id: string: 协议IDversion: string: 协议版本description: string: 协议描述
方法
init(): 初始化协议适配器destroy(): 销毁协议适配器reloadConfig(prevConfig, newConfig): 重载配置
IProtocolAdapterFactory
协议适配器工厂接口,用于创建协议适配器实例。
属性
protocolId: string: 协议IDprotocolName: string: 协议名称protocolVersion: string: 协议版本protocolDescription: string: 协议描述
方法
create(core, context, pathWrapper): 创建协议适配器实例
依赖
napcat-core: NapCat 核心napcat-common: NapCat 通用工具napcat-onebot: OneBot11 协议实现napcat-satori: Satori 协议实现
许可证
与 NapCat 主项目保持一致