Merge pull request #627 from bietiaop/main

feat: 查看登录QQ信息&获取快速登录列表详细信息&获取nc的包信息&优化了部分写法
This commit is contained in:
手瓜一十雪
2024-12-16 13:03:09 +08:00
committed by GitHub
11 changed files with 101 additions and 47 deletions

View File

@@ -157,9 +157,9 @@ export class NapCatOneBot11Adapter {
this.initBuddyListener(); this.initBuddyListener();
this.initGroupListener(); this.initGroupListener();
await WebUiDataRuntime.setQQLoginUin(selfInfo.uin.toString()); WebUiDataRuntime.setQQLoginInfo(selfInfo);
await WebUiDataRuntime.setQQLoginStatus(true); WebUiDataRuntime.setQQLoginStatus(true);
await 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);
this.context.logger.log(`OneBot11 配置更改:${JSON.stringify(prev)} -> ${JSON.stringify(newConfig)}`); this.context.logger.log(`OneBot11 配置更改:${JSON.stringify(prev)} -> ${JSON.stringify(newConfig)}`);

View File

@@ -175,7 +175,9 @@ async function handleLogin(
loginService.getLoginList().then((res) => { loginService.getLoginList().then((res) => {
// 遍历 res.LocalLoginInfoList[x].isQuickLogin是否可以 res.LocalLoginInfoList[x].uin 转为string 加入string[] 最后遍历完成调用WebUiDataRuntime.setQQQuickLoginList // 遍历 res.LocalLoginInfoList[x].isQuickLogin是否可以 res.LocalLoginInfoList[x].uin 转为string 加入string[] 最后遍历完成调用WebUiDataRuntime.setQQQuickLoginList
WebUiDataRuntime.setQQQuickLoginList(res.LocalLoginInfoList.filter((item) => item.isQuickLogin).map((item) => item.uin.toString())); const list = res.LocalLoginInfoList.filter((item) => item.isQuickLogin);
WebUiDataRuntime.setQQQuickLoginList(list.map((item) => item.uin.toString()));
WebUiDataRuntime.setQQNewLoginList(list);
}); });
WebUiDataRuntime.setQuickLoginCall(async (uin: string) => { WebUiDataRuntime.setQuickLoginCall(async (uin: string) => {

View File

@@ -18,7 +18,7 @@ export const LoginHandler: RequestHandler = async (req, res) => {
return sendError(res, 'token is empty'); return sendError(res, 'token is empty');
} }
// 检查登录频率 // 检查登录频率
if (!(await WebUiDataRuntime.checkLoginRate(WebUiConfigData.loginRate))) { if (!WebUiDataRuntime.checkLoginRate(WebUiConfigData.loginRate)) {
return sendError(res, 'login rate limit'); return sendError(res, 'login rate limit');
} }
//验证config.token是否等于token //验证config.token是否等于token

View File

@@ -1,15 +1,9 @@
import { RequestHandler } from 'express'; import { RequestHandler } from 'express';
import { WebUiDataRuntime } from '@webapi/helper/Data';
import { sendSuccess } from '@webapi/utils/response'; import { sendSuccess } from '@webapi/utils/response';
// TODO: Implement LogFileListHandler export const PackageInfoHandler: RequestHandler = (_, res) => {
export const LogFileListHandler: RequestHandler = async (_, res) => { const data = WebUiDataRuntime.getPackageJson();
const fakeData = { sendSuccess(res, data);
uin: 0,
nick: 'NapCat',
avatar: 'https://q1.qlogo.cn/g?b=qq&nk=0&s=640',
status: 'online',
boottime: Date.now(),
};
sendSuccess(res, fakeData);
}; };

View File

@@ -10,15 +10,15 @@ import { sendError, sendSuccess } from '@webapi/utils/response';
import { isEmpty } from '@webapi/utils/check'; import { isEmpty } from '@webapi/utils/check';
// 获取OneBot11配置 // 获取OneBot11配置
export const OB11GetConfigHandler: RequestHandler = async (_, res) => { export const OB11GetConfigHandler: RequestHandler = (_, res) => {
// 获取QQ登录状态 // 获取QQ登录状态
const isLogin = await WebUiDataRuntime.getQQLoginStatus(); const isLogin = WebUiDataRuntime.getQQLoginStatus();
// 如果未登录,返回错误 // 如果未登录,返回错误
if (!isLogin) { if (!isLogin) {
return sendError(res, 'Not Login'); return sendError(res, 'Not Login');
} }
// 获取登录的QQ号 // 获取登录的QQ号
const uin = await WebUiDataRuntime.getQQLoginUin(); const uin = WebUiDataRuntime.getQQLoginUin();
// 读取配置文件 // 读取配置文件
const configFilePath = resolve(webUiPathWrapper.configPath, `./onebot11_${uin}.json`); const configFilePath = resolve(webUiPathWrapper.configPath, `./onebot11_${uin}.json`);
// 尝试解析配置文件 // 尝试解析配置文件
@@ -39,7 +39,7 @@ export const OB11GetConfigHandler: RequestHandler = async (_, res) => {
// 写入OneBot11配置 // 写入OneBot11配置
export const OB11SetConfigHandler: RequestHandler = async (req, res) => { export const OB11SetConfigHandler: RequestHandler = async (req, res) => {
// 获取QQ登录状态 // 获取QQ登录状态
const isLogin = await WebUiDataRuntime.getQQLoginStatus(); const isLogin = WebUiDataRuntime.getQQLoginStatus();
// 如果未登录,返回错误 // 如果未登录,返回错误
if (!isLogin) { if (!isLogin) {
return sendError(res, 'Not Login'); return sendError(res, 'Not Login');

View File

@@ -7,12 +7,12 @@ import { sendError, sendSuccess } from '@webapi/utils/response';
// 获取QQ登录二维码 // 获取QQ登录二维码
export const QQGetQRcodeHandler: RequestHandler = async (req, res) => { export const QQGetQRcodeHandler: RequestHandler = async (req, res) => {
// 判断是否已经登录 // 判断是否已经登录
if (await WebUiDataRuntime.getQQLoginStatus()) { if (WebUiDataRuntime.getQQLoginStatus()) {
// 已经登录 // 已经登录
return sendError(res, 'QQ Is Logined'); return sendError(res, 'QQ Is Logined');
} }
// 获取二维码 // 获取二维码
const qrcodeUrl = await WebUiDataRuntime.getQQLoginQrcodeURL(); const qrcodeUrl = WebUiDataRuntime.getQQLoginQrcodeURL();
// 判断二维码是否为空 // 判断二维码是否为空
if (isEmpty(qrcodeUrl)) { if (isEmpty(qrcodeUrl)) {
return sendError(res, 'QRCode Get Error'); return sendError(res, 'QRCode Get Error');
@@ -27,8 +27,8 @@ export const QQGetQRcodeHandler: RequestHandler = async (req, res) => {
// 获取QQ登录状态 // 获取QQ登录状态
export const QQCheckLoginStatusHandler: RequestHandler = async (req, res) => { export const QQCheckLoginStatusHandler: RequestHandler = async (req, res) => {
const data = { const data = {
isLogin: await WebUiDataRuntime.getQQLoginStatus(), isLogin: WebUiDataRuntime.getQQLoginStatus(),
qrcodeurl: await WebUiDataRuntime.getQQLoginQrcodeURL(), qrcodeurl: WebUiDataRuntime.getQQLoginQrcodeURL(),
}; };
return sendSuccess(res, data); return sendSuccess(res, data);
}; };
@@ -38,7 +38,7 @@ export const QQSetQuickLoginHandler: RequestHandler = async (req, res) => {
// 获取QQ号 // 获取QQ号
const { uin } = req.body; const { uin } = req.body;
// 判断是否已经登录 // 判断是否已经登录
const isLogin = await WebUiDataRuntime.getQQLoginStatus(); const isLogin = WebUiDataRuntime.getQQLoginStatus();
if (isLogin) { if (isLogin) {
return sendError(res, 'QQ Is Logined'); return sendError(res, 'QQ Is Logined');
} }
@@ -53,12 +53,24 @@ export const QQSetQuickLoginHandler: RequestHandler = async (req, res) => {
return sendError(res, message); return sendError(res, message);
} }
//本来应该验证 但是http不宜这么搞 建议前端验证 //本来应该验证 但是http不宜这么搞 建议前端验证
//isLogin = await WebUiDataRuntime.getQQLoginStatus(); //isLogin = WebUiDataRuntime.getQQLoginStatus();
return sendSuccess(res, null); return sendSuccess(res, null);
}; };
// 获取快速登录列表 // 获取快速登录列表
export const QQGetQuickLoginListHandler: RequestHandler = async (_, res) => { export const QQGetQuickLoginListHandler: RequestHandler = async (_, res) => {
const quickLoginList = await WebUiDataRuntime.getQQQuickLoginList(); const quickLoginList = WebUiDataRuntime.getQQQuickLoginList();
return sendSuccess(res, quickLoginList); return sendSuccess(res, quickLoginList);
}; };
// 获取快速登录列表(新)
export const QQGetLoginListNewHandler: RequestHandler = async (_, res) => {
const newLoginList = WebUiDataRuntime.getQQNewLoginList();
return sendSuccess(res, newLoginList);
};
// 获取登录的QQ的信息
export const getQQLoginInfoHandler: RequestHandler = async (_, res) => {
const data = WebUiDataRuntime.getQQLoginInfo();
return sendSuccess(res, data);
};

View File

@@ -1,11 +1,16 @@
import { OneBotConfig } from '@/onebot/config/config'; import type { LoginRuntimeType } from '../types/data';
import packageJson from '../../../../package.json';
const LoginRuntime: LoginRuntimeType = { const LoginRuntime: LoginRuntimeType = {
LoginCurrentTime: Date.now(), LoginCurrentTime: Date.now(),
LoginCurrentRate: 0, LoginCurrentRate: 0,
QQLoginStatus: false, //已实现 但太傻了 得去那边注册个回调刷新 QQLoginStatus: false, //已实现 但太傻了 得去那边注册个回调刷新
QQQRCodeURL: '', QQQRCodeURL: '',
QQLoginUin: '', QQLoginUin: '',
QQLoginInfo: {
uid: '',
uin: '',
nick: '',
},
NapCatHelper: { NapCatHelper: {
onOB11ConfigChanged: async () => { onOB11ConfigChanged: async () => {
return; return;
@@ -14,11 +19,13 @@ const LoginRuntime: LoginRuntimeType = {
return { result: false, message: '' }; return { result: false, message: '' };
}, },
QQLoginList: [], QQLoginList: [],
NewQQLoginList: [],
}, },
packageJson: packageJson,
}; };
export const WebUiDataRuntime = { export const WebUiDataRuntime = {
checkLoginRate: async function (RateLimit: number): Promise<boolean> { checkLoginRate(RateLimit: number): boolean {
LoginRuntime.LoginCurrentRate++; LoginRuntime.LoginCurrentRate++;
//console.log(RateLimit, LoginRuntime.LoginCurrentRate, Date.now() - LoginRuntime.LoginCurrentTime); //console.log(RateLimit, LoginRuntime.LoginCurrentRate, Date.now() - LoginRuntime.LoginCurrentTime);
if (Date.now() - LoginRuntime.LoginCurrentTime > 1000 * 60) { if (Date.now() - LoginRuntime.LoginCurrentTime > 1000 * 60) {
@@ -29,51 +36,68 @@ export const WebUiDataRuntime = {
return LoginRuntime.LoginCurrentRate <= RateLimit; return LoginRuntime.LoginCurrentRate <= RateLimit;
}, },
getQQLoginStatus: async function (): Promise<boolean> { getQQLoginStatus(): LoginRuntimeType['QQLoginStatus'] {
return LoginRuntime.QQLoginStatus; return LoginRuntime.QQLoginStatus;
}, },
setQQLoginStatus: async function (status: boolean): Promise<void> { setQQLoginStatus(status: LoginRuntimeType['QQLoginStatus']): void {
LoginRuntime.QQLoginStatus = status; LoginRuntime.QQLoginStatus = status;
}, },
setQQLoginQrcodeURL: async function (url: string): Promise<void> { setQQLoginQrcodeURL(url: LoginRuntimeType['QQQRCodeURL']): void {
LoginRuntime.QQQRCodeURL = url; LoginRuntime.QQQRCodeURL = url;
}, },
getQQLoginQrcodeURL: async function (): Promise<string> { getQQLoginQrcodeURL(): LoginRuntimeType['QQQRCodeURL'] {
return LoginRuntime.QQQRCodeURL; return LoginRuntime.QQQRCodeURL;
}, },
setQQLoginUin: async function (uin: string): Promise<void> { setQQLoginInfo(info: LoginRuntimeType['QQLoginInfo']): void {
LoginRuntime.QQLoginUin = uin; LoginRuntime.QQLoginInfo = info;
LoginRuntime.QQLoginUin = info.uin.toString();
}, },
getQQLoginUin: async function (): Promise<string> { getQQLoginInfo(): LoginRuntimeType['QQLoginInfo'] {
return LoginRuntime.QQLoginInfo;
},
getQQLoginUin(): LoginRuntimeType['QQLoginUin'] {
return LoginRuntime.QQLoginUin; return LoginRuntime.QQLoginUin;
}, },
getQQQuickLoginList: async function (): Promise<any[]> { getQQQuickLoginList(): LoginRuntimeType['NapCatHelper']['QQLoginList'] {
return LoginRuntime.NapCatHelper.QQLoginList; return LoginRuntime.NapCatHelper.QQLoginList;
}, },
setQQQuickLoginList: async function (list: string[]): Promise<void> { setQQQuickLoginList(list: LoginRuntimeType['NapCatHelper']['QQLoginList']): void {
LoginRuntime.NapCatHelper.QQLoginList = list; LoginRuntime.NapCatHelper.QQLoginList = list;
}, },
setQuickLoginCall(func: (uin: string) => Promise<{ result: boolean; message: string }>): void { getQQNewLoginList(): LoginRuntimeType['NapCatHelper']['NewQQLoginList'] {
return LoginRuntime.NapCatHelper.NewQQLoginList;
},
setQQNewLoginList(list: LoginRuntimeType['NapCatHelper']['NewQQLoginList']): void {
LoginRuntime.NapCatHelper.NewQQLoginList = list;
},
setQuickLoginCall(func: LoginRuntimeType['NapCatHelper']['onQuickLoginRequested']): void {
LoginRuntime.NapCatHelper.onQuickLoginRequested = func; LoginRuntime.NapCatHelper.onQuickLoginRequested = func;
}, },
requestQuickLogin: async function (uin: string): Promise<{ result: boolean; message: string }> { requestQuickLogin: function (uin) {
return await LoginRuntime.NapCatHelper.onQuickLoginRequested(uin); return LoginRuntime.NapCatHelper.onQuickLoginRequested(uin);
}, } as LoginRuntimeType['NapCatHelper']['onQuickLoginRequested'],
setOnOB11ConfigChanged: async function (func: (ob11: OneBotConfig) => Promise<void>): Promise<void> { setOnOB11ConfigChanged(func: LoginRuntimeType['NapCatHelper']['onOB11ConfigChanged']): void {
LoginRuntime.NapCatHelper.onOB11ConfigChanged = func; LoginRuntime.NapCatHelper.onOB11ConfigChanged = func;
}, },
setOB11Config: async function (ob11: OneBotConfig): Promise<void> { setOB11Config: function (ob11) {
await LoginRuntime.NapCatHelper.onOB11ConfigChanged(ob11); return LoginRuntime.NapCatHelper.onOB11ConfigChanged(ob11);
} as LoginRuntimeType['NapCatHelper']['onOB11ConfigChanged'],
getPackageJson() {
return LoginRuntime.packageJson;
}, },
}; };

View File

@@ -0,0 +1,8 @@
import { Router } from 'express';
import { PackageInfoHandler } from '../api/BaseInfo';
const router = Router();
// router: 获取nc的package.json信息
router.get('/PackageInfo', PackageInfoHandler);
export { router as BaseRouter };

View File

@@ -5,16 +5,22 @@ import {
QQGetQRcodeHandler, QQGetQRcodeHandler,
QQGetQuickLoginListHandler, QQGetQuickLoginListHandler,
QQSetQuickLoginHandler, QQSetQuickLoginHandler,
QQGetLoginListNewHandler,
getQQLoginInfoHandler,
} from '@webapi/api/QQLogin'; } from '@webapi/api/QQLogin';
const router = Router(); const router = Router();
// router:获取快速登录列表 // router:获取快速登录列表
router.all('/GetQuickLoginList', QQGetQuickLoginListHandler); router.all('/GetQuickLoginList', QQGetQuickLoginListHandler);
// router:获取快速登录列表(新)
router.all('/GetQuickLoginListNew', QQGetLoginListNewHandler);
// router:检查QQ登录状态 // router:检查QQ登录状态
router.post('/CheckLoginStatus', QQCheckLoginStatusHandler); router.post('/CheckLoginStatus', QQCheckLoginStatusHandler);
// router:获取QQ登录二维码 // router:获取QQ登录二维码
router.post('/GetQQLoginQrcode', QQGetQRcodeHandler); router.post('/GetQQLoginQrcode', QQGetQRcodeHandler);
// router:设置QQ快速登录 // router:设置QQ快速登录
router.post('/SetQuickLogin', QQSetQuickLoginHandler); router.post('/SetQuickLogin', QQSetQuickLoginHandler);
// router:获取QQ登录信息
router.post('/GetQQLoginInfo', getQQLoginInfoHandler);
export { router as QQLoginRouter }; export { router as QQLoginRouter };

View File

@@ -11,6 +11,7 @@ import { sendSuccess } from '@webapi/utils/response';
import { QQLoginRouter } from '@webapi/router/QQLogin'; import { QQLoginRouter } from '@webapi/router/QQLogin';
import { AuthRouter } from '@webapi/router/auth'; import { AuthRouter } from '@webapi/router/auth';
import { LogRouter } from '@webapi/router/Log'; import { LogRouter } from '@webapi/router/Log';
import { BaseRouter } from '@webapi/router/Base';
const router = Router(); const router = Router();
@@ -21,6 +22,8 @@ router.use(auth);
router.all('/test', (_, res) => { router.all('/test', (_, res) => {
return sendSuccess(res); return sendSuccess(res);
}); });
// router:基础信息相关路由
router.use('/base', BaseRouter);
// router:WebUI登录相关路由 // router:WebUI登录相关路由
router.use('/auth', AuthRouter); router.use('/auth', AuthRouter);
// router:QQ登录相关路由 // router:QQ登录相关路由

View File

@@ -1,12 +1,17 @@
import type { LoginListItem, SelfInfo } from '@/core';
interface LoginRuntimeType { interface LoginRuntimeType {
LoginCurrentTime: number; LoginCurrentTime: number;
LoginCurrentRate: number; LoginCurrentRate: number;
QQLoginStatus: boolean; QQLoginStatus: boolean;
QQQRCodeURL: string; QQQRCodeURL: string;
QQLoginUin: string; QQLoginUin: string;
QQLoginInfo: SelfInfo;
NapCatHelper: { NapCatHelper: {
onQuickLoginRequested: (uin: string) => Promise<{ result: boolean; message: string }>; onQuickLoginRequested: (uin: string) => Promise<{ result: boolean; message: string }>;
onOB11ConfigChanged: (ob11: OneBotConfig) => Promise<void>; onOB11ConfigChanged: (ob11: OneBotConfig) => Promise<void>;
QQLoginList: string[]; QQLoginList: string[];
NewQQLoginList: LoginListItem[];
}; };
packageJson: object;
} }