diff --git a/src/index.ts b/src/index.ts index 029065ed..795e78e0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,7 +36,11 @@ checkVersion().then((remoteVersion: string) => { }).catch((e) => { logError('[NapCat] 检测更新失败'); }); -new NapCatOnebot11(); +// 不是很好待优化 +let NapCat_OneBot11 = new NapCatOnebot11(); + +WebUiDataRuntime.setOB11ConfigCall(NapCat_OneBot11.SetConfig); + napCatCore.onLoginSuccess((uin, uid) => { console.log('登录成功!'); WebUiDataRuntime.setQQLoginStatus(true); @@ -64,7 +68,7 @@ napCatCore.getQuickLoginList().then((res) => { WebUiDataRuntime.setQQQuickLoginList(res.LocalLoginInfoList.filter((item) => item.isQuickLogin).map((item) => item.uin.toString())); }); -WebUiDataRuntime.setQQQuickLogin(async (uin: string) => { +WebUiDataRuntime.setQQQuickLoginCall(async (uin: string) => { const QuickLogin: Promise<{ result: boolean, message: string }> = new Promise((resolve, reject) => { if (quickLoginQQ) { log('正在快速登录 ', quickLoginQQ); diff --git a/src/onebot11/main.ts b/src/onebot11/main.ts index d6676050..5ba69bfd 100644 --- a/src/onebot11/main.ts +++ b/src/onebot11/main.ts @@ -11,7 +11,7 @@ import { GroupNotifyTypes, RawMessage } from '@/core/entities'; -import { ob11Config } from '@/onebot11/config'; +import { OB11Config, ob11Config } from '@/onebot11/config'; import { httpHeart, ob11HTTPServer } from '@/onebot11/server/http'; import { ob11WebsocketServer } from '@/onebot11/server/ws/WebsocketServer'; import { ob11ReverseWebsockets } from '@/onebot11/server/ws/ReverseWebsocket'; @@ -87,7 +87,7 @@ export class NapCatOnebot11 { logDebug('收到消息', msg); for (const m of msg) { // try: 减掉3s 试图修复消息半天收不到 - if (this.bootTime - 3> parseInt(m.msgTime)) { + if (this.bootTime - 3 > parseInt(m.msgTime)) { logDebug(`消息时间${m.msgTime}早于启动时间${this.bootTime},忽略上报`); continue; } @@ -189,7 +189,72 @@ export class NapCatOnebot11 { }).catch(e => logError('constructFriendAddEvent error: ', e)); } } + async SetConfig(NewOb11: OB11Config) { + function isEqual(obj1: any, obj2: any) { + if (obj1 === obj2) return true; + if (obj1 == null || obj2 == null) return false; + if (typeof obj1 !== 'object' || typeof obj2 !== 'object') return obj1 === obj2; + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + + if (keys1.length !== keys2.length) return false; + + for (let key of keys1) { + if (!isEqual(obj1[key], obj2[key])) return false; + } + return true; + } + // if (!NewOb11 || typeof NewOb11 !== 'object') { + // throw new Error('Invalid configuration object'); + // } + + const isHttpChanged = !isEqual(NewOb11.httpPort, ob11Config.httpPort) && NewOb11.enableHttp; + const isWsChanged = !isEqual(NewOb11.wsPort, ob11Config.wsPort); + const isEnableWsChanged = !isEqual(NewOb11.enableWs, ob11Config.enableWs); + const isEnableWsReverseChanged = !isEqual(NewOb11.enableWsReverse, ob11Config.enableWsReverse); + const isWsReverseUrlsChanged = !isEqual(NewOb11.wsReverseUrls, ob11Config.wsReverseUrls); + + if (isHttpChanged) { + ob11HTTPServer.restart(NewOb11.httpPort, NewOb11.httpHost); + } + + if (!NewOb11.enableHttp) { + ob11HTTPServer.stop(); + } else { + ob11HTTPServer.start(NewOb11.httpPort, NewOb11.httpHost); + } + + if (isWsChanged) { + ob11WebsocketServer.restart(NewOb11.wsPort); + } + + if (isEnableWsChanged) { + if (NewOb11.enableWs) { + ob11WebsocketServer.start(NewOb11.wsPort, NewOb11.wsHost); + } else { + ob11WebsocketServer.stop(); + } + } + + if (isEnableWsReverseChanged) { + if (NewOb11.enableWsReverse) { + ob11ReverseWebsockets.start(); + } else { + ob11ReverseWebsockets.stop(); + } + } + if (NewOb11.enableWsReverse && isWsReverseUrlsChanged) { + logDebug('反向ws地址有变化, 重启反向ws服务'); + ob11ReverseWebsockets.restart(); + } + if (NewOb11.enableHttpHeart) { + httpHeart.start(); + } else if (!NewOb11.enableHttpHeart) { + httpHeart.stop(); + } + ob11Config.save(NewOb11); + } async postGroupNotifies(notifies: GroupNotify[]) { for (const notify of notifies) { try { diff --git a/src/webui/src/api/OB11Config.ts b/src/webui/src/api/OB11Config.ts index ad4fe4ef..933245a2 100644 --- a/src/webui/src/api/OB11Config.ts +++ b/src/webui/src/api/OB11Config.ts @@ -51,20 +51,36 @@ export const OB11SetConfigHandler: RequestHandler = async (req, res) => { }); return; } - let configFilePath = resolve(__dirname, `./config/onebot11_${await WebUiDataRuntime.getQQLoginUin()}.json`); + let SetResult; try { - JSON.parse(req.body.config) - readFileSync(configFilePath); + await WebUiDataRuntime.setOB11Config(JSON.parse(req.body.config)); + SetResult = true; + } catch (e) { + SetResult = false; } - catch (e) { - //console.log(e); - configFilePath = resolve(__dirname, `./config/onebot11.json`); + + // let configFilePath = resolve(__dirname, `./config/onebot11_${await WebUiDataRuntime.getQQLoginUin()}.json`); + // try { + // JSON.parse(req.body.config) + // readFileSync(configFilePath); + // } + // catch (e) { + // //console.log(e); + // configFilePath = resolve(__dirname, `./config/onebot11.json`); + // } + // //console.log(configFilePath,JSON.parse(req.body.config)); + // writeFileSync(configFilePath, JSON.stringify(JSON.parse(req.body.config), null, 4)); + if (SetResult) { + res.send({ + code: 0, + message: 'success' + }); + } else { + res.send({ + code: -1, + message: 'Config Set Error' + }); } - //console.log(configFilePath,JSON.parse(req.body.config)); - writeFileSync(configFilePath, JSON.stringify(JSON.parse(req.body.config), null, 4)); - res.send({ - code: 0, - message: 'success' - }); + return; } \ No newline at end of file diff --git a/src/webui/src/helper/Data.ts b/src/webui/src/helper/Data.ts index 1209264d..38e11a95 100644 --- a/src/webui/src/helper/Data.ts +++ b/src/webui/src/helper/Data.ts @@ -1,3 +1,5 @@ +import { OB11Config } from "@/onebot11/config"; + interface LoginRuntimeType { LoginCurrentTime: number; LoginCurrentRate: number; @@ -5,7 +7,8 @@ interface LoginRuntimeType { QQQRCodeURL: string; QQLoginUin: string; NapCatHelper: { - CoreQuickLogin: (uin: string) => Promise<{ result: boolean, message: string }>; + CoreQuickLoginCall: (uin: string) => Promise<{ result: boolean, message: string }>; + SetOb11ConfigCall: (ob11: OB11Config) => Promise; QQLoginList: string[] } } @@ -16,7 +19,8 @@ let LoginRuntime: LoginRuntimeType = { QQQRCodeURL: "", QQLoginUin: "", NapCatHelper: { - CoreQuickLogin: async (uin: string) => { return { result: false, message: '' }; }, + SetOb11ConfigCall: async (ob11: OB11Config) => { return; }, + CoreQuickLoginCall: async (uin: string) => { return { result: false, message: '' }; }, QQLoginList: [] } } @@ -64,10 +68,16 @@ export const WebUiDataRuntime = { setQQQuickLoginList: async function (list: string[]): Promise { LoginRuntime.NapCatHelper.QQLoginList = list; }, - setQQQuickLogin(func: (uin: string) => Promise<{ result: boolean, message: string }>): void { - LoginRuntime.NapCatHelper.CoreQuickLogin = func; + setQQQuickLoginCall(func: (uin: string) => Promise<{ result: boolean, message: string }>): void { + LoginRuntime.NapCatHelper.CoreQuickLoginCall = func; }, getQQQuickLogin: async function (uin: string): Promise<{ result: boolean, message: string }> { - return await LoginRuntime.NapCatHelper.CoreQuickLogin(uin); + return await LoginRuntime.NapCatHelper.CoreQuickLoginCall(uin); + }, + setOB11ConfigCall: async function (func: (ob11: OB11Config) => Promise): Promise { + LoginRuntime.NapCatHelper.SetOb11ConfigCall = func; + }, + setOB11Config: async function (ob11: OB11Config): Promise { + await LoginRuntime.NapCatHelper.SetOb11ConfigCall(ob11); } } \ No newline at end of file