diff --git a/src/onebot/action/OneBotAction.ts b/src/onebot/action/OneBotAction.ts index 3302773c..108c7587 100644 --- a/src/onebot/action/OneBotAction.ts +++ b/src/onebot/action/OneBotAction.ts @@ -2,6 +2,7 @@ import { ActionName, BaseCheckResult } from './router'; import Ajv, { ErrorObject, ValidateFunction } from 'ajv'; import { NapCatCore } from '@/core'; import { NapCatOneBot11Adapter, OB11Return } from '@/onebot'; +import { NetworkAdapterConfig } from '../config/config'; export class OB11Response { private static createResponse(data: T, status: string, retcode: number, message: string = '', echo: any = null): OB11Return { @@ -55,13 +56,13 @@ export abstract class OneBotAction { return { valid: true }; } - public async handle(payload: PayloadType, adaptername: string): Promise> { + public async handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise> { const result = await this.check(payload); if (!result.valid) { return OB11Response.error(result.message, 400); } try { - const resData = await this._handle(payload, adaptername); + const resData = await this._handle(payload, adaptername, config); return OB11Response.ok(resData); } catch (e: any) { this.core.context.logger.logError('发生错误', e); @@ -69,13 +70,13 @@ export abstract class OneBotAction { } } - public async websocketHandle(payload: PayloadType, echo: any, adaptername: string): Promise> { + public async websocketHandle(payload: PayloadType, echo: any, adaptername: string, config: NetworkAdapterConfig): Promise> { const result = await this.check(payload); if (!result.valid) { return OB11Response.error(result.message, 1400, echo); } try { - const resData = await this._handle(payload, adaptername); + const resData = await this._handle(payload, adaptername, config); return OB11Response.ok(resData, echo); } catch (e: any) { this.core.context.logger.logError('发生错误', e); @@ -83,5 +84,5 @@ export abstract class OneBotAction { } } - abstract _handle(payload: PayloadType, adaptername: string): Promise; + abstract _handle(payload: PayloadType, adaptername: string, config: NetworkAdapterConfig): Promise; } diff --git a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts index c8106e6b..75c98c2a 100644 --- a/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetFriendMsgHistory.ts @@ -3,8 +3,9 @@ import { OB11Message } from '@/onebot'; import { ActionName } from '@/onebot/action/router'; import { ChatType } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; -import { AdapterConfigWrap } from '@/onebot/config/config'; + import { Static, Type } from '@sinclair/typebox'; +import { NetworkAdapterConfig } from '@/onebot/config/config'; interface Response { messages: OB11Message[]; @@ -23,7 +24,7 @@ export default class GetFriendMsgHistory extends OneBotAction actionName = ActionName.GetFriendMsgHistory; payloadSchema = SchemaData; - async _handle(payload: Payload, adapter: string): Promise { + async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig): Promise { //处理参数 const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); @@ -42,10 +43,9 @@ export default class GetFriendMsgHistory extends OneBotAction await Promise.all(msgList.map(async msg => { msg.id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); })); - const network = Object.values(this.obContext.configLoader.configData.network) as Array; //烘焙消息 const ob11MsgList = (await Promise.all( - msgList.map(msg => this.obContext.apis.MsgApi.parseMessage(msg, network.flat().find(e => e.name === adapter)?.messagePostFormat ?? 'array'))) + msgList.map(msg => this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat))) ).filter(msg => msg !== undefined); return { 'messages': ob11MsgList }; } diff --git a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts index 7c0d6f30..dc895279 100644 --- a/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts +++ b/src/onebot/action/go-cqhttp/GetGroupMsgHistory.ts @@ -3,8 +3,8 @@ import { OB11Message } from '@/onebot'; import { ActionName } from '@/onebot/action/router'; import { ChatType, Peer } from '@/core/types'; import { MessageUnique } from '@/common/message-unique'; -import { AdapterConfigWrap } from '@/onebot/config/config'; import { Static, Type } from '@sinclair/typebox'; +import { NetworkAdapterConfig } from '@/onebot/config/config'; interface Response { messages: OB11Message[]; @@ -25,7 +25,7 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { + async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig): Promise { //处理参数 const isReverseOrder = typeof payload.reverseOrder === 'string' ? payload.reverseOrder === 'true' : !!payload.reverseOrder; const peer: Peer = { chatType: ChatType.KCHATTYPEGROUP, peerUid: payload.group_id.toString() }; @@ -41,11 +41,9 @@ export default class GoCQHTTPGetGroupMsgHistory extends OneBotAction { msg.id = MessageUnique.createUniqueMsgId({ guildId: '', chatType: msg.chatType, peerUid: msg.peerUid }, msg.msgId); })); - const network = Object.values(this.obContext.configLoader.configData.network) as Array; //烘焙消息 - const msgFormat = network.flat().find(e => e.name === adapter)?.messagePostFormat ?? 'array'; const ob11MsgList = (await Promise.all( - msgList.map(msg => this.obContext.apis.MsgApi.parseMessage(msg, msgFormat))) + msgList.map(msg => this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat))) ).filter(msg => msg !== undefined); return { 'messages': ob11MsgList }; } diff --git a/src/onebot/action/group/GetGroupEssence.ts b/src/onebot/action/group/GetGroupEssence.ts index 579d2d5e..8ce4fff5 100644 --- a/src/onebot/action/group/GetGroupEssence.ts +++ b/src/onebot/action/group/GetGroupEssence.ts @@ -3,8 +3,8 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import crypto from 'crypto'; -import { AdapterConfigWrap } from '@/onebot/config/config'; import { Static, Type } from '@sinclair/typebox'; +import { NetworkAdapterConfig } from '@/onebot/config/config'; const SchemaData = Type.Object({ group_id: Type.Union([Type.Number(), Type.String()]), @@ -27,9 +27,7 @@ export class GetGroupEssence extends OneBotAction { }; } - async _handle(payload: Payload, adapter: string) { - const network = Object.values(this.obContext.configLoader.configData.network) as Array; - const msgFormat = network.flat().find(e => e.name === adapter)?.messagePostFormat ?? 'array'; + async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig) { const msglist = (await this.core.apis.WebApi.getGroupEssenceMsgAll(payload.group_id.toString())).flatMap((e) => e.data.msg_list); if (!msglist) { throw new Error('获取失败'); @@ -50,7 +48,7 @@ export class GetGroupEssence extends OneBotAction { operator_nick: msg.add_digest_nick, message_id: message_id, operator_time: msg.add_digest_time, - content: (await this.obContext.apis.MsgApi.parseMessage(rawMessage, msgFormat))?.message + content: (await this.obContext.apis.MsgApi.parseMessage(rawMessage, config.messagePostFormat))?.message }; } const msgTempData = JSON.stringify({ diff --git a/src/onebot/action/msg/GetMsg.ts b/src/onebot/action/msg/GetMsg.ts index 3b4054bb..20721c98 100644 --- a/src/onebot/action/msg/GetMsg.ts +++ b/src/onebot/action/msg/GetMsg.ts @@ -3,8 +3,8 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; import { MessageUnique } from '@/common/message-unique'; import { RawMessage } from '@/core'; -import { AdapterConfigWrap } from '@/onebot/config/config'; import { Static, Type } from '@sinclair/typebox'; +import { NetworkAdapterConfig } from '@/onebot/config/config'; export type ReturnDataType = OB11Message @@ -18,10 +18,8 @@ class GetMsg extends OneBotAction { actionName = ActionName.GetMsg; payloadSchema = SchemaData; - async _handle(payload: Payload, adapter: string) { + async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig) { // log("history msg ids", Object.keys(msgHistory)); - const network = Object.values(this.obContext.configLoader.configData.network) as Array; - const msgFormat = network.flat().find(e => e.name === adapter)?.messagePostFormat ?? 'array'; if (!payload.message_id) { throw Error('参数message_id不能为空'); } @@ -38,7 +36,7 @@ class GetMsg extends OneBotAction { } else { msg = (await this.core.apis.MsgApi.getMsgsByMsgId(peer, [msgIdWithPeer?.MsgId || payload.message_id.toString()])).msgList[0]; } - const retMsg = await this.obContext.apis.MsgApi.parseMessage(msg, msgFormat); + const retMsg = await this.obContext.apis.MsgApi.parseMessage(msg, config.messagePostFormat); if (!retMsg) throw Error('消息为空'); try { retMsg.message_id = MessageUnique.createUniqueMsgId(peer, msg.msgId)!; diff --git a/src/onebot/action/user/GetRecentContact.ts b/src/onebot/action/user/GetRecentContact.ts index 96a180fe..9b79bac5 100644 --- a/src/onebot/action/user/GetRecentContact.ts +++ b/src/onebot/action/user/GetRecentContact.ts @@ -1,7 +1,7 @@ import { OneBotAction } from '@/onebot/action/OneBotAction'; import { ActionName } from '@/onebot/action/router'; -import { AdapterConfigWrap } from '@/onebot/config/config'; +import { NetworkAdapterConfig } from '@/onebot/config/config'; import { Static, Type } from '@sinclair/typebox'; const SchemaData = Type.Object({ @@ -14,16 +14,14 @@ export default class GetRecentContact extends OneBotAction { actionName = ActionName.GetRecentContact; payloadSchema = SchemaData; - async _handle(payload: Payload, adapter: string) { + async _handle(payload: Payload, adapter: string, config: NetworkAdapterConfig) { const ret = await this.core.apis.UserApi.getRecentContactListSnapShot(+payload.count); - const network = Object.values(this.obContext.configLoader.configData.network) as Array; //烘焙消息 - const msgFormat = network.flat().find(e => e.name === adapter)?.messagePostFormat ?? 'array'; return await Promise.all(ret.info.changedList.map(async (t) => { const FastMsg = await this.core.apis.MsgApi.getMsgsByMsgId({ chatType: t.chatType, peerUid: t.peerUid }, [t.msgId]); if (FastMsg.msgList.length > 0) { //扩展ret.info.changedList - const lastestMsg = await this.obContext.apis.MsgApi.parseMessage(FastMsg.msgList[0], msgFormat); + const lastestMsg = await this.obContext.apis.MsgApi.parseMessage(FastMsg.msgList[0], config.messagePostFormat); return { lastestMsg: lastestMsg, peerUin: t.peerUin, diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index fc12b28f..bc126e5c 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -906,16 +906,16 @@ export class OneBotMsgApi { const calculateTotalSize = async (elements: SendMessageElement[]): Promise => { const sizePromises = elements.map(async element => { switch (element.elementType) { - case ElementType.PTT: - return (await fsPromise.stat(element.pttElement.filePath)).size; - case ElementType.FILE: - return (await fsPromise.stat(element.fileElement.filePath)).size; - case ElementType.VIDEO: - return (await fsPromise.stat(element.videoElement.filePath)).size; - case ElementType.PIC: - return (await fsPromise.stat(element.picElement.sourcePath)).size; - default: - return 0; + case ElementType.PTT: + return (await fsPromise.stat(element.pttElement.filePath)).size; + case ElementType.FILE: + return (await fsPromise.stat(element.fileElement.filePath)).size; + case ElementType.VIDEO: + return (await fsPromise.stat(element.videoElement.filePath)).size; + case ElementType.PIC: + return (await fsPromise.stat(element.picElement.sourcePath)).size; + default: + return 0; } }); const sizes = await Promise.all(sizePromises); @@ -1008,14 +1008,14 @@ export class OneBotMsgApi { } groupChangDecreseType2String(type: number): GroupDecreaseSubType { switch (type) { - case 130: - return 'leave'; - case 131: - return 'kick'; - case 3: - return 'kick_me'; - default: - return 'kick'; + case 130: + return 'leave'; + case 131: + return 'kick'; + case 3: + return 'kick_me'; + default: + return 'kick'; } } diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index 8ec8403e..8279be69 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,255 +1,109 @@ -interface v1Config { - http: { - enable: boolean; - host: string; - port: number; - secret: string; - enableHeart: boolean; - enablePost: boolean; - postUrls: string[]; - }; - ws: { - enable: boolean; - host: string; - port: number; - }; - reverseWs: { - enable: boolean; - urls: string[]; - }; - debug: boolean; - heartInterval: number; - messagePostFormat: string; - enableLocalFile2Url: boolean; - musicSignUrl: string; - reportSelfMessage: boolean; - token: string; -} -export interface AdapterConfigInner { - name: string; - enable: boolean; +import { Type, Static } from '@sinclair/typebox'; +import Ajv from 'ajv'; -} -export type AdapterConfigWrap = AdapterConfigInner & Partial; +const ajv = new Ajv({ useDefaults: true }); -export interface AdapterConfig extends AdapterConfigInner { - [key: string]: any; -} - -const createDefaultAdapterConfig = (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, - port: 3000, - host: '0.0.0.0', - enableCors: true, - enableWebsocket: true, - messagePostFormat: 'array', - token: '', - debug: false, -}); -export type HttpServerConfig = typeof httpServerDefaultConfigs; - -export const httpSseServerDefaultConfigs = createDefaultAdapterConfig({ - ...httpServerDefaultConfigs, - name: 'http-sse-server', - reportSelfMessage: false, -}); -export type HttpSseServerConfig = typeof httpSseServerDefaultConfigs; - -export const httpClientDefaultConfigs = createDefaultAdapterConfig({ - name: 'http-client', - enable: false as boolean, - url: 'http://localhost:8080', - messagePostFormat: 'array', - reportSelfMessage: false, - token: '', - debug: false, -}); -export type HttpClientConfig = typeof httpClientDefaultConfigs; - -export const websocketServerDefaultConfigs = createDefaultAdapterConfig({ - name: 'websocket-server', - enable: false as boolean, - host: '0.0.0.0', - port: 3001, - messagePostFormat: 'array', - reportSelfMessage: false, - token: '', - enableForcePushEvent: true, - debug: false, - heartInterval: 30000, -}); -export type WebsocketServerConfig = typeof websocketServerDefaultConfigs; - -export const websocketClientDefaultConfigs = createDefaultAdapterConfig({ - name: 'websocket-client', - enable: false as boolean, - url: 'ws://localhost:8082', - messagePostFormat: 'array', - reportSelfMessage: false, - reconnectInterval: 5000, - token: '', - debug: false, - heartInterval: 30000, -}); -export type WebsocketClientConfig = typeof websocketClientDefaultConfigs; - -export interface NetworkConfig { - httpServers: Array; - httpSseServers: Array; - httpClients: Array; - websocketServers: Array; - websocketClients: Array; -} - -export function mergeConfigs(defaultConfig: T, userConfig: Partial): T { - return { ...defaultConfig, ...userConfig }; -} - -export interface OneBotConfig { - network: NetworkConfig; // 网络配置 - musicSignUrl: string; // 音乐签名地址 - enableLocalFile2Url: boolean; - parseMultMsg: boolean; -} - -const createDefaultConfig = (config: T): T => config; - -export const defaultOneBotConfigs = createDefaultConfig({ - network: { - httpServers: [], - httpSseServers: [], - httpClients: [], - websocketServers: [], - websocketClients: [], - }, - musicSignUrl: '', - enableLocalFile2Url: false, - parseMultMsg: true +const HttpServerConfigSchema = Type.Object({ + name: Type.String({ default: 'http-server' }), + enable: Type.Boolean({ default: false }), + port: Type.Number({ default: 3000 }), + host: Type.String({ default: '0.0.0.0' }), + enableCors: Type.Boolean({ default: true }), + enableWebsocket: Type.Boolean({ default: true }), + messagePostFormat: Type.String({ default: 'array' }), + token: Type.String({ default: '' }), + debug: Type.Boolean({ default: false }) }); -export const mergeNetworkDefaultConfig = { - httpSseServers: httpSseServerDefaultConfigs, - httpServers: httpServerDefaultConfigs, - httpClients: httpClientDefaultConfigs, - websocketServers: websocketServerDefaultConfigs, - websocketClients: websocketClientDefaultConfigs, -} as const; +const HttpSseServerConfigSchema = Type.Object({ + name: Type.String({ default: 'http-sse-server' }), + enable: Type.Boolean({ default: false }), + port: Type.Number({ default: 3000 }), + host: Type.String({ default: '0.0.0.0' }), + enableCors: Type.Boolean({ default: true }), + enableWebsocket: Type.Boolean({ default: true }), + messagePostFormat: Type.String({ default: 'array' }), + token: Type.String({ default: '' }), + debug: Type.Boolean({ default: false }), + reportSelfMessage: Type.Boolean({ default: false }) +}); -export type NetworkConfigAdapter = HttpServerConfig | HttpSseServerConfig | HttpClientConfig | WebsocketServerConfig | WebsocketClientConfig | PluginConfig; -type NetworkConfigKeys = keyof typeof mergeNetworkDefaultConfig; +const HttpClientConfigSchema = Type.Object({ + name: Type.String({ default: 'http-client' }), + enable: Type.Boolean({ default: false }), + url: Type.String({ default: 'http://localhost:8080' }), + messagePostFormat: Type.String({ default: 'array' }), + reportSelfMessage: Type.Boolean({ default: false }), + token: Type.String({ default: '' }), + debug: Type.Boolean({ default: false }) +}); -export function mergeOneBotConfigs( - userConfig: Partial, - defaultConfig: OneBotConfig = defaultOneBotConfigs -): OneBotConfig { - const mergedConfig = { ...defaultConfig }; +const WebsocketServerConfigSchema = Type.Object({ + name: Type.String({ default: 'websocket-server' }), + enable: Type.Boolean({ default: false }), + host: Type.String({ default: '0.0.0.0' }), + port: Type.Number({ default: 3001 }), + messagePostFormat: Type.String({ default: 'array' }), + reportSelfMessage: Type.Boolean({ default: false }), + token: Type.String({ default: '' }), + enableForcePushEvent: Type.Boolean({ default: true }), + debug: Type.Boolean({ default: false }), + heartInterval: Type.Number({ default: 30000 }) +}); - if (userConfig.network) { - mergedConfig.network = { ...defaultConfig.network }; - for (const key in userConfig.network) { - const userNetworkConfig = userConfig.network[key as keyof NetworkConfig]; - const defaultNetworkConfig = mergeNetworkDefaultConfig[key as NetworkConfigKeys]; - if (Array.isArray(userNetworkConfig)) { - mergedConfig.network[key as keyof NetworkConfig] = userNetworkConfig.map((e) => - mergeConfigs(defaultNetworkConfig, e) - ); - } - } - } - if (userConfig.musicSignUrl !== undefined) { - mergedConfig.musicSignUrl = userConfig.musicSignUrl; - } - if (userConfig.enableLocalFile2Url !== undefined) { - mergedConfig.enableLocalFile2Url = userConfig.enableLocalFile2Url; - } - if (userConfig.parseMultMsg !== undefined) { - mergedConfig.parseMultMsg = userConfig.parseMultMsg; - } - return mergedConfig; -} +const WebsocketClientConfigSchema = Type.Object({ + name: Type.String({ default: 'websocket-client' }), + enable: Type.Boolean({ default: false }), + url: Type.String({ default: 'ws://localhost:8082' }), + messagePostFormat: Type.String({ default: 'array' }), + reportSelfMessage: Type.Boolean({ default: false }), + reconnectInterval: Type.Number({ default: 5000 }), + token: Type.String({ default: '' }), + debug: Type.Boolean({ default: false }), + heartInterval: Type.Number({ default: 30000 }) +}); -function checkIsOneBotConfigV1(v1Config: Partial): boolean { - return v1Config.http !== undefined || v1Config.ws !== undefined || v1Config.reverseWs !== undefined; -} +const PluginConfigSchema = Type.Object({ + name: Type.String({ default: 'plugin' }), + enable: Type.Boolean({ default: false }), + messagePostFormat: Type.String({ default: 'array' }), + reportSelfMessage: Type.Boolean({ default: false }), + debug: Type.Boolean({ default: false }), +}); -export function migrateOneBotConfigsV1(config: Partial): OneBotConfig { - if (!checkIsOneBotConfigV1(config)) { - return config as OneBotConfig; +const NetworkConfigSchema = Type.Object({ + httpServers: Type.Array(HttpServerConfigSchema), + httpSseServers: Type.Array(HttpSseServerConfigSchema), + httpClients: Type.Array(HttpClientConfigSchema), + websocketServers: Type.Array(WebsocketServerConfigSchema), + websocketClients: Type.Array(WebsocketClientConfigSchema), + plugins: Type.Array(PluginConfigSchema) +}); + +const OneBotConfigSchema = Type.Object({ + network: NetworkConfigSchema, + musicSignUrl: Type.String({ default: '' }), + enableLocalFile2Url: Type.Boolean({ default: false }), + parseMultMsg: Type.Boolean({ default: true }) +}); + + +export type OneBotConfig = Static; +export type HttpServerConfig = Static; +export type HttpSseServerConfig = Static; +export type HttpClientConfig = Static; +export type WebsocketServerConfig = Static; +export type WebsocketClientConfig = Static; +export type PluginConfig = Static; + +export type NetworkAdapterConfig = HttpServerConfig | HttpSseServerConfig | HttpClientConfig | WebsocketServerConfig | WebsocketClientConfig| PluginConfig; + +const validate = ajv.compile(OneBotConfigSchema); + +export function loadConfig(config: Partial): OneBotConfig { + const valid = validate(config); + if (!valid) { + throw new Error(ajv.errorsText(validate.errors)); } - const mergedConfig = { ...defaultOneBotConfigs }; - if (config.http) { - mergedConfig.network.httpServers = [ - mergeConfigs(httpServerDefaultConfigs, { - name: 'http-server', - enable: config.http.enable, - port: config.http.port, - host: config.http.host, - token: config.http.secret, - debug: config.debug, - messagePostFormat: config.messagePostFormat, - }), - ]; - } - if (config.ws) { - mergedConfig.network.websocketServers = [ - mergeConfigs(websocketServerDefaultConfigs, { - name: 'websocket-server', - enable: config.ws.enable, - port: config.ws.port, - host: config.ws.host, - token: config.token, - debug: config.debug, - messagePostFormat: config.messagePostFormat, - reportSelfMessage: config.reportSelfMessage, - }), - ]; - } - if (config.reverseWs) { - mergedConfig.network.websocketClients = config.reverseWs.urls.map((url) => - mergeConfigs(websocketClientDefaultConfigs, { - name: 'websocket-client-' + config.reverseWs?.urls.indexOf(url).toString(), - enable: config.reverseWs?.enable, - url: url, - token: config.token, - debug: config.debug, - messagePostFormat: config.messagePostFormat, - reportSelfMessage: config.reportSelfMessage, - }) - ); - } - if (config.heartInterval) { - mergedConfig.network.websocketServers[0].heartInterval = config.heartInterval; - } - if (config.musicSignUrl) { - mergedConfig.musicSignUrl = config.musicSignUrl; - } - if (config.enableLocalFile2Url) { - mergedConfig.enableLocalFile2Url = config.enableLocalFile2Url; - } - return mergedConfig; -} -export function getConfigBoolKey( - configs: Array, - prediction: (config: NetworkConfigAdapter) => boolean -): { positive: Array, negative: Array } { - const result: { positive: string[], negative: string[] } = { positive: [], negative: [] }; - configs.forEach(config => { - if (prediction(config)) { - result.positive.push(config.name); - } else { - result.negative.push(config.name); - } - }); - return result; -} + return config as OneBotConfig; +} \ No newline at end of file diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 86f00550..f71d4cca 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -44,10 +44,8 @@ import { LRUCache } from '@/common/lru-cache'; import { NodeIKernelRecentContactListener } from '@/core/listeners/NodeIKernelRecentContactListener'; import { BotOfflineEvent } from './event/notice/BotOfflineEvent'; import { - AdapterConfigWrap, - mergeOneBotConfigs, - migrateOneBotConfigsV1, - NetworkConfigAdapter, + NetworkAdapterConfig, + loadConfig, OneBotConfig, } from './config/config'; import { OB11Message } from './types'; @@ -71,8 +69,8 @@ export class NapCatOneBot11Adapter { this.core = core; this.context = context; this.configLoader = new OB11ConfigLoader(core, pathWrapper.configPath); - this.configLoader.save(migrateOneBotConfigsV1(this.configLoader.configData)); - this.configLoader.save(mergeOneBotConfigs(this.configLoader.configData)); + this.configLoader.save(this.configLoader.configData); + this.configLoader.save(loadConfig(this.configLoader.configData)); this.apis = { GroupApi: new OneBotGroupApi(this, core), UserApi: new OneBotUserApi(this, core), @@ -181,7 +179,7 @@ export class NapCatOneBot11Adapter { WebUiDataRuntime.setOnOB11ConfigChanged(async (newConfig) => { const prev = this.configLoader.configData; // 保证默认配置 - newConfig = mergeOneBotConfigs(newConfig); + newConfig = loadConfig(newConfig); this.configLoader.save(newConfig); //this.context.logger.log(`OneBot11 配置更改:${JSON.stringify(prev)} -> ${JSON.stringify(newConfig)}`); @@ -215,9 +213,9 @@ export class NapCatOneBot11Adapter { await this.handleConfigChange(prev.network.websocketClients, now.network.websocketClients, OB11ActiveWebSocketAdapter); } - private async handleConfigChange( - prevConfig: NetworkConfigAdapter[], - nowConfig: NetworkConfigAdapter[], + private async handleConfigChange( + prevConfig: NetworkAdapterConfig[], + nowConfig: NetworkAdapterConfig[], adapterClass: new ( ...args: ConstructorParameters> ) => IOB11NetworkAdapter @@ -479,7 +477,7 @@ export class NapCatOneBot11Adapter { ]); } - private async handleMsg(message: RawMessage, network: Array) { + private async handleMsg(message: RawMessage, network: Array) { // 过滤无效消息 if (message.msgType === NTMsgType.KMSGTYPENULL) { return; @@ -508,7 +506,7 @@ export class NapCatOneBot11Adapter { ob11Msg.arrayMsg.user_id.toString() == this.core.selfInfo.uin; } - private createMsgMap(network: Array, ob11Msg: any, isSelfMsg: boolean, message: RawMessage): Map { + private createMsgMap(network: Array, ob11Msg: any, isSelfMsg: boolean, message: RawMessage): Map { const msgMap: Map = new Map(); network.filter(e => e.enable).forEach(e => { if (isSelfMsg || message.chatType !== ChatType.KCHATTYPEGROUP) { @@ -525,7 +523,7 @@ export class NapCatOneBot11Adapter { return msgMap; } - private handleDebugNetwork(network: Array, msgMap: Map, message: RawMessage) { + private handleDebugNetwork(network: Array, msgMap: Map, message: RawMessage) { const debugNetwork = network.filter(e => e.enable && e.debug); if (debugNetwork.length > 0) { debugNetwork.forEach(adapter => { @@ -539,7 +537,7 @@ export class NapCatOneBot11Adapter { } } - private handleNotReportSelfNetwork(network: Array, msgMap: Map, isSelfMsg: boolean) { + private handleNotReportSelfNetwork(network: Array, msgMap: Map, isSelfMsg: boolean) { if (isSelfMsg) { const notReportSelfNetwork = network.filter(e => e.enable && (('reportSelfMessage' in e && !e.reportSelfMessage) || !('reportSelfMessage' in e))); notReportSelfNetwork.forEach(adapter => { diff --git a/src/onebot/network/adapter.ts b/src/onebot/network/adapter.ts index 72dedb01..b2578455 100644 --- a/src/onebot/network/adapter.ts +++ b/src/onebot/network/adapter.ts @@ -1,11 +1,11 @@ -import { NetworkConfigAdapter } from "@/onebot/config/config"; +import { NetworkAdapterConfig } 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 { +export abstract class IOB11NetworkAdapter { name: string; isEnable: boolean = false; config: CT; diff --git a/src/onebot/network/index.ts b/src/onebot/network/index.ts index 9821c168..941684e4 100644 --- a/src/onebot/network/index.ts +++ b/src/onebot/network/index.ts @@ -1,6 +1,6 @@ import { OneBotEvent } from '@/onebot/event/OneBotEvent'; import { OB11Message } from '@/onebot'; -import { NetworkConfigAdapter } from '@/onebot/config/config'; +import { NetworkAdapterConfig } from '@/onebot/config/config'; import { IOB11NetworkAdapter } from "@/onebot/network/adapter"; export type OB11EmitEventContent = OneBotEvent | OB11Message; @@ -13,7 +13,7 @@ export enum OB11NetworkReloadType { } 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())); @@ -49,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) { @@ -77,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); } diff --git a/src/onebot/network/plugin.ts b/src/onebot/network/plugin.ts index ffac15b7..16683cf0 100644 --- a/src/onebot/network/plugin.ts +++ b/src/onebot/network/plugin.ts @@ -22,7 +22,7 @@ export class OB11PluginAdapter extends IOB11NetworkAdapter { onEvent(event: T) { if (event.post_type === 'message') { - plugin_onmessage(this.config.name, this.core, this.obContext, event as OB11Message,this.actions).then().catch(); + plugin_onmessage(this.config.name, this.core, this.obContext, event as OB11Message, this.actions, this).then().catch(); } } diff --git a/src/plugin/index.ts b/src/plugin/index.ts index 0c54c479..4b070b7b 100644 --- a/src/plugin/index.ts +++ b/src/plugin/index.ts @@ -1,10 +1,11 @@ import { NapCatOneBot11Adapter, OB11Message } from "@/onebot"; import { NapCatCore } from "@/core"; import { ActionMap } from "@/onebot/action"; +import { OB11PluginAdapter } from "@/onebot/network/plugin"; -export const plugin_onmessage = async (adapter: string, core: NapCatCore, obCtx: NapCatOneBot11Adapter, message: OB11Message, action: ActionMap) => { +export const plugin_onmessage = async (adapter: string, core: NapCatCore, obCtx: NapCatOneBot11Adapter, message: OB11Message, action: ActionMap, instance: OB11PluginAdapter) => { if (message.raw_message === 'ping') { - const ret = await action.get('send_group_msg')?.handle({ group_id: String(message.group_id), message: 'pong' }, adapter); + const ret = await action.get('send_group_msg')?.handle({ group_id: String(message.group_id), message: 'pong' }, adapter, instance.config); console.log(ret); } }; diff --git a/src/universal/LiteLoader.d.ts b/src/universal/LiteLoader.d.ts index 3f8f95ff..97f8b666 100644 --- a/src/universal/LiteLoader.d.ts +++ b/src/universal/LiteLoader.d.ts @@ -1,6 +1,6 @@ declare global { namespace globalThis { - var LiteLoader: Symbol; + const LiteLoader: symbol; } } -export {} \ No newline at end of file +export {}; \ No newline at end of file