From c82f346dd0be60361033a494c4c1b4256f5e246d Mon Sep 17 00:00:00 2001 From: SherkeyXD <253294679@qq.com> Date: Tue, 14 May 2024 20:17:53 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20Onebot=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=A0=BC=E5=BC=8F=EF=BC=8C=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/onebot11/config.ts | 95 ++++++----- src/onebot11/main.ts | 50 +++--- src/onebot11/onebot11.json | 42 +++-- src/onebot11/server/http.ts | 2 +- src/onebot11/server/postOB11Event.ts | 8 +- src/onebot11/server/ws/ReverseWebsocket.ts | 2 +- src/webui/src/api/OB11Config.ts | 156 +++++++++--------- src/webui/ui/NapCat.ts | 12 +- src/webui/ui/components/WebUiApiOB11Config.ts | 122 +++++++------- 9 files changed, 259 insertions(+), 230 deletions(-) diff --git a/src/onebot11/config.ts b/src/onebot11/config.ts index 03ad92a8..d1137558 100644 --- a/src/onebot11/config.ts +++ b/src/onebot11/config.ts @@ -1,63 +1,76 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import { selfInfo } from '@/core/data'; -import { logDebug, logError } from '@/common/utils/log'; -import { ConfigBase } from '@/common/utils/ConfigBase'; +import fs from "node:fs"; +import path from "node:path"; +import { selfInfo } from "@/core/data"; +import { logDebug, logError } from "@/common/utils/log"; +import { ConfigBase } from "@/common/utils/ConfigBase"; +import { json } from "stream/consumers"; export interface OB11Config { - httpHost: string; - httpPort: number; - httpPostUrls: string[]; - httpSecret: string; - wsHost: string; - wsPort: number; - wsReverseUrls: string[]; - enableHttp: boolean; - enableHttpHeart: boolean; - enableHttpPost: boolean; - enableWs: boolean; - enableWsReverse: boolean; - messagePostFormat: 'array' | 'string'; - reportSelfMessage: boolean; - enableLocalFile2Url: boolean; + 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; - token: string; + messagePostFormat: "array" | "string"; + enableLocalFile2Url: boolean; musicSignUrl: string; + reportSelfMessage: boolean; + token: string; read(): OB11Config; save(config: OB11Config): void; } - class Config extends ConfigBase implements OB11Config { - httpHost: string = ''; - httpPort: number = 3000; - httpPostUrls: string[] = []; - httpSecret = ''; - wsHost: string = ''; - wsPort = 3001; - wsReverseUrls: string[] = []; - enableHttp = false; - enableHttpPost = false; - enableHttpHeart = false; - enableWs = false; - enableWsReverse = false; - messagePostFormat: 'array' | 'string' = 'array'; - reportSelfMessage = false; + http = { + enable: false, + host: "", + port: 3000, + secret: "", + enableHeart: false, + enablePost: false, + postUrls: [], + }; + ws = { + enable: false, + host: "", + port: 3001, + }; + reverseWs = { + enable: false, + urls: [], + }; debug = false; - enableLocalFile2Url = true; heartInterval = 30000; - token = ''; - musicSignUrl = ''; + messagePostFormat: "array" | "string" = "array"; + enableLocalFile2Url = true; + musicSignUrl = ""; + reportSelfMessage = false; + token = ""; getConfigPath() { return path.join(this.getConfigDir(), `onebot11_${selfInfo.uin}.json`); } - protected getKeys(): string[] { - return ['httpHost', 'enableHttp', 'httpPort', 'wsHost', 'enableWs', 'wsPort', 'enableWsReverse', 'wsReverseUrls', 'enableHttpPost', 'httpPostUrls', 'enableHttpHeart', 'httpSecret', 'messagePostFormat', 'reportSelfMessage', 'debug', 'enableLocalFile2Url', 'heartInterval', 'token', 'musicSignUrl']; + protected getKeys(): string[] | null { + return null; } } diff --git a/src/onebot11/main.ts b/src/onebot11/main.ts index 5ba69bfd..e36d330c 100644 --- a/src/onebot11/main.ts +++ b/src/onebot11/main.ts @@ -43,26 +43,26 @@ export class NapCatOnebot11 { logDebug('ob11 ready'); ob11Config.read(); const serviceInfo = ` - HTTP服务 ${ob11Config.enableHttp ? '已启动' : '未启动'}, ${ob11Config.httpHost}:${ob11Config.httpPort} - HTTP上报服务 ${ob11Config.enableHttpPost ? '已启动' : '未启动'}, 上报地址: ${ob11Config.httpPostUrls} - WebSocket服务 ${ob11Config.enableWs ? '已启动' : '未启动'}, ${ob11Config.wsHost}:${ob11Config.wsPort} - WebSocket反向服务 ${ob11Config.enableWsReverse ? '已启动' : '未启动'}, 反向地址: ${ob11Config.wsReverseUrls} + HTTP服务 ${ob11Config.http.enable ? '已启动' : '未启动'}, ${ob11Config.http.host}:${ob11Config.http.port} + HTTP上报服务 ${ob11Config.http.enablePost ? '已启动' : '未启动'}, 上报地址: ${ob11Config.http.postUrls} + WebSocket服务 ${ob11Config.ws.enable ? '已启动' : '未启动'}, ${ob11Config.ws.host}:${ob11Config.ws.port} + WebSocket反向服务 ${ob11Config.reverseWs.enable ? '已启动' : '未启动'}, 反向地址: ${ob11Config.reverseWs.urls} `; log(serviceInfo); NTQQUserApi.getUserDetailInfo(selfInfo.uid).then(user => { selfInfo.nick = user.nick; setLogSelfInfo(selfInfo); }).catch(logError); - if (ob11Config.enableHttp) { - ob11HTTPServer.start(ob11Config.httpPort, ob11Config.httpHost); + if (ob11Config.http.enable) { + ob11HTTPServer.start(ob11Config.http.port, ob11Config.http.host); } - if (ob11Config.enableWs) { - ob11WebsocketServer.start(ob11Config.wsPort, ob11Config.wsHost); + if (ob11Config.ws.enable) { + ob11WebsocketServer.start(ob11Config.ws.port, ob11Config.ws.host); } - if (ob11Config.enableWsReverse) { + if (ob11Config.reverseWs.enable) { ob11ReverseWebsockets.start(); } - if (ob11Config.enableHttpHeart) { + if (ob11Config.http.enableHeart) { // 启动http心跳 httpHeart.start(); } @@ -209,48 +209,48 @@ export class NapCatOnebot11 { // 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); + const isHttpChanged = !isEqual(NewOb11.http.port, ob11Config.http.port) && NewOb11.http.enable; + const isWsChanged = !isEqual(NewOb11.ws.port, ob11Config.ws.port); + const isEnableWsChanged = !isEqual(NewOb11.ws.enable, ob11Config.ws.enable); + const isEnableWsReverseChanged = !isEqual(NewOb11.reverseWs.enable, ob11Config.reverseWs.enable); + const isWsReverseUrlsChanged = !isEqual(NewOb11.reverseWs.urls, ob11Config.reverseWs.urls); if (isHttpChanged) { - ob11HTTPServer.restart(NewOb11.httpPort, NewOb11.httpHost); + ob11HTTPServer.restart(NewOb11.http.port, NewOb11.http.host); } - if (!NewOb11.enableHttp) { + if (!NewOb11.http.enable) { ob11HTTPServer.stop(); } else { - ob11HTTPServer.start(NewOb11.httpPort, NewOb11.httpHost); + ob11HTTPServer.start(NewOb11.http.port, NewOb11.http.host); } if (isWsChanged) { - ob11WebsocketServer.restart(NewOb11.wsPort); + ob11WebsocketServer.restart(NewOb11.ws.port); } if (isEnableWsChanged) { - if (NewOb11.enableWs) { - ob11WebsocketServer.start(NewOb11.wsPort, NewOb11.wsHost); + if (NewOb11.ws.enable) { + ob11WebsocketServer.start(NewOb11.ws.port, NewOb11.ws.host); } else { ob11WebsocketServer.stop(); } } if (isEnableWsReverseChanged) { - if (NewOb11.enableWsReverse) { + if (NewOb11.reverseWs.enable) { ob11ReverseWebsockets.start(); } else { ob11ReverseWebsockets.stop(); } } - if (NewOb11.enableWsReverse && isWsReverseUrlsChanged) { + if (NewOb11.reverseWs.enable && isWsReverseUrlsChanged) { logDebug('反向ws地址有变化, 重启反向ws服务'); ob11ReverseWebsockets.restart(); } - if (NewOb11.enableHttpHeart) { + if (NewOb11.http.enableHeart) { httpHeart.start(); - } else if (!NewOb11.enableHttpHeart) { + } else if (!NewOb11.http.enableHeart) { httpHeart.stop(); } ob11Config.save(NewOb11); diff --git a/src/onebot11/onebot11.json b/src/onebot11/onebot11.json index 4f8e56bb..fef35ee5 100644 --- a/src/onebot11/onebot11.json +++ b/src/onebot11/onebot11.json @@ -1,21 +1,27 @@ { - "httpHost": "", - "enableHttp": false, - "httpPort": 3000, - "wsHost": "", - "enableWs": false, - "wsPort": 3001, - "enableWsReverse": false, - "wsReverseUrls": [], - "enableHttpPost": false, - "httpPostUrls": [], - "enableHttpHeart": false, - "httpSecret": "", - "messagePostFormat": "array", - "reportSelfMessage": false, + "http": { + "enable": false, + "host": "", + "port": 3000, + "secret": "", + "enableHeart": false, + "enablePost": false, + "postUrls": [] + }, + "ws": { + "enable": false, + "host": "", + "port": 3001 + }, + "reverseWs": { + "enable": false, + "urls": [] + }, "debug": false, - "enableLocalFile2Url": true, "heartInterval": 30000, - "token": "", - "musicSignUrl": "" -} + "messagePostFormat": "array", + "enableLocalFile2Url": true, + "musicSignUrl": "", + "reportSelfMessage": false, + "token": "" +} \ No newline at end of file diff --git a/src/onebot11/server/http.ts b/src/onebot11/server/http.ts index 2f9fee42..28bf89a5 100644 --- a/src/onebot11/server/http.ts +++ b/src/onebot11/server/http.ts @@ -16,7 +16,7 @@ class OB11HTTPServer extends HttpServerBase { } protected listen(port: number, host: string) { - if (ob11Config.enableHttp) { + if (ob11Config.http.enable) { super.listen(port, host); } } diff --git a/src/onebot11/server/postOB11Event.ts b/src/onebot11/server/postOB11Event.ts index 08963f82..58a13515 100644 --- a/src/onebot11/server/postOB11Event.ts +++ b/src/onebot11/server/postOB11Event.ts @@ -78,19 +78,19 @@ export function postOB11Event(msg: PostEventType, reportSelf = false, postWs = t return; } } - if (config.enableHttpPost) { + if (config.http.enablePost) { const msgStr = JSON.stringify(msg); - const hmac = crypto.createHmac('sha1', ob11Config.httpSecret); + const hmac = crypto.createHmac('sha1', ob11Config.http.secret); hmac.update(msgStr); const sig = hmac.digest('hex'); const headers: Record = { 'Content-Type': 'application/json', 'x-self-id': selfInfo.uin }; - if (config.httpSecret) { + if (config.http.secret) { headers['x-signature'] = 'sha1=' + sig; } - for (const host of config.httpPostUrls) { + for (const host of config.http.postUrls) { fetch(host, { method: 'POST', headers, diff --git a/src/onebot11/server/ws/ReverseWebsocket.ts b/src/onebot11/server/ws/ReverseWebsocket.ts index e001b6d1..600e354e 100644 --- a/src/onebot11/server/ws/ReverseWebsocket.ts +++ b/src/onebot11/server/ws/ReverseWebsocket.ts @@ -116,7 +116,7 @@ export class ReverseWebsocket { class OB11ReverseWebsockets { start() { - for (const url of ob11Config.wsReverseUrls) { + for (const url of ob11Config.reverseWs.urls) { log('开始连接反向ws', url); new Promise(() => { try { diff --git a/src/webui/src/api/OB11Config.ts b/src/webui/src/api/OB11Config.ts index 933245a2..30606a98 100644 --- a/src/webui/src/api/OB11Config.ts +++ b/src/webui/src/api/OB11Config.ts @@ -3,84 +3,88 @@ import { WebUiDataRuntime } from "../helper/Data"; import { existsSync, readFileSync, writeFileSync } from "node:fs"; import { resolve } from "node:path"; import { OB11Config } from "@/webui/ui/components/WebUiApiOB11Config"; -const isEmpty = (data: any) => data === undefined || data === null || data === ''; +const isEmpty = (data: any) => + data === undefined || data === null || data === ""; export const OB11GetConfigHandler: RequestHandler = async (req, res) => { - let isLogin = await WebUiDataRuntime.getQQLoginStatus(); - if (!isLogin) { - res.send({ - code: -1, - message: 'Not Login' - }); - return; - } - const uin = await WebUiDataRuntime.getQQLoginUin(); - let configFilePath = resolve(__dirname, `./config/onebot11_${uin}.json`); - //console.log(configFilePath); - let data: OB11Config; - try { - data = JSON.parse(existsSync(configFilePath) ? readFileSync(configFilePath).toString() : readFileSync(resolve(__dirname, `./config/onebot11.json`)).toString()); - } - catch (e) { - data = {} as OB11Config; - res.send({ - code: -1, - message: 'Config Get Error' - }); - return; - } + let isLogin = await WebUiDataRuntime.getQQLoginStatus(); + if (!isLogin) { res.send({ - code: 0, - message: 'success', - data: data + code: -1, + message: "Not Login", }); return; -} -export const OB11SetConfigHandler: RequestHandler = async (req, res) => { - let isLogin = await WebUiDataRuntime.getQQLoginStatus(); - if (!isLogin) { - res.send({ - code: -1, - message: 'Not Login' - }); - return; - } - if (isEmpty(req.body.config)) { - res.send({ - code: -1, - message: 'config is empty' - }); - return; - } - let SetResult; - try { - await WebUiDataRuntime.setOB11Config(JSON.parse(req.body.config)); - SetResult = true; - } catch (e) { - SetResult = false; - } - - // 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' - }); - } - + } + const uin = await WebUiDataRuntime.getQQLoginUin(); + let configFilePath = resolve(__dirname, `./config/onebot11_${uin}.json`); + //console.log(configFilePath); + let data: OB11Config; + try { + data = JSON.parse( + existsSync(configFilePath) + ? readFileSync(configFilePath).toString() + : readFileSync(resolve(__dirname, `./config/onebot11.json`)).toString() + ); + } catch (e) { + data = {} as OB11Config; + res.send({ + code: -1, + message: "Config Get Error", + }); return; -} \ No newline at end of file + } + res.send({ + code: 0, + message: "success", + data: data, + }); + return; +}; +export const OB11SetConfigHandler: RequestHandler = async (req, res) => { + let isLogin = await WebUiDataRuntime.getQQLoginStatus(); + if (!isLogin) { + res.send({ + code: -1, + message: "Not Login", + }); + return; + } + if (isEmpty(req.body.config)) { + res.send({ + code: -1, + message: "config is empty", + }); + return; + } + let SetResult; + try { + await WebUiDataRuntime.setOB11Config(JSON.parse(req.body.config)); + SetResult = true; + } catch (e) { + SetResult = false; + } + + // 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", + }); + } + + return; +}; diff --git a/src/webui/ui/NapCat.ts b/src/webui/ui/NapCat.ts index c08a6ea9..aa288307 100644 --- a/src/webui/ui/NapCat.ts +++ b/src/webui/ui/NapCat.ts @@ -34,36 +34,36 @@ async function onSettingWindowCreated(view: Element) { SettingItem( '启用 HTTP 服务', undefined, - SettingSwitch('ob11.enableHttp', ob11Config.enableHttp, { 'control-display-id': 'config-ob11-httpPort' }), + SettingSwitch('ob11.http.enable', ob11Config.http.enable, { 'control-display-id': 'config-ob11-httpPort' }), ), SettingItem( 'HTTP 服务监听端口', undefined, `
`, 'config-ob11-httpPort', - ob11Config.enableHttp, + ob11Config.http.enable, ), SettingItem( '启用 HTTP 心跳', undefined, - SettingSwitch('ob11.enableHttpHeart', ob11Config.enableHttpHeart, { + SettingSwitch('ob11.http.enableHeart', ob11Config.http.enableHeart, { 'control-display-id': 'config-ob11-enableHttpHeart', }), ), SettingItem( '启用 HTTP 事件上报', undefined, - SettingSwitch('ob11.enableHttpPost', ob11Config.enableHttpPost, { + SettingSwitch('ob11.http.enablePost', ob11Config.http.enablePost, { 'control-display-id': 'config-ob11-httpPostUrls', }), ), - `
+ `
HTTP 事件上报密钥
-
diff --git a/src/webui/ui/components/WebUiApiOB11Config.ts b/src/webui/ui/components/WebUiApiOB11Config.ts index 4c02e205..ca308811 100644 --- a/src/webui/ui/components/WebUiApiOB11Config.ts +++ b/src/webui/ui/components/WebUiApiOB11Config.ts @@ -1,64 +1,70 @@ export interface OB11Config { - [key: string]: any, - httpHost: "", - httpPort: number; - httpPostUrls: string[]; - httpSecret: "", - wsHost: "", - wsPort: number; - wsReverseUrls: string[]; - enableHttp: boolean; - enableHttpHeart: boolean; - enableHttpPost: boolean; - enableWs: boolean; - enableWsReverse: boolean; - messagePostFormat: 'array' | 'string'; - reportSelfMessage: boolean; - enableLocalFile2Url: boolean; - debug: boolean; - heartInterval: number; - token: "", - musicSignUrl: "", + [key: string]: any; + http: { + enable: boolean; + host: ""; + port: number; + secret: ""; + enableHeart: boolean; + enablePost: boolean; + postUrls: string[]; + }; + ws: { + enable: boolean; + host: ""; + port: number; + }; + reverseWs: { + enable: boolean; + urls: string[]; + }; + + debug: boolean; + heartInterval: number; + messagePostFormat: "array" | "string"; + enableLocalFile2Url: boolean; + musicSignUrl: ""; + reportSelfMessage: boolean; + token: ""; } + class WebUiApiOB11ConfigWrapper { - private retCredential: string = ""; - async Init(Credential: string) { - this.retCredential = Credential; + private retCredential: string = ""; + async Init(Credential: string) { + this.retCredential = Credential; + } + async GetOB11Config(): Promise { + let ConfigResponse = await fetch("/api/OB11Config/GetConfig", { + method: "POST", + headers: { + Authorization: "Bearer " + this.retCredential, + "Content-Type": "application/json", + }, + }); + if (ConfigResponse.status == 200) { + let ConfigResponseJson = await ConfigResponse.json(); + if (ConfigResponseJson.code == 0) { + return ConfigResponseJson?.data; + } } - async GetOB11Config(): Promise { - let ConfigResponse = await fetch('/api/OB11Config/GetConfig', { - method: 'POST', - headers: { - 'Authorization': "Bearer " + this.retCredential, - 'Content-Type': 'application/json' - } - }); - if (ConfigResponse.status == 200) { - let ConfigResponseJson = await ConfigResponse.json(); - if (ConfigResponseJson.code == 0) { - return ConfigResponseJson?.data; - } - } - return {} as OB11Config; - } - async SetOB11Config(config: OB11Config): Promise { - let ConfigResponse = await fetch('/api/OB11Config/SetConfig', - { - method: 'POST', - headers: { - 'Authorization': "Bearer " + this.retCredential, - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ config: JSON.stringify(config) }) - } - ); - if (ConfigResponse.status == 200) { - let ConfigResponseJson = await ConfigResponse.json(); - if (ConfigResponseJson.code == 0) { - return true; - } - } - return false; + return {} as OB11Config; + } + async SetOB11Config(config: OB11Config): Promise { + let ConfigResponse = await fetch("/api/OB11Config/SetConfig", { + method: "POST", + headers: { + Authorization: "Bearer " + this.retCredential, + "Content-Type": "application/json", + }, + body: JSON.stringify({ config: JSON.stringify(config) }), + }); + if (ConfigResponse.status == 200) { + let ConfigResponseJson = await ConfigResponse.json(); + if (ConfigResponseJson.code == 0) { + return true; + } } + return false; + } } -export const OB11ConfigWrapper = new WebUiApiOB11ConfigWrapper(); \ No newline at end of file +export const OB11ConfigWrapper = new WebUiApiOB11ConfigWrapper();