Add WebUI token update and callback handling

Introduces callback mechanisms for WebUI token changes and QQ login status updates. The WebUI token is now updated and communicated via a callback after login, and related runtime and type definitions are extended to support these features. Also sets a static default token value in the config schema.
This commit is contained in:
手瓜一十雪 2025-09-06 18:15:35 +08:00
parent 88ee8f89fe
commit 5c120a8231
5 changed files with 60 additions and 4 deletions

View File

@ -13,6 +13,8 @@ import {
SendStatusType,
NTMsgType,
MessageElement,
ElementType,
NTMsgAtType,
} from '@/core';
import { OB11ConfigLoader } from '@/onebot/config';
import {
@ -178,6 +180,25 @@ export class NapCatOneBot11Adapter {
WebUiDataRuntime.setQQVersion(this.core.context.basicInfoWrapper.getFullQQVersion());
WebUiDataRuntime.setQQLoginInfo(selfInfo);
WebUiDataRuntime.setQQLoginStatus(true);
WebUiDataRuntime.getQQLoginCallback()(true);
let sendWebUiToken = async (token: string) => {
await this.core.apis.MsgApi.sendMsg(
{ chatType: ChatType.KCHATTYPEC2C, peerUid: selfInfo.uid, guildId: '' },
[{
elementType: ElementType.TEXT,
elementId: '',
textElement: {
content: 'Update WebUi Token: ' + token,
atType: NTMsgAtType.ATTYPEUNKNOWN,
atUid: '',
atTinyId: '',
atNtUid: '',
}
}],
5000
)
};
WebUiDataRuntime.setWebUiTokenChangeCallback(sendWebUiToken);
WebUiDataRuntime.setOnOB11ConfigChanged(async (newConfig) => {
const prev = this.configLoader.configData;
this.configLoader.save(newConfig);

View File

@ -62,13 +62,13 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp
webUiPathWrapper = pathWrapper;
WebUiConfig = new WebUiConfigWrapper();
const config = await WebUiConfig.GetWebUIConfig();
// 检查是否禁用WebUI
if (config.disableWebUI) {
logger.log('[NapCat] [WebUi] WebUI is disabled by configuration.');
return;
}
const [host, port, token] = await InitPort(config);
webUiRuntimePort = port;
if (port == 0) {
@ -90,6 +90,19 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp
}
}
});
WebUiDataRuntime.setQQLoginCallback(async (_status: boolean) => {
try {
if ((await WebUiConfig.GetWebUIConfig()).defaultToken) {
let randomToken = Math.random().toString(36).slice(-8);
await WebUiConfig.UpdateWebUIConfig({ token: randomToken });
console.log(`[NapCat] [WebUi] Update WebUi Token: ${randomToken}`);
await WebUiDataRuntime.getWebUiTokenChangeCallback()(randomToken);
}
} catch (error) {
console.log(`[NapCat] [WebUi] Update WebUi Token failed.` + error);
}
});
// ------------注册中间件------------
// 使用express的json中间件
app.use(express.json());
@ -177,6 +190,7 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp
);
}
});
// ------------Over------------
}

View File

@ -14,6 +14,12 @@ const LoginRuntime: LoginRuntimeType = {
nick: '',
},
QQVersion: 'unknown',
onQQLoginStatusChange: async (status: boolean) => {
LoginRuntime.QQLoginStatus = status;
},
onWebUiTokenChange: async (_token: string) => {
return;
},
NapCatHelper: {
onOB11ConfigChanged: async () => {
return;
@ -31,6 +37,12 @@ const LoginRuntime: LoginRuntimeType = {
};
export const WebUiDataRuntime = {
setWebUiTokenChangeCallback(func: (token: string) => Promise<void>): void {
LoginRuntime.onWebUiTokenChange = func;
},
getWebUiTokenChangeCallback(): (token: string) => Promise<void> {
return LoginRuntime.onWebUiTokenChange;
},
checkLoginRate(ip: string, RateLimit: number): boolean {
const key = `login_rate:${ip}`;
const count = store.get<number>(key) || 0;
@ -53,6 +65,14 @@ export const WebUiDataRuntime = {
return LoginRuntime.QQLoginStatus;
},
setQQLoginCallback(func: (status: boolean) => Promise<void>): void {
LoginRuntime.onQQLoginStatusChange = func;
},
getQQLoginCallback(): (status: boolean) => Promise<void> {
return LoginRuntime.onQQLoginStatusChange;
},
setQQLoginStatus(status: LoginRuntimeType['QQLoginStatus']): void {
LoginRuntime.QQLoginStatus = status;
},

View File

@ -13,8 +13,7 @@ import { themeType } from '../types/theme';
const WebUiConfigSchema = Type.Object({
host: Type.String({ default: '0.0.0.0' }),
port: Type.Number({ default: 6099 }),
// napcat+<月份日时>,例如 napcat062511
token: Type.String({ default: 'napcat' + (new Date().getMonth() + 1).toString().padStart(2, '0') + new Date().getDate().toString().padStart(2, '0') + new Date().getHours().toString().padStart(2, '0') }),
token: Type.String({ default: 'napcat' }),
loginRate: Type.Number({ default: 10 }),
autoLoginAccount: Type.String({ default: '' }),
theme: themeType,

View File

@ -9,6 +9,8 @@ interface LoginRuntimeType {
QQLoginUin: string;
QQLoginInfo: SelfInfo;
QQVersion: string;
onQQLoginStatusChange: (status: boolean) => Promise<void>;
onWebUiTokenChange: (token: string) => Promise<void>;
WebUiConfigQuickFunction: () => Promise<void>;
NapCatHelper: {
onQuickLoginRequested: (uin: string) => Promise<{ result: boolean; message: string }>;