mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2024-11-21 09:36:35 +00:00
chore: webui
This commit is contained in:
parent
aa12506221
commit
0b8dcbebe9
@ -27,7 +27,7 @@
|
||||
],
|
||||
"injects": {
|
||||
"renderer": "./renderer.js",
|
||||
"main": "./napcat.cjs",
|
||||
"main": "./liteloader.cjs",
|
||||
"preload": "./preload.cjs"
|
||||
}
|
||||
}
|
@ -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 = {
|
||||
|
@ -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');
|
@ -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)
|
@ -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);
|
||||
};
|
@ -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() {
|
||||
|
@ -13,8 +13,11 @@ const app = express();
|
||||
* 无需参数。
|
||||
* @returns {Promise<void>} 无返回值。
|
||||
*/
|
||||
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 () => {
|
||||
|
@ -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);
|
||||
// }
|
@ -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,
|
||||
|
@ -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));
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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/' },
|
||||
|
Loading…
x
Reference in New Issue
Block a user