refactor: reloadNetwork

This commit is contained in:
手瓜一十雪
2024-11-16 18:10:03 +08:00
parent ce6b8ffdfe
commit 8a4591376a
7 changed files with 176 additions and 151 deletions

View File

@@ -16,9 +16,11 @@ import {
} from '@/core';
import { OB11ConfigLoader } from '@/onebot/config';
import {
IOB11NetworkAdapter,
OB11ActiveHttpAdapter,
OB11ActiveWebSocketAdapter,
OB11NetworkManager,
OB11NetworkReloadType,
OB11PassiveHttpAdapter,
OB11PassiveWebSocketAdapter,
} from '@/onebot/network';
@@ -45,7 +47,7 @@ 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 { mergeOneBotConfigs, migrateOneBotConfigsV1, OneBotConfig } from './config/config';
import { mergeOneBotConfigs, migrateOneBotConfigsV1, NetworkConfigAdapter, OneBotConfig } from './config/config';
import { OB11Message } from './types';
//OneBot实现类
@@ -179,152 +181,56 @@ export class NapCatOneBot11Adapter {
const newLog = await this.creatOneBotLog(now);
this.context.logger.log(`[Notice] [OneBot11] 配置变更前:\n${prevLog}`);
this.context.logger.log(`[Notice] [OneBot11] 配置变更后:\n${newLog}`);
const { added: addedHttpServers, removed: removedHttpServers } = this.findDifference(prev.network.httpServers, now.network.httpServers);
const { added: addedHttpClients, removed: removedHttpClients } = this.findDifference(prev.network.httpClients, now.network.httpClients);
const { added: addedWebSocketServers, removed: removedWebSocketServers } = this.findDifference(prev.network.websocketServers, now.network.websocketServers);
const { added: addedWebSocketClients, removed: removedWebSocketClients } = this.findDifference(prev.network.websocketClients, now.network.websocketClients);
// 移除旧的 HTTP 服务器
for (const server of removedHttpServers) {
await this.networkManager.closeAdapterByPredicate((adapter) => adapter.name === server.name);
}
await this.handleRemovedAdapters(removedHttpServers);
await this.handleRemovedAdapters(removedHttpClients);
await this.handleRemovedAdapters(removedWebSocketServers);
await this.handleRemovedAdapters(removedWebSocketClients);
// 移除旧的 HTTP 客户端
for (const client of removedHttpClients) {
await this.networkManager.closeAdapterByPredicate((adapter) => adapter.name === client.name);
}
await this.handlerConfigChange(now.network.httpServers);
await this.handlerConfigChange(now.network.httpClients);
await this.handlerConfigChange(now.network.websocketServers);
await this.handlerConfigChange(now.network.websocketClients);
// 移除旧的 WebSocket 服务器
for (const server of removedWebSocketServers) {
await this.networkManager.closeAdapterByPredicate((adapter) => adapter.name === server.name);
}
await this.handleAddedAdapters(addedHttpServers, OB11PassiveHttpAdapter);
await this.handleAddedAdapters(addedHttpClients, OB11ActiveHttpAdapter);
await this.handleAddedAdapters(addedWebSocketServers, OB11PassiveWebSocketAdapter);
await this.handleAddedAdapters(addedWebSocketClients, OB11ActiveWebSocketAdapter);
}
// 移除旧的 WebSocket 客户端
for (const client of removedWebSocketClients) {
await this.networkManager.closeAdapterByPredicate((adapter) => adapter.name === client.name);
}
private async handlerConfigChange(adapters: Array<NetworkConfigAdapter>) {
for (const adapterConfig of adapters) {
const existingAdapter = this.networkManager.findSomeAdapter(adapterConfig.name);
if (existingAdapter) {
let networkChange = await existingAdapter.reload(adapterConfig);
if (networkChange === OB11NetworkReloadType.NetWorkClose) {
this.networkManager.closeSomeAdapters([existingAdapter]);
// 处理 enable 状态变化的 HTTP 服务器
for (const server of now.network.httpServers) {
const prevServer = prev.network.httpServers.find(s => s.name === server.name);
if (prevServer && prevServer.enable !== server.enable) {
if (server.enable) {
let adapter = new OB11PassiveHttpAdapter(server.name, server, this.core, this.actions);
adapter.open();
this.networkManager.registerAdapter(
adapter
);
} else {
await this.networkManager.closeAdapterByPredicate((adapter) => adapter.name === server.name);
}
}
}
// 处理 enable 状态变化的 HTTP 客户端
for (const client of now.network.httpClients) {
const prevClient = prev.network.httpClients.find(c => c.name === client.name);
if (prevClient && prevClient.enable !== client.enable) {
if (client.enable) {
let adapter = new OB11ActiveHttpAdapter(client.name, client, this.core, this, this.actions);
adapter.open();
this.networkManager.registerAdapter(
adapter
);
} else {
await this.networkManager.closeAdapterByPredicate((adapter) => adapter.name === client.name);
}
}
}
// 处理 enable 状态变化的 WebSocket 服务器
for (const server of now.network.websocketServers) {
const prevServer = prev.network.websocketServers.find(s => s.name === server.name);
if (prevServer && prevServer.enable !== server.enable) {
if (server.enable) {
let adapter = new OB11PassiveWebSocketAdapter(
server.name,
server,
this.core,
this.actions
);
adapter.open();
this.networkManager.registerAdapter(
adapter
);
} else {
await this.networkManager.closeAdapterByPredicate((adapter) => adapter.name === server.name);
}
}
}
// 处理 enable 状态变化的 WebSocket 客户端
for (const client of now.network.websocketClients) {
const prevClient = prev.network.websocketClients.find(c => c.name === client.name);
if (prevClient && prevClient.enable !== client.enable) {
if (client.enable) {
let adapter = new OB11ActiveWebSocketAdapter(
client.name,
client,
this.core,
this.actions
)
this.networkManager.registerAdapter(
adapter
);
} else {
await this.networkManager.closeAdapterByPredicate((adapter) => adapter.name === client.name);
}
}
}
// 注册新的 HTTP 服务器
for (const server of addedHttpServers) {
if (server.enable) {
let adapter = new OB11PassiveHttpAdapter(server.name, server, this.core, this.actions);
adapter.open();
this.networkManager.registerAdapter(adapter);
}
}
// 注册新的 HTTP 客户端
for (const client of addedHttpClients) {
if (client.enable) {
let adapter = new OB11ActiveHttpAdapter(client.name, client, this.core, this, this.actions);
adapter.open();
this.networkManager.registerAdapter(adapter);
}
}
// 注册新的 WebSocket 服务器
for (const server of addedWebSocketServers) {
if (server.enable) {
let adapter = new OB11PassiveWebSocketAdapter(
server.name,
server,
this.core,
this.actions
);
adapter.open();
this.networkManager.registerAdapter(adapter);
}
}
// 注册新的 WebSocket 客户端
for (const client of addedWebSocketClients) {
if (client.enable) {
let adapter = new OB11ActiveWebSocketAdapter(
client.name,
client,
this.core,
this.actions
)
adapter.open();
this.networkManager.registerAdapter(adapter);
}
}
}
private async handleRemovedAdapters(adapters: Array<{ name: string }>): Promise<void> {
for (const adapter of adapters) {
await this.networkManager.closeAdapterByPredicate((existingAdapter) => existingAdapter.name === adapter.name);
}
}
private async handleAddedAdapters<T extends new (...args: any[]) => IOB11NetworkAdapter>(addedAdapters: Array<NetworkConfigAdapter>, AdapterClass: T) {
for (const adapter of addedAdapters) {
if (adapter.enable) {
const newAdapter = new AdapterClass(adapter.name, adapter, this.core, this.actions);
await newAdapter.open();
this.networkManager.registerAdapter(newAdapter);
}
}
}
private findDifference<T>(prev: T[], now: T[]): { added: T[]; removed: T[] } {
const added = now.filter((item) => !prev.includes(item));
const removed = prev.filter((item) => !now.includes(item));