Skip to content

Commit

Permalink
Merge pull request #635 from NapNeko/ref/ob-network
Browse files Browse the repository at this point in the history
refactor: adjust onebot network
  • Loading branch information
MliKiowa authored Dec 17, 2024
2 parents 5650f18 + 2d9cc4d commit 892262e
Show file tree
Hide file tree
Showing 10 changed files with 108 additions and 109 deletions.
12 changes: 10 additions & 2 deletions src/onebot/config/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@ export interface AdapterConfig extends AdapterConfigInner {

const createDefaultAdapterConfig = <T extends AdapterConfig>(config: T): T => config;

export interface PluginConfig extends AdapterConfig {
name: string;
enable: boolean;
messagePostFormat: string;
reportSelfMessage: boolean;
debug: boolean;
}

export const httpServerDefaultConfigs = createDefaultAdapterConfig({
name: 'http-server',
enable: false as boolean,
Expand Down Expand Up @@ -128,7 +136,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(
Expand Down Expand Up @@ -234,4 +242,4 @@ export function getConfigBoolKey(
}
});
return result;
}
}
29 changes: 17 additions & 12 deletions src/onebot/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import {
} from '@/core';
import { OB11ConfigLoader } from '@/onebot/config';
import {
IOB11NetworkAdapter,
OB11ActiveHttpAdapter,
OB11ActiveWebSocketAdapter,
OB11NetworkManager,
Expand Down Expand Up @@ -44,9 +43,16 @@ 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,
} from './config/config';
import { OB11Message } from './types';
import { OB11PluginAdapter } from './network/plugin';
import { IOB11NetworkAdapter } from "@/onebot/network/adapter";

//OneBot实现类
export class NapCatOneBot11Adapter {
Expand Down Expand Up @@ -110,12 +116,12 @@ export class NapCatOneBot11Adapter {

// 注册Plugin 如果需要基于NapCat进行快速开发
// this.networkManager.registerAdapter(
// new OB11PluginAdapter('plugin', this.core, this,this.actions)
// new OB11PluginAdapter('myPlugin', 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)
);
}
}
Expand All @@ -133,6 +139,7 @@ export class NapCatOneBot11Adapter {
key.name,
key,
this.core,
this,
this.actions
)
);
Expand All @@ -145,6 +152,7 @@ export class NapCatOneBot11Adapter {
key.name,
key,
this.core,
this,
this.actions
)
);
Expand Down Expand Up @@ -191,10 +199,12 @@ export class NapCatOneBot11Adapter {
await this.handleConfigChange(prev.network.websocketClients, now.network.websocketClients, OB11ActiveWebSocketAdapter);
}

private async handleConfigChange(
private async handleConfigChange<CT extends NetworkConfigAdapter>(
prevConfig: NetworkConfigAdapter[],
nowConfig: NetworkConfigAdapter[],
adapterClass: new (...args: any[]) => IOB11NetworkAdapter
adapterClass: new (
...args: ConstructorParameters<typeof IOB11NetworkAdapter<CT>>
) => IOB11NetworkAdapter<CT>
): Promise<void> {
// 比较旧的在新的找不到的回收
for (const adapterConfig of prevConfig) {
Expand All @@ -215,12 +225,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);
}
}
Expand Down
19 changes: 5 additions & 14 deletions src/onebot/network/active-http.ts
Original file line number Diff line number Diff line change
@@ -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<HttpClientConfig> {
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<T extends OB11EmitEventContent>(event: T) {
Expand Down
24 changes: 8 additions & 16 deletions src/onebot/network/active-websocket.ts
Original file line number Diff line number Diff line change
@@ -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<WebsocketClientConfig> {
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<T extends OB11EmitEventContent>(event: T) {
Expand Down
33 changes: 33 additions & 0 deletions src/onebot/network/adapter.ts
Original file line number Diff line number Diff line change
@@ -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<CT extends NetworkConfigAdapter> {
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<T extends OB11EmitEventContent>(event: T): void;

abstract open(): void | Promise<void>;

abstract close(): void | Promise<void>;

abstract reload(config: any): OB11NetworkReloadType | Promise<OB11NetworkReloadType>;
}
30 changes: 8 additions & 22 deletions src/onebot/network/index.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -11,23 +11,9 @@ export enum OB11NetworkReloadType {
NetWorkClose = 3,
NetWorkOpen = 4
}
export interface IOB11NetworkAdapter {
actions: ActionMap;
name: string;
isEnable: boolean;
config: NetworkConfigAdapter;

onEvent<T extends OB11EmitEventContent>(event: T): void;

open(): void | Promise<void>;

close(): void | Promise<void>;

reload(config: any): OB11NetworkReloadType | Promise<OB11NetworkReloadType>;
}

export class OB11NetworkManager {
adapters: Map<string, IOB11NetworkAdapter> = new Map();
adapters: Map<string, IOB11NetworkAdapter<NetworkConfigAdapter>> = new Map();

async openAllAdapters() {
return Promise.all(Array.from(this.adapters.values()).map(adapter => adapter.open()));
Expand Down Expand Up @@ -63,22 +49,22 @@ export class OB11NetworkManager {
}));
}

registerAdapter(adapter: IOB11NetworkAdapter) {
registerAdapter<CT extends NetworkConfigAdapter>(adapter: IOB11NetworkAdapter<CT>) {
this.adapters.set(adapter.name, adapter);
}

async registerAdapterAndOpen(adapter: IOB11NetworkAdapter) {
async registerAdapterAndOpen<CT extends NetworkConfigAdapter>(adapter: IOB11NetworkAdapter<CT>) {
this.registerAdapter(adapter);
await adapter.open();
}

async closeSomeAdapters(adaptersToClose: IOB11NetworkAdapter[]) {
async closeSomeAdapters<CT extends NetworkConfigAdapter>(adaptersToClose: IOB11NetworkAdapter<CT>[]) {
for (const adapter of adaptersToClose) {
this.adapters.delete(adapter.name);
await adapter.close();
}
}
async closeSomeAdaterWhenOpen(adaptersToClose: IOB11NetworkAdapter[]) {
async closeSomeAdaterWhenOpen<CT extends NetworkConfigAdapter>(adaptersToClose: IOB11NetworkAdapter<CT>[]) {
for (const adapter of adaptersToClose) {
this.adapters.delete(adapter.name);
if (adapter.isEnable) {
Expand All @@ -91,7 +77,7 @@ export class OB11NetworkManager {
return this.adapters.get(name);
}

async closeAdapterByPredicate(closeFilter: (adapter: IOB11NetworkAdapter) => boolean) {
async closeAdapterByPredicate(closeFilter: (adapter: IOB11NetworkAdapter<NetworkConfigAdapter>) => boolean) {
const adaptersToClose = Array.from(this.adapters.values()).filter(closeFilter);
await this.closeSomeAdapters(adaptersToClose);
}
Expand All @@ -118,4 +104,4 @@ export class OB11NetworkManager {
export * from './active-http';
export * from './active-websocket';
export * from './passive-http';
export * from './passive-websocket';
export * from './passive-websocket';
19 changes: 7 additions & 12 deletions src/onebot/network/passive-http.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,20 @@
import { IOB11NetworkAdapter, OB11NetworkReloadType } from './index';
import { OB11NetworkReloadType } from './index';
import express, { Express, Request, Response } from 'express';
import http from 'http';
import { NapCatCore } from '@/core';
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<HttpServerConfig> {
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() {
Expand Down
18 changes: 6 additions & 12 deletions src/onebot/network/passive-websocket.ts
Original file line number Diff line number Diff line change
@@ -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<WebsocketServerConfig> {
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,
Expand Down
Loading

0 comments on commit 892262e

Please sign in to comment.