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, SendStatusType,
NTMsgType, NTMsgType,
MessageElement, MessageElement,
ElementType,
NTMsgAtType,
} from '@/core'; } from '@/core';
import { OB11ConfigLoader } from '@/onebot/config'; import { OB11ConfigLoader } from '@/onebot/config';
import { import {
@ -178,6 +180,25 @@ export class NapCatOneBot11Adapter {
WebUiDataRuntime.setQQVersion(this.core.context.basicInfoWrapper.getFullQQVersion()); WebUiDataRuntime.setQQVersion(this.core.context.basicInfoWrapper.getFullQQVersion());
WebUiDataRuntime.setQQLoginInfo(selfInfo); WebUiDataRuntime.setQQLoginInfo(selfInfo);
WebUiDataRuntime.setQQLoginStatus(true); 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) => { WebUiDataRuntime.setOnOB11ConfigChanged(async (newConfig) => {
const prev = this.configLoader.configData; const prev = this.configLoader.configData;
this.configLoader.save(newConfig); this.configLoader.save(newConfig);

View File

@ -62,13 +62,13 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp
webUiPathWrapper = pathWrapper; webUiPathWrapper = pathWrapper;
WebUiConfig = new WebUiConfigWrapper(); WebUiConfig = new WebUiConfigWrapper();
const config = await WebUiConfig.GetWebUIConfig(); const config = await WebUiConfig.GetWebUIConfig();
// 检查是否禁用WebUI // 检查是否禁用WebUI
if (config.disableWebUI) { if (config.disableWebUI) {
logger.log('[NapCat] [WebUi] WebUI is disabled by configuration.'); logger.log('[NapCat] [WebUi] WebUI is disabled by configuration.');
return; return;
} }
const [host, port, token] = await InitPort(config); const [host, port, token] = await InitPort(config);
webUiRuntimePort = port; webUiRuntimePort = port;
if (port == 0) { 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中间件 // 使用express的json中间件
app.use(express.json()); app.use(express.json());
@ -177,6 +190,7 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp
); );
} }
}); });
// ------------Over------------ // ------------Over------------
} }

View File

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

View File

@ -13,8 +13,7 @@ import { themeType } from '../types/theme';
const WebUiConfigSchema = Type.Object({ const WebUiConfigSchema = Type.Object({
host: Type.String({ default: '0.0.0.0' }), host: Type.String({ default: '0.0.0.0' }),
port: Type.Number({ default: 6099 }), port: Type.Number({ default: 6099 }),
// napcat+<月份日时>,例如 napcat062511 token: Type.String({ default: 'napcat' }),
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') }),
loginRate: Type.Number({ default: 10 }), loginRate: Type.Number({ default: 10 }),
autoLoginAccount: Type.String({ default: '' }), autoLoginAccount: Type.String({ default: '' }),
theme: themeType, theme: themeType,

View File

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