diff --git a/napcat.webui/src/pages/NetWork.vue b/napcat.webui/src/pages/NetWork.vue index c61e01f0..b4482352 100644 --- a/napcat.webui/src/pages/NetWork.vue +++ b/napcat.webui/src/pages/NetWork.vue @@ -48,7 +48,6 @@ import { WebsocketServerConfig, NetworkConfig, OneBotConfig, - defaultOneBotConfigs, mergeOneBotConfigs, } from '../../../src/onebot/config/config'; import { QQLoginManager } from '@/backend/shell'; @@ -89,6 +88,7 @@ interface ClientPanel { type ComponentKey = keyof typeof componentMap; +// TODO: store these state in global store (aka pinia) const activeTab = ref(0); const isDialogVisible = ref(false); const newTab = ref<{ name: string; type: ComponentKey }>({ name: '', type: 'httpServers' }); @@ -151,7 +151,7 @@ const loadConfig = async () => { try { const userConfig = await getOB11Config(); if (!userConfig) return; - const mergedConfig = mergeOneBotConfigs(defaultOneBotConfigs, userConfig); + const mergedConfig = mergeOneBotConfigs(userConfig); addConfigDataToPanel(mergedConfig.network); } catch (error) { console.error('Error loading config:', error); diff --git a/package.json b/package.json index 25f3ccb2..435b69e3 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build:framework": "npm run build:webui && vite build --mode framework", "build:shell": "npm run build:webui && vite build --mode shell", "build:webui": "cd napcat.webui && vite build", - "lint": "eslint --fix src/**/*.{js,ts}", + "lint": "eslint --fix src/**/*.{js,ts,vue}", "depend": "cd dist && npm install --omit=dev" }, "devDependencies": { diff --git a/src/onebot/config/config.ts b/src/onebot/config/config.ts index d2d8481d..56634f59 100644 --- a/src/onebot/config/config.ts +++ b/src/onebot/config/config.ts @@ -1,3 +1,31 @@ +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 AdapterConfig { name: string; enable: boolean; @@ -8,7 +36,7 @@ const createDefaultAdapterConfig = (config: T): T => co export const httpServerDefaultConfigs = createDefaultAdapterConfig({ name: 'http-server', - enable: false, + enable: false as boolean, port: 3000, host: '0.0.0.0', enableCors: true, @@ -22,7 +50,7 @@ export type HttpServerConfig = typeof httpServerDefaultConfigs; export const httpClientDefaultConfigs = createDefaultAdapterConfig({ name: 'http-client', - enable: false, + enable: false as boolean, url: 'http://localhost:8080', messagePostFormat: 'array', reportSelfMessage: false, @@ -33,7 +61,7 @@ export type HttpClientConfig = typeof httpClientDefaultConfigs; export const websocketServerDefaultConfigs = createDefaultAdapterConfig({ name: 'websocket-server', - enable: false, + enable: false as boolean, host: '0.0.0.0', port: 3002, messagePostFormat: 'array', @@ -47,7 +75,7 @@ export type WebsocketServerConfig = typeof websocketServerDefaultConfigs; export const websocketClientDefaultConfigs = createDefaultAdapterConfig({ name: 'websocket-client', - enable: false, + enable: false as boolean, url: 'ws://localhost:8082', messagePostFormat: 'array', reportSelfMessage: false, @@ -69,8 +97,8 @@ export function mergeConfigs(defaultConfig: T, userConf } export interface OneBotConfig { - network: NetworkConfig; //网络配置 - musicSignUrl: string; //音乐签名地址 + network: NetworkConfig; // 网络配置 + musicSignUrl: string; // 音乐签名地址 enableLocalFile2Url: boolean; } @@ -97,7 +125,10 @@ export const mergeNetworkDefaultConfig = { type NetworkConfigKeys = keyof typeof mergeNetworkDefaultConfig; // TODO: wrong type hint in userConfig (aka old userConfig) -export function mergeOneBotConfigs(defaultConfig: OneBotConfig, userConfig: Partial): OneBotConfig { +export function mergeOneBotConfigs( + userConfig: Partial, + defaultConfig: OneBotConfig = defaultOneBotConfigs +): OneBotConfig { const mergedConfig = { ...defaultConfig }; if (userConfig.network) { @@ -117,3 +148,58 @@ export function mergeOneBotConfigs(defaultConfig: OneBotConfig, userConfig: Part } return mergedConfig; } + +export function migrateOneBotConfigsV1( + v1Config: Partial, + defaultConfig: OneBotConfig = defaultOneBotConfigs +): OneBotConfig { + const mergedConfig = { ...defaultConfig }; + if (v1Config.http) { + mergedConfig.network.httpServers = [ + mergeConfigs(httpServerDefaultConfigs, { + enable: v1Config.http.enable, + port: v1Config.http.port, + host: v1Config.http.host, + token: v1Config.http.secret, + debug: v1Config.debug, + messagePostFormat: v1Config.messagePostFormat, + reportSelfMessage: v1Config.reportSelfMessage, + }), + ]; + } + if (v1Config.ws) { + mergedConfig.network.websocketServers = [ + mergeConfigs(websocketServerDefaultConfigs, { + enable: v1Config.ws.enable, + port: v1Config.ws.port, + host: v1Config.ws.host, + token: v1Config.token, + debug: v1Config.debug, + messagePostFormat: v1Config.messagePostFormat, + reportSelfMessage: v1Config.reportSelfMessage, + }), + ]; + } + if (v1Config.reverseWs) { + mergedConfig.network.websocketClients = v1Config.reverseWs.urls.map((url) => + mergeConfigs(websocketClientDefaultConfigs, { + enable: v1Config.reverseWs?.enable, + url: url, + token: v1Config.token, + debug: v1Config.debug, + messagePostFormat: v1Config.messagePostFormat, + reportSelfMessage: v1Config.reportSelfMessage, + }) + ); + } + if (v1Config.heartInterval) { + mergedConfig.network.websocketServers[0].heartInterval = v1Config.heartInterval; + } + if (v1Config.musicSignUrl) { + mergedConfig.musicSignUrl = v1Config.musicSignUrl; + } + if (v1Config.enableLocalFile2Url) { + mergedConfig.enableLocalFile2Url = v1Config.enableLocalFile2Url; + } + return mergedConfig; +} diff --git a/src/onebot/index.ts b/src/onebot/index.ts index 9eba2359..5344da73 100644 --- a/src/onebot/index.ts +++ b/src/onebot/index.ts @@ -45,7 +45,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 { defaultOneBotConfigs, mergeOneBotConfigs, OneBotConfig } from './config/config'; +import { mergeOneBotConfigs, migrateOneBotConfigsV1, OneBotConfig } from './config/config'; import { OB11Message } from './types'; //OneBot实现类 @@ -64,7 +64,7 @@ export class NapCatOneBot11Adapter { this.core = core; this.context = context; this.configLoader = new OB11ConfigLoader(core, pathWrapper.configPath); - this.configLoader.save(mergeOneBotConfigs(defaultOneBotConfigs, this.configLoader.configData)); + this.configLoader.save(mergeOneBotConfigs(migrateOneBotConfigsV1(this.configLoader.configData))); this.apis = { GroupApi: new OneBotGroupApi(this, core), UserApi: new OneBotUserApi(this, core),