From a0c479485d52c4dc8365f037bd2e4eb573ac73d0 Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Tue, 17 Dec 2024 05:26:27 +0800 Subject: [PATCH 1/2] refactor: adjust onebot network --- src/onebot/config/config.ts | 14 +++++++++-- src/onebot/index.ts | 30 +++++++++++++--------- src/onebot/network/active-http.ts | 19 ++++---------- src/onebot/network/active-websocket.ts | 24 ++++++------------ src/onebot/network/adapter.ts | 33 +++++++++++++++++++++++++ src/onebot/network/index.ts | 30 ++++++---------------- src/onebot/network/passive-http.ts | 19 ++++++-------- src/onebot/network/passive-websocket.ts | 18 +++++--------- src/onebot/network/plugin.ts | 26 ++++++------------- src/plugin/index.ts | 6 ++--- 10 files changed, 107 insertions(+), 112 deletions(-) create mode 100644 src/onebot/network/adapter.ts diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 82764b3ab..388730a2f 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -38,6 +38,16 @@ export interface AdapterConfig extends AdapterConfigInner { const createDefaultAdapterConfig = (config: T): T => config; +export const pluginDefaultConfigs = createDefaultAdapterConfig({ + name: 'plugin', + messagePostFormat: 'array', + reportSelfMessage: false, + enable: true, + debug: false, +}); + +export type PluginConfig = typeof pluginDefaultConfigs; + export const httpServerDefaultConfigs = createDefaultAdapterConfig({ name: 'http-server', enable: false as boolean, @@ -128,7 +138,7 @@ export const mergeNetworkDefaultConfig = { websocketClients: websocketClientDefaultConfigs, } as const; -export type NetworkConfigAdapter = HttpServerConfig | HttpClientConfig | WebsocketServerConfig | WebsocketClientConfig | AdapterConfig; +export type NetworkConfigAdapter = HttpServerConfig | HttpClientConfig | WebsocketServerConfig | WebsocketClientConfig | PluginConfig; type NetworkConfigKeys = keyof typeof mergeNetworkDefaultConfig; export function mergeOneBotConfigs( @@ -234,4 +244,4 @@ export function getConfigBoolKey( } }); return result; -} \ No newline at end of file +} diff --git a/src/onebot/index.ts b/src/onebot/index.ts index c8604fe9d..829e20daf 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -16,7 +16,6 @@ import { } from '@/core'; import { OB11ConfigLoader } from '@/onebot/config'; import { - IOB11NetworkAdapter, OB11ActiveHttpAdapter, OB11ActiveWebSocketAdapter, OB11NetworkManager, @@ -44,9 +43,17 @@ import { OB11GroupRecallNoticeEvent } from '@/onebot/event/notice/OB11GroupRecal import { LRUCache } from '@/common/lru-cache'; import { NodeIKernelRecentContactListener } from '@/core/listeners/NodeIKernelRecentContactListener'; import { BotOfflineEvent } from './event/notice/BotOfflineEvent'; -import { AdapterConfigWrap, mergeOneBotConfigs, migrateOneBotConfigsV1, NetworkConfigAdapter, OneBotConfig } from './config/config'; +import { + AdapterConfigWrap, + mergeOneBotConfigs, + migrateOneBotConfigsV1, + NetworkConfigAdapter, + OneBotConfig, + pluginDefaultConfigs +} from './config/config'; import { OB11Message } from './types'; import { OB11PluginAdapter } from './network/plugin'; +import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; //OneBot实现类 export class NapCatOneBot11Adapter { @@ -110,12 +117,12 @@ export class NapCatOneBot11Adapter { // 注册Plugin 如果需要基于NapCat进行快速开发 // this.networkManager.registerAdapter( - // new OB11PluginAdapter('plugin', this.core, this,this.actions) + // new OB11PluginAdapter('myPlugin', pluginDefaultConfigs, this.core, this,this.actions) // ); for (const key of ob11Config.network.httpServers) { if (key.enable) { this.networkManager.registerAdapter( - new OB11PassiveHttpAdapter(key.name, key, this.core, this.actions) + new OB11PassiveHttpAdapter(key.name, key, this.core, this, this.actions) ); } } @@ -133,6 +140,7 @@ export class NapCatOneBot11Adapter { key.name, key, this.core, + this, this.actions ) ); @@ -145,6 +153,7 @@ export class NapCatOneBot11Adapter { key.name, key, this.core, + this, this.actions ) ); @@ -191,10 +200,12 @@ export class NapCatOneBot11Adapter { await this.handleConfigChange(prev.network.websocketClients, now.network.websocketClients, OB11ActiveWebSocketAdapter); } - private async handleConfigChange( + private async handleConfigChange( prevConfig: NetworkConfigAdapter[], nowConfig: NetworkConfigAdapter[], - adapterClass: new (...args: any[]) => IOB11NetworkAdapter + adapterClass: new ( + ...args: ConstructorParameters> + ) => IOB11NetworkAdapter ): Promise { // 比较旧的在新的找不到的回收 for (const adapterConfig of prevConfig) { @@ -215,12 +226,7 @@ export class NapCatOneBot11Adapter { await this.networkManager.closeSomeAdaterWhenOpen([existingAdapter]); } } else if (adapterConfig.enable) { - let newAdapter = new adapterClass( adapterConfig.name, adapterConfig, this.core, this.actions ); - - if (adapterClass === OB11ActiveHttpAdapter) { - newAdapter = new adapterClass(adapterConfig.name, adapterConfig, this.core, this, this.actions); - } - + const newAdapter = new adapterClass(adapterConfig.name, adapterConfig as CT, this.core, this, this.actions); await this.networkManager.registerAdapterAndOpen(newAdapter); } } diff --git a/src/onebot/network/active-http.ts b/src/onebot/network/active-http.ts index ac6a602c6..1a18746ae 100644 --- a/src/onebot/network/active-http.ts +++ b/src/onebot/network/active-http.ts @@ -1,27 +1,18 @@ -import { IOB11NetworkAdapter, OB11EmitEventContent, OB11NetworkReloadType } from '@/onebot/network/index'; +import { OB11EmitEventContent, OB11NetworkReloadType } from '@/onebot/network/index'; import { createHmac } from 'crypto'; -import { LogWrapper } from '@/common/log'; import { QuickAction, QuickActionEvent } from '@/onebot/types'; import { NapCatCore } from '@/core'; import { NapCatOneBot11Adapter } from '..'; import { RequestUtil } from '@/common/request'; import { HttpClientConfig } from '@/onebot/config/config'; import { ActionMap } from '@/onebot/action'; +import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; -export class OB11ActiveHttpAdapter implements IOB11NetworkAdapter { - logger: LogWrapper; - isEnable: boolean = false; - config: HttpClientConfig; - +export class OB11ActiveHttpAdapter extends IOB11NetworkAdapter { constructor( - public name: string, - config: HttpClientConfig, - public core: NapCatCore, - public obContext: NapCatOneBot11Adapter, - public actions: ActionMap, + name: string, config: HttpClientConfig, core: NapCatCore, obContext: NapCatOneBot11Adapter, actions: ActionMap ) { - this.logger = core.context.logger; - this.config = structuredClone(config); + super(name, config, core, obContext, actions); } onEvent(event: T) { diff --git a/src/onebot/network/active-websocket.ts b/src/onebot/network/active-websocket.ts index b73e95e5b..90f309ad0 100644 --- a/src/onebot/network/active-websocket.ts +++ b/src/onebot/network/active-websocket.ts @@ -1,29 +1,21 @@ -import { IOB11NetworkAdapter, OB11EmitEventContent, OB11NetworkReloadType } from '@/onebot/network/index'; +import { OB11EmitEventContent, OB11NetworkReloadType } from '@/onebot/network/index'; import { WebSocket } from 'ws'; import { OB11HeartbeatEvent } from '@/onebot/event/meta/OB11HeartbeatEvent'; import { NapCatCore } from '@/core'; -import { ActionName } from '@/onebot/action/router'; +import { ActionName } from '@/onebot/action/router'; import { OB11Response } from '@/onebot/action/OneBotAction'; -import { LogWrapper } from '@/common/log'; import { ActionMap } from '@/onebot/action'; import { LifeCycleSubType, OB11LifeCycleEvent } from '@/onebot/event/meta/OB11LifeCycleEvent'; import { WebsocketClientConfig } from '@/onebot/config/config'; +import { NapCatOneBot11Adapter } from "@/onebot"; +import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; -export class OB11ActiveWebSocketAdapter implements IOB11NetworkAdapter { - isEnable: boolean = false; - logger: LogWrapper; +export class OB11ActiveWebSocketAdapter extends IOB11NetworkAdapter { private connection: WebSocket | null = null; private heartbeatRef: NodeJS.Timeout | null = null; - public config: WebsocketClientConfig; - - constructor( - public name: string, - confg: WebsocketClientConfig, - public core: NapCatCore, - public actions: ActionMap, - ) { - this.logger = core.context.logger; - this.config = structuredClone(confg); + + constructor(name: string, config: WebsocketClientConfig, core: NapCatCore, obContext: NapCatOneBot11Adapter, actions: ActionMap) { + super(name, config, core, obContext, actions); } onEvent(event: T) { diff --git a/src/onebot/network/adapter.ts b/src/onebot/network/adapter.ts new file mode 100644 index 000000000..72dedb015 --- /dev/null +++ b/src/onebot/network/adapter.ts @@ -0,0 +1,33 @@ +import { NetworkConfigAdapter } from "@/onebot/config/config"; +import { LogWrapper } from "@/common/log"; +import { NapCatCore } from "@/core"; +import { NapCatOneBot11Adapter } from "@/onebot"; +import { ActionMap } from "@/onebot/action"; +import { OB11EmitEventContent, OB11NetworkReloadType } from "@/onebot/network/index"; + +export abstract class IOB11NetworkAdapter { + name: string; + isEnable: boolean = false; + config: CT; + readonly logger: LogWrapper; + readonly core: NapCatCore; + readonly obContext: NapCatOneBot11Adapter; + readonly actions: ActionMap; + + constructor(name: string, config: CT, core: NapCatCore, obContext: NapCatOneBot11Adapter, actions: ActionMap) { + this.name = name; + this.config = structuredClone(config); + this.core = core; + this.obContext = obContext; + this.actions = actions; + this.logger = core.context.logger; + } + + abstract onEvent(event: T): void; + + abstract open(): void | Promise; + + abstract close(): void | Promise; + + abstract reload(config: any): OB11NetworkReloadType | Promise; +} diff --git a/src/onebot/network/index.ts b/src/onebot/network/index.ts index 8ace6024f..9821c1680 100644 --- a/src/onebot/network/index.ts +++ b/src/onebot/network/index.ts @@ -1,7 +1,7 @@ import { OneBotEvent } from '@/onebot/event/OneBotEvent'; import { OB11Message } from '@/onebot'; -import { ActionMap } from '@/onebot/action'; import { NetworkConfigAdapter } from '@/onebot/config/config'; +import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; export type OB11EmitEventContent = OneBotEvent | OB11Message; export enum OB11NetworkReloadType { @@ -11,23 +11,9 @@ export enum OB11NetworkReloadType { NetWorkClose = 3, NetWorkOpen = 4 } -export interface IOB11NetworkAdapter { - actions: ActionMap; - name: string; - isEnable: boolean; - config: NetworkConfigAdapter; - - onEvent(event: T): void; - - open(): void | Promise; - - close(): void | Promise; - - reload(config: any): OB11NetworkReloadType | Promise; -} export class OB11NetworkManager { - adapters: Map = new Map(); + adapters: Map> = new Map(); async openAllAdapters() { return Promise.all(Array.from(this.adapters.values()).map(adapter => adapter.open())); @@ -63,22 +49,22 @@ export class OB11NetworkManager { })); } - registerAdapter(adapter: IOB11NetworkAdapter) { + registerAdapter(adapter: IOB11NetworkAdapter) { this.adapters.set(adapter.name, adapter); } - async registerAdapterAndOpen(adapter: IOB11NetworkAdapter) { + async registerAdapterAndOpen(adapter: IOB11NetworkAdapter) { this.registerAdapter(adapter); await adapter.open(); } - async closeSomeAdapters(adaptersToClose: IOB11NetworkAdapter[]) { + async closeSomeAdapters(adaptersToClose: IOB11NetworkAdapter[]) { for (const adapter of adaptersToClose) { this.adapters.delete(adapter.name); await adapter.close(); } } - async closeSomeAdaterWhenOpen(adaptersToClose: IOB11NetworkAdapter[]) { + async closeSomeAdaterWhenOpen(adaptersToClose: IOB11NetworkAdapter[]) { for (const adapter of adaptersToClose) { this.adapters.delete(adapter.name); if (adapter.isEnable) { @@ -91,7 +77,7 @@ export class OB11NetworkManager { return this.adapters.get(name); } - async closeAdapterByPredicate(closeFilter: (adapter: IOB11NetworkAdapter) => boolean) { + async closeAdapterByPredicate(closeFilter: (adapter: IOB11NetworkAdapter) => boolean) { const adaptersToClose = Array.from(this.adapters.values()).filter(closeFilter); await this.closeSomeAdapters(adaptersToClose); } @@ -118,4 +104,4 @@ export class OB11NetworkManager { export * from './active-http'; export * from './active-websocket'; export * from './passive-http'; -export * from './passive-websocket'; \ No newline at end of file +export * from './passive-websocket'; diff --git a/src/onebot/network/passive-http.ts b/src/onebot/network/passive-http.ts index 278961bf8..e05aaa32d 100644 --- a/src/onebot/network/passive-http.ts +++ b/src/onebot/network/passive-http.ts @@ -1,4 +1,4 @@ -import { IOB11NetworkAdapter, OB11NetworkReloadType } from './index'; +import { OB11NetworkReloadType } from './index'; import express, { Express, Request, Response } from 'express'; import http from 'http'; import { NapCatCore } from '@/core'; @@ -6,20 +6,15 @@ import { OB11Response } from '@/onebot/action/OneBotAction'; import { ActionMap } from '@/onebot/action'; import cors from 'cors'; import { HttpServerConfig } from '@/onebot/config/config'; +import { NapCatOneBot11Adapter } from "@/onebot"; +import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; -export class OB11PassiveHttpAdapter implements IOB11NetworkAdapter { +export class OB11PassiveHttpAdapter extends IOB11NetworkAdapter { private app: Express | undefined; private server: http.Server | undefined; - isEnable: boolean = false; - public config: HttpServerConfig; - - constructor( - public name: string, - config: HttpServerConfig, - public core: NapCatCore, - public actions: ActionMap, - ) { - this.config = structuredClone(config); + + constructor(name: string, config: HttpServerConfig, core: NapCatCore, obContext: NapCatOneBot11Adapter, actions: ActionMap) { + super(name, config, core, obContext, actions); } onEvent() { diff --git a/src/onebot/network/passive-websocket.ts b/src/onebot/network/passive-websocket.ts index a5b7cb1f8..bdfc41f28 100644 --- a/src/onebot/network/passive-websocket.ts +++ b/src/onebot/network/passive-websocket.ts @@ -1,36 +1,30 @@ -import { IOB11NetworkAdapter, OB11EmitEventContent, OB11NetworkReloadType } from './index'; +import { OB11EmitEventContent, OB11NetworkReloadType } from './index'; import urlParse from 'url'; import { WebSocket, WebSocketServer } from 'ws'; import { Mutex } from 'async-mutex'; import { OB11Response } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { NapCatCore } from '@/core'; -import { LogWrapper } from '@/common/log'; import { OB11HeartbeatEvent } from '@/onebot/event/meta/OB11HeartbeatEvent'; import { IncomingMessage } from 'http'; import { ActionMap } from '@/onebot/action'; import { LifeCycleSubType, OB11LifeCycleEvent } from '@/onebot/event/meta/OB11LifeCycleEvent'; import { WebsocketServerConfig } from '@/onebot/config/config'; +import { NapCatOneBot11Adapter } from "@/onebot"; +import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; -export class OB11PassiveWebSocketAdapter implements IOB11NetworkAdapter { +export class OB11PassiveWebSocketAdapter extends IOB11NetworkAdapter { wsServer: WebSocketServer; wsClients: WebSocket[] = []; wsClientsMutex = new Mutex(); - isEnable: boolean = false; heartbeatInterval: number = 0; - logger: LogWrapper; - public config: WebsocketServerConfig; private heartbeatIntervalId: NodeJS.Timeout | null = null; wsClientWithEvent: WebSocket[] = []; constructor( - public name: string, - config: WebsocketServerConfig, - public core: NapCatCore, - public actions: ActionMap, + name: string, config: WebsocketServerConfig, core: NapCatCore, obContext: NapCatOneBot11Adapter, actions: ActionMap ) { - this.config = structuredClone(config); - this.logger = core.context.logger; + super(name, config, core, obContext, actions); this.wsServer = new WebSocketServer({ port: this.config.port, host: this.config.host === '0.0.0.0' ? '' : this.config.host, diff --git a/src/onebot/network/plugin.ts b/src/onebot/network/plugin.ts index d34d605a4..41037f376 100644 --- a/src/onebot/network/plugin.ts +++ b/src/onebot/network/plugin.ts @@ -1,33 +1,21 @@ -import { IOB11NetworkAdapter, OB11EmitEventContent, OB11NetworkReloadType } from './index'; +import { OB11EmitEventContent, OB11NetworkReloadType } from './index'; import { NapCatOneBot11Adapter, OB11Message } from '@/onebot'; import { NapCatCore } from '@/core'; -import { AdapterConfig } from '../config/config'; +import { PluginConfig } from '../config/config'; import { plugin_onmessage } from '@/plugin'; import { ActionMap } from '../action'; +import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; -export class OB11PluginAdapter implements IOB11NetworkAdapter { - isEnable: boolean = true; - public config: AdapterConfig; - +export class OB11PluginAdapter extends IOB11NetworkAdapter { constructor( - public name: string, - public core: NapCatCore, - public obCore: NapCatOneBot11Adapter, - public actions: ActionMap, + name: string, config: PluginConfig, core: NapCatCore, obContext: NapCatOneBot11Adapter, actions: ActionMap ) { - // 基础配置 - this.config = { - name: name, - messagePostFormat: 'array', - reportSelfMessage: false, - enable: true, - debug: false, - } + super(name, config, core, obContext, actions); } onEvent(event: T) { if (event.post_type === 'message') { - plugin_onmessage(this.config.name, this.core, this.obCore, event as OB11Message,this.actions).then().catch(); + plugin_onmessage(this.config.name, this.core, this.obContext, event as OB11Message,this.actions).then().catch(); } } diff --git a/src/plugin/index.ts b/src/plugin/index.ts index 7aec43f8e..0c54c4792 100644 --- a/src/plugin/index.ts +++ b/src/plugin/index.ts @@ -1,10 +1,10 @@ import { NapCatOneBot11Adapter, OB11Message } from "@/onebot"; -import { NapCatCore } from "../core"; +import { NapCatCore } from "@/core"; import { ActionMap } from "@/onebot/action"; -export const plugin_onmessage = async (adapter: string, core: NapCatCore, obCore: NapCatOneBot11Adapter, message: OB11Message, action: ActionMap) => { +export const plugin_onmessage = async (adapter: string, core: NapCatCore, obCtx: NapCatOneBot11Adapter, message: OB11Message, action: ActionMap) => { if (message.raw_message === 'ping') { const ret = await action.get('send_group_msg')?.handle({ group_id: String(message.group_id), message: 'pong' }, adapter); console.log(ret); } -} +}; From 2d9cc4d1980010b7c77cd224604bdc8262b62393 Mon Sep 17 00:00:00 2001 From: pk5ls20 Date: Tue, 17 Dec 2024 07:07:04 +0800 Subject: [PATCH 2/2] fix: as design --- src/onebot/config/config.ts | 16 +++++++--------- src/onebot/index.ts | 3 +-- src/onebot/network/plugin.ts | 13 ++++++++++--- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 388730a2f..d4032e268 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -38,15 +38,13 @@ export interface AdapterConfig extends AdapterConfigInner { const createDefaultAdapterConfig = (config: T): T => config; -export const pluginDefaultConfigs = createDefaultAdapterConfig({ - name: 'plugin', - messagePostFormat: 'array', - reportSelfMessage: false, - enable: true, - debug: false, -}); - -export type PluginConfig = typeof pluginDefaultConfigs; +export interface PluginConfig extends AdapterConfig { + name: string; + enable: boolean; + messagePostFormat: string; + reportSelfMessage: boolean; + debug: boolean; +} export const httpServerDefaultConfigs = createDefaultAdapterConfig({ name: 'http-server', diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 829e20daf..5708bad51 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -49,7 +49,6 @@ import { migrateOneBotConfigsV1, NetworkConfigAdapter, OneBotConfig, - pluginDefaultConfigs } from './config/config'; import { OB11Message } from './types'; import { OB11PluginAdapter } from './network/plugin'; @@ -117,7 +116,7 @@ export class NapCatOneBot11Adapter { // 注册Plugin 如果需要基于NapCat进行快速开发 // this.networkManager.registerAdapter( - // new OB11PluginAdapter('myPlugin', pluginDefaultConfigs, this.core, this,this.actions) + // new OB11PluginAdapter('myPlugin', this.core, this,this.actions) // ); for (const key of ob11Config.network.httpServers) { if (key.enable) { diff --git a/src/onebot/network/plugin.ts b/src/onebot/network/plugin.ts index 41037f376..ffac15b73 100644 --- a/src/onebot/network/plugin.ts +++ b/src/onebot/network/plugin.ts @@ -8,8 +8,15 @@ import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; export class OB11PluginAdapter extends IOB11NetworkAdapter { constructor( - name: string, config: PluginConfig, core: NapCatCore, obContext: NapCatOneBot11Adapter, actions: ActionMap + name: string, core: NapCatCore, obContext: NapCatOneBot11Adapter, actions: ActionMap ) { + const config = { + name: name, + messagePostFormat: 'array', + reportSelfMessage: false, + enable: true, + debug: false, + }; super(name, config, core, obContext, actions); } @@ -20,11 +27,11 @@ export class OB11PluginAdapter extends IOB11NetworkAdapter { } open() { - + this.isEnable = true; } async close() { - + this.isEnable = false; } async reload() {