chore: webui

This commit is contained in:
手瓜一十雪 2024-08-11 13:48:26 +08:00
parent aa12506221
commit 0b8dcbebe9
13 changed files with 63 additions and 86 deletions

View File

@ -27,7 +27,7 @@
], ],
"injects": { "injects": {
"renderer": "./renderer.js", "renderer": "./renderer.js",
"main": "./napcat.cjs", "main": "./liteloader.cjs",
"preload": "./preload.cjs" "preload": "./preload.cjs"
} }
} }

View File

@ -34,7 +34,6 @@ export class LogWrapper {
colorEscape = /\x1B[@-_][0-?]*[ -/]*[@-~]/g; colorEscape = /\x1B[@-_][0-?]*[ -/]*[@-~]/g;
constructor(logDir: string) { constructor(logDir: string) {
// logDir = path.join(path.resolve(__dirname), 'logs');
const filename = `${getFormattedTimestamp()}.log`; const filename = `${getFormattedTimestamp()}.log`;
const logPath = path.join(logDir, filename); const logPath = path.join(logDir, filename);
this.logConfig = { this.logConfig = {

View File

@ -1,3 +1,7 @@
//LiteLoader需要提供部分IPC接口以便于其他插件调用 //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'); require('./napcat.cjs');

View File

@ -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)

View File

@ -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);
}; };

View File

@ -10,6 +10,8 @@ import { OB11Constructor } from '@/onebot/helper/data';
import { logOB11Message } from '@/onebot/helper/log'; import { logOB11Message } from '@/onebot/helper/log';
import { proxiedListenerOf } from '@/common/utils/proxy-handler'; import { proxiedListenerOf } from '@/common/utils/proxy-handler';
import { createActionMap } from './action'; import { createActionMap } from './action';
import { InitWebUi } from '@/webui';
import { WebUiDataRuntime } from '@/webui/src/helper/Data';
//OneBot实现类 //OneBot实现类
export class NapCatOneBot11Adapter { export class NapCatOneBot11Adapter {
@ -82,9 +84,10 @@ export class NapCatOneBot11Adapter {
await this.networkManager.registerAllActions(actions); await this.networkManager.registerAllActions(actions);
await this.networkManager.openAllAdapters(); await this.networkManager.openAllAdapters();
// Todo 开始启动NetWork
await this.initMsgListener(); 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() { async initMsgListener() {

View File

@ -13,8 +13,11 @@ const app = express();
* *
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
export let WebUiConfig:WebUiConfigWrapper; export let WebUiConfig: WebUiConfigWrapper;
export let webUiPathWrapper: NapCatPathWrapper;
export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapper) { export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapper) {
webUiPathWrapper = pathWrapper;
WebUiConfig = new WebUiConfigWrapper(); WebUiConfig = new WebUiConfigWrapper();
let log = logger.log; let log = logger.log;
const config = await WebUiConfig.GetWebUIConfig(); const config = await WebUiConfig.GetWebUIConfig();
@ -31,7 +34,7 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp
}); });
}); });
// 配置静态文件服务,提供./static目录下的文件服务访问路径为/webui // 配置静态文件服务,提供./static目录下的文件服务访问路径为/webui
app.use(config.prefix + '/webui', express.static(resolve(pathWrapper.staticPath, './static'))); app.use(config.prefix + '/webui', express.static(pathWrapper.staticPath));
//挂载API接口 //挂载API接口
app.use(config.prefix + '/api', ALLRouter); app.use(config.prefix + '/api', ALLRouter);
app.listen(config.port, config.host, async () => { app.listen(config.port, config.host, async () => {

View File

@ -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);
// }

View File

@ -1,13 +1,9 @@
import { RequestHandler } from 'express'; import { RequestHandler } from 'express';
import { WebUiDataRuntime } from '../helper/Data'; import { WebUiDataRuntime } from '../helper/Data';
import { existsSync, readFileSync } from 'node:fs'; import { existsSync, readFileSync } from 'node:fs';
import { dirname, resolve } from 'node:path';
import { OB11Config } from '@/webui/ui/components/WebUiApiOB11Config'; import { OB11Config } from '@/webui/ui/components/WebUiApiOB11Config';
import { fileURLToPath } from 'node:url'; import { resolve } from 'node:path';
import { webUiPathWrapper } from '@/webui';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const isEmpty = (data: any) => const isEmpty = (data: any) =>
data === undefined || data === null || data === ''; data === undefined || data === null || data === '';
@ -21,14 +17,14 @@ export const OB11GetConfigHandler: RequestHandler = async (req, res) => {
return; return;
} }
const uin = await WebUiDataRuntime.getQQLoginUin(); const uin = await WebUiDataRuntime.getQQLoginUin();
const configFilePath = resolve(__dirname, `./config/onebot11_${uin}.json`); const configFilePath = resolve(webUiPathWrapper.configPath, `./onebot11_${uin}.json`);
//console.log(configFilePath); //console.log(configFilePath);
let data: OB11Config; let data: OB11Config;
try { try {
data = JSON.parse( data = JSON.parse(
existsSync(configFilePath) existsSync(configFilePath)
? readFileSync(configFilePath).toString() ? readFileSync(configFilePath).toString()
: readFileSync(resolve(__dirname, './config/onebot11.json')).toString(), : readFileSync(resolve(webUiPathWrapper.configPath, './onebot11.json')).toString(),
); );
} catch (e) { } catch (e) {
data = {} as OB11Config; data = {} as OB11Config;
@ -68,18 +64,6 @@ export const OB11SetConfigHandler: RequestHandler = async (req, res) => {
} catch (e) { } catch (e) {
SetResult = false; 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) { if (SetResult) {
res.send({ res.send({
code: 0, code: 0,

View File

@ -1,3 +1,4 @@
import { webUiPathWrapper } from '@/webui';
import { existsSync, readFileSync, writeFileSync } from 'node:fs'; import { existsSync, readFileSync, writeFileSync } from 'node:fs';
import * as net from 'node:net'; import * as net from 'node:net';
import { resolve } from 'node:path'; import { resolve } from 'node:path';
@ -96,7 +97,7 @@ export class WebUiConfigWrapper {
console.log('随机密码生成失败', e); console.log('随机密码生成失败', e);
} }
try { try {
const configPath = resolve(__dirname, './config/webui.json'); const configPath = resolve(webUiPathWrapper.configPath, './webui.json');
if (!existsSync(configPath)) { if (!existsSync(configPath)) {
writeFileSync(configPath, JSON.stringify(defaultconfig, null, 4)); writeFileSync(configPath, JSON.stringify(defaultconfig, null, 4));

View File

@ -3,7 +3,7 @@ import { AuthHelper } from '../../src/helper/SignToken';
import { QQLoginRouter } from './QQLogin'; import { QQLoginRouter } from './QQLogin';
import { AuthRouter } from './auth'; import { AuthRouter } from './auth';
import { OB11ConfigRouter } from './OB11Config'; import { OB11ConfigRouter } from './OB11Config';
import { WebUiConfig } from '../helper/config'; import { WebUiConfig } from '@/webui';
const router = Router(); const router = Router();

View File

@ -50,8 +50,22 @@
let url = new URL(window.location.href); let url = new URL(window.location.href);
let token = url.searchParams.get("token"); let token = url.searchParams.get("token");
if (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 authData = localStorage.getItem('auth');
let isLogined = await CheckWebUiLogined(authData); let isLogined = await CheckWebUiLogined(authData);
if (authData && isLogined) { if (authData && isLogined) {

View File

@ -47,6 +47,7 @@ const FrameworkBaseConfigPlugin: PluginOption[] = [
targets: [ targets: [
{ src: './manifest.json', dest: 'dist' }, { src: './manifest.json', dest: 'dist' },
{ src: './src/external/napcat.json', dest: 'dist/config/' }, { 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/external/onebot11.json', dest: 'dist/config/' },
{ src: './src/framework/liteloader.cjs', dest: 'dist' }, { src: './src/framework/liteloader.cjs', dest: 'dist' },
{ src: './src/framework/napcat.cjs', dest: 'dist' }, { src: './src/framework/napcat.cjs', dest: 'dist' },
@ -78,7 +79,7 @@ const ShellBaseConfigPlugin: PluginOption[] = [
targets: [ targets: [
// ...external.map(genCpModule), // ...external.map(genCpModule),
// { src: './src/napcat.json', dest: 'dist/config/' }, // { 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/onebot11/onebot11.json', dest: 'dist/config/' },
{ src: './src/external/napcat.json', dest: 'dist/config/' }, { src: './src/external/napcat.json', dest: 'dist/config/' },
{ src: './src/external/onebot11.json', dest: 'dist/config/' }, { src: './src/external/onebot11.json', dest: 'dist/config/' },