diff --git a/manifest.json b/manifest.json index b4ec933c..740894b1 100644 --- a/manifest.json +++ b/manifest.json @@ -27,7 +27,7 @@ ], "injects": { "renderer": "./renderer.js", - "main": "./napcat.cjs", + "main": "./liteloader.cjs", "preload": "./preload.cjs" } } \ No newline at end of file diff --git a/src/common/utils/log.ts b/src/common/utils/log.ts index b90b0e3d..441025b1 100644 --- a/src/common/utils/log.ts +++ b/src/common/utils/log.ts @@ -34,7 +34,6 @@ export class LogWrapper { colorEscape = /\x1B[@-_][0-?]*[ -/]*[@-~]/g; constructor(logDir: string) { - // logDir = path.join(path.resolve(__dirname), 'logs'); const filename = `${getFormattedTimestamp()}.log`; const logPath = path.join(logDir, filename); this.logConfig = { diff --git a/src/framework/liteloader.cjs b/src/framework/liteloader.cjs index cad921ca..b9f8c06c 100644 --- a/src/framework/liteloader.cjs +++ b/src/framework/liteloader.cjs @@ -1,3 +1,7 @@ //LiteLoader需要提供部分IPC接口,以便于其他插件调用 -const electron = require('electron'); +const { ipcMain } = require('electron'); +const fs = require('fs'); +ipcMain.handle("napcat_get_webtoken", async (event, arg) => { + return "http://127.0.0.1:6099/webui/?token=" + JSON.parse(fs.readFileSync(__dirname + '/config/webui.json', 'utf-8').toString()).token; +}); require('./napcat.cjs'); \ No newline at end of file diff --git a/src/framework/preload.cjs b/src/framework/preload.cjs index e69de29b..3142ac47 100644 --- a/src/framework/preload.cjs +++ b/src/framework/preload.cjs @@ -0,0 +1,11 @@ + +const { contextBridge } = require('electron') +const { ipcRenderer } = require('electron') + +const napcat = { + getWebUiUrl: async () => { + return ipcRenderer.invoke("napcat_get_webtoken") + } +} +// 在window对象下导出只读对象 +contextBridge.exposeInMainWorld('napcat', napcat) \ No newline at end of file diff --git a/src/framework/renderer.js b/src/framework/renderer.js index c2a2d804..edc35178 100644 --- a/src/framework/renderer.js +++ b/src/framework/renderer.js @@ -1,2 +1,13 @@ -export const onSettingWindowCreated = (view) => { +export const onSettingWindowCreated = async (view) => { + view.style.width = "100%"; + view.style.height = "100%"; + //添加iframe + const iframe = document.createElement("iframe"); + iframe.src = await window.napcat.getWebUiUrl(); + iframe.width = "100%"; + iframe.height = "100%"; + iframe.style.border = "none"; + //去掉iframe滚动条 + iframe.scrolling = "no"; + view.appendChild(iframe); }; \ No newline at end of file diff --git a/src/onebot/main.ts b/src/onebot/main.ts index 7e7e9680..03f62274 100644 --- a/src/onebot/main.ts +++ b/src/onebot/main.ts @@ -10,6 +10,8 @@ import { OB11Constructor } from '@/onebot/helper/data'; import { logOB11Message } from '@/onebot/helper/log'; import { proxiedListenerOf } from '@/common/utils/proxy-handler'; import { createActionMap } from './action'; +import { InitWebUi } from '@/webui'; +import { WebUiDataRuntime } from '@/webui/src/helper/Data'; //OneBot实现类 export class NapCatOneBot11Adapter { @@ -82,9 +84,10 @@ export class NapCatOneBot11Adapter { await this.networkManager.registerAllActions(actions); await this.networkManager.openAllAdapters(); - // Todo 开始启动NetWork await this.initMsgListener(); - + WebUiDataRuntime.setQQLoginUin(selfInfo.uin.toString()); + WebUiDataRuntime.setQQLoginStatus(true); + InitWebUi(this.context.logger, this.context.pathWrapper).then().catch(this.context.logger.logError); } async initMsgListener() { diff --git a/src/webui/index.ts b/src/webui/index.ts index c2b77d74..83be37c7 100644 --- a/src/webui/index.ts +++ b/src/webui/index.ts @@ -13,8 +13,11 @@ const app = express(); * 无需参数。 * @returns {Promise} 无返回值。 */ -export let WebUiConfig:WebUiConfigWrapper; +export let WebUiConfig: WebUiConfigWrapper; +export let webUiPathWrapper: NapCatPathWrapper; + export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapper) { + webUiPathWrapper = pathWrapper; WebUiConfig = new WebUiConfigWrapper(); let log = logger.log; const config = await WebUiConfig.GetWebUIConfig(); @@ -31,7 +34,7 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp }); }); // 配置静态文件服务,提供./static目录下的文件服务,访问路径为/webui - app.use(config.prefix + '/webui', express.static(resolve(pathWrapper.staticPath, './static'))); + app.use(config.prefix + '/webui', express.static(pathWrapper.staticPath)); //挂载API接口 app.use(config.prefix + '/api', ALLRouter); app.listen(config.port, config.host, async () => { diff --git a/src/webui/src/api/LogConsole.ts b/src/webui/src/api/LogConsole.ts deleted file mode 100644 index 2ca960d1..00000000 --- a/src/webui/src/api/LogConsole.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { RequestHandler } from 'express'; -import { resolve } from 'path'; -import { readdir, stat } from 'fs/promises'; -import { existsSync } from 'fs'; -import { dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; - - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); -export const GetLogFileListHandler: RequestHandler = async (req, res) => { - try { - const LogsPath = resolve(__dirname, './logs/'); - const LogFiles = await readdir(LogsPath); - res.json({ - code: 0, - data: LogFiles, - }); - } catch (error) { - res.json({ code: -1, msg: 'Failed to retrieve log file list.' }); - } -}; - -export const GetLogFileHandler: RequestHandler = async (req, res) => { - const LogsPath = resolve(__dirname, './logs/'); - const LogFile = req.query.file as string; - - // if (!isValidFileName(LogFile)) { - // res.json({ code: -1, msg: 'LogFile is not safe' }); - // return; - // } - - const filePath = `${LogsPath}/${LogFile}`; - if (!existsSync(filePath)) { - res.status(404).json({ code: -1, msg: 'LogFile does not exist' }); - return; - } - - try { - const fileStats = await stat(filePath); - if (!fileStats.isFile()) { - res.json({ code: -1, msg: 'LogFile must be a file' }); - return; - } - - res.sendFile(filePath); - } catch (error) { - res.json({ code: -1, msg: 'Failed to send log file.' }); - } -}; -// export function isValidFileName(fileName: string): boolean { -// const invalidChars = /[\.\:\*\?\"\<\>\|\/\\]/; -// return !invalidChars.test(fileName); -// } diff --git a/src/webui/src/api/OB11Config.ts b/src/webui/src/api/OB11Config.ts index f4733f45..f2fbd145 100644 --- a/src/webui/src/api/OB11Config.ts +++ b/src/webui/src/api/OB11Config.ts @@ -1,13 +1,9 @@ import { RequestHandler } from 'express'; import { WebUiDataRuntime } from '../helper/Data'; import { existsSync, readFileSync } from 'node:fs'; -import { dirname, resolve } from 'node:path'; import { OB11Config } from '@/webui/ui/components/WebUiApiOB11Config'; -import { fileURLToPath } from 'node:url'; - - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +import { resolve } from 'node:path'; +import { webUiPathWrapper } from '@/webui'; const isEmpty = (data: any) => data === undefined || data === null || data === ''; @@ -21,14 +17,14 @@ export const OB11GetConfigHandler: RequestHandler = async (req, res) => { return; } const uin = await WebUiDataRuntime.getQQLoginUin(); - const configFilePath = resolve(__dirname, `./config/onebot11_${uin}.json`); + const configFilePath = resolve(webUiPathWrapper.configPath, `./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(), + : readFileSync(resolve(webUiPathWrapper.configPath, './onebot11.json')).toString(), ); } catch (e) { data = {} as OB11Config; @@ -68,18 +64,6 @@ export const OB11SetConfigHandler: RequestHandler = async (req, res) => { } 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, diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index d34bcc62..e6d8bdf8 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -1,3 +1,4 @@ +import { webUiPathWrapper } from '@/webui'; import { existsSync, readFileSync, writeFileSync } from 'node:fs'; import * as net from 'node:net'; import { resolve } from 'node:path'; @@ -96,7 +97,7 @@ export class WebUiConfigWrapper { console.log('随机密码生成失败', e); } try { - const configPath = resolve(__dirname, './config/webui.json'); + const configPath = resolve(webUiPathWrapper.configPath, './webui.json'); if (!existsSync(configPath)) { writeFileSync(configPath, JSON.stringify(defaultconfig, null, 4)); diff --git a/src/webui/src/router/index.ts b/src/webui/src/router/index.ts index 3c9bd7db..19b419f2 100644 --- a/src/webui/src/router/index.ts +++ b/src/webui/src/router/index.ts @@ -3,7 +3,7 @@ import { AuthHelper } from '../../src/helper/SignToken'; import { QQLoginRouter } from './QQLogin'; import { AuthRouter } from './auth'; import { OB11ConfigRouter } from './OB11Config'; -import { WebUiConfig } from '../helper/config'; +import { WebUiConfig } from '@/webui'; const router = Router(); diff --git a/static/index.html b/static/index.html index 94223aa6..7f45934e 100644 --- a/static/index.html +++ b/static/index.html @@ -50,8 +50,22 @@ let url = new URL(window.location.href); let token = url.searchParams.get("token"); if (token) { - localStorage.setItem('auth', token); + let loginResponse = await fetch('../api/auth/login', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ token: token }) + }); + const loginResponseJson = await loginResponse.json(); + let retCode = loginResponseJson.code; + if (retCode === 0) { + //登录成功 + let retCredential = loginResponseJson.data.Credential; + localStorage.setItem('auth', retCredential); + } } + let authData = localStorage.getItem('auth'); let isLogined = await CheckWebUiLogined(authData); if (authData && isLogined) { diff --git a/vite.config.ts b/vite.config.ts index d1258119..0605cf4c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -47,6 +47,7 @@ const FrameworkBaseConfigPlugin: PluginOption[] = [ targets: [ { src: './manifest.json', dest: 'dist' }, { src: './src/external/napcat.json', dest: 'dist/config/' }, + { src: './static/', dest: 'dist/static/', flatten: false }, { src: './src/external/onebot11.json', dest: 'dist/config/' }, { src: './src/framework/liteloader.cjs', dest: 'dist' }, { src: './src/framework/napcat.cjs', dest: 'dist' }, @@ -78,7 +79,7 @@ const ShellBaseConfigPlugin: PluginOption[] = [ targets: [ // ...external.map(genCpModule), // { src: './src/napcat.json', dest: 'dist/config/' }, - // { src: './static/', dest: 'dist/static/', flatten: false }, + { src: './static/', dest: 'dist/static/', flatten: false }, // { src: './src/onebot11/onebot11.json', dest: 'dist/config/' }, { src: './src/external/napcat.json', dest: 'dist/config/' }, { src: './src/external/onebot11.json', dest: 'dist/config/' },