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": {
|
"injects": {
|
||||||
"renderer": "./renderer.js",
|
"renderer": "./renderer.js",
|
||||||
"main": "./napcat.cjs",
|
"main": "./liteloader.cjs",
|
||||||
"preload": "./preload.cjs"
|
"preload": "./preload.cjs"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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 = {
|
||||||
|
@ -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');
|
@ -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 { 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() {
|
||||||
|
@ -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 () => {
|
||||||
|
@ -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 { 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,
|
||||||
|
@ -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));
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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/' },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user