mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-11 23:40:24 +00:00
- 后端 CheckLoginStatus API 新增 isOffline 字段区分掉线与未登录状态 - 后端 GetQQLoginInfo API 新增返回 online 和 avatarUrl 字段 - 前端掉线时弹窗提示用户是否重启进程 - 修正 isLogin 类型从 string 改为 boolean
150 lines
4.7 KiB
TypeScript
150 lines
4.7 KiB
TypeScript
import { RequestHandler } from 'express';
|
||
|
||
import { WebUiDataRuntime } from '@/napcat-webui-backend/src/helper/Data';
|
||
import { WebUiConfig } from '@/napcat-webui-backend/index';
|
||
import { isEmpty } from '@/napcat-webui-backend/src/utils/check';
|
||
import { sendError, sendSuccess } from '@/napcat-webui-backend/src/utils/response';
|
||
|
||
// 获取QQ登录二维码
|
||
export const QQGetQRcodeHandler: RequestHandler = async (_, res) => {
|
||
// 判断是否已经登录
|
||
if (WebUiDataRuntime.getQQLoginStatus()) {
|
||
// 已经登录
|
||
return sendError(res, 'QQ Is Logined');
|
||
}
|
||
// 获取二维码
|
||
const qrcodeUrl = WebUiDataRuntime.getQQLoginQrcodeURL();
|
||
// 判断二维码是否为空
|
||
if (isEmpty(qrcodeUrl)) {
|
||
return sendError(res, 'QRCode Get Error');
|
||
}
|
||
// 返回二维码URL
|
||
const data = {
|
||
qrcode: qrcodeUrl,
|
||
};
|
||
return sendSuccess(res, data);
|
||
};
|
||
|
||
// 获取QQ登录状态
|
||
export const QQCheckLoginStatusHandler: RequestHandler = async (_, res) => {
|
||
// 从 OneBot 上下文获取实时的 selfInfo.online 状态
|
||
const oneBotContext = WebUiDataRuntime.getOneBotContext();
|
||
const selfInfo = oneBotContext?.core?.selfInfo;
|
||
const isOnline = selfInfo?.online;
|
||
const qqLoginStatus = WebUiDataRuntime.getQQLoginStatus();
|
||
// 必须同时满足:已登录且在线(online 必须明确为 true)
|
||
const isLogin = qqLoginStatus && isOnline === true;
|
||
// 检测掉线状态:已登录但不在线
|
||
const isOffline = qqLoginStatus && isOnline === false;
|
||
const data = {
|
||
isLogin,
|
||
isOffline,
|
||
qrcodeurl: WebUiDataRuntime.getQQLoginQrcodeURL(),
|
||
loginError: WebUiDataRuntime.getQQLoginError(),
|
||
};
|
||
return sendSuccess(res, data);
|
||
};
|
||
|
||
// 快速登录
|
||
export const QQSetQuickLoginHandler: RequestHandler = async (req, res) => {
|
||
// 获取QQ号
|
||
const { uin } = req.body;
|
||
// 判断是否已经登录
|
||
const isLogin = WebUiDataRuntime.getQQLoginStatus();
|
||
if (isLogin) {
|
||
return sendError(res, 'QQ Is Logined');
|
||
}
|
||
// 判断QQ号是否为空
|
||
if (isEmpty(uin)) {
|
||
return sendError(res, 'uin is empty');
|
||
}
|
||
|
||
// 获取快速登录状态
|
||
const { result, message } = await WebUiDataRuntime.requestQuickLogin(uin);
|
||
if (!result) {
|
||
return sendError(res, message);
|
||
}
|
||
// 本来应该验证 但是http不宜这么搞 建议前端验证
|
||
// isLogin = WebUiDataRuntime.getQQLoginStatus();
|
||
return sendSuccess(res, null);
|
||
};
|
||
|
||
// 获取快速登录列表
|
||
export const QQGetQuickLoginListHandler: RequestHandler = async (_, res) => {
|
||
const quickLoginList = WebUiDataRuntime.getQQQuickLoginList();
|
||
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 basicInfo = WebUiDataRuntime.getQQLoginInfo();
|
||
// 从 OneBot 上下文获取实时的 selfInfo.online 状态
|
||
const oneBotContext = WebUiDataRuntime.getOneBotContext();
|
||
const selfInfo = oneBotContext?.core?.selfInfo;
|
||
const online = selfInfo?.online ?? undefined;
|
||
const avatarUrl = selfInfo?.avatarUrl;
|
||
const data = {
|
||
...basicInfo,
|
||
online,
|
||
avatarUrl,
|
||
};
|
||
return sendSuccess(res, data);
|
||
};
|
||
|
||
// 获取自动登录QQ账号
|
||
export const getAutoLoginAccountHandler: RequestHandler = async (_, res) => {
|
||
const data = WebUiConfig.getAutoLoginAccount();
|
||
return sendSuccess(res, data);
|
||
};
|
||
|
||
// 设置自动登录QQ账号
|
||
export const setAutoLoginAccountHandler: RequestHandler = async (req, res) => {
|
||
const { uin } = req.body;
|
||
await WebUiConfig.UpdateAutoLoginAccount(uin);
|
||
return sendSuccess(res, null);
|
||
};
|
||
|
||
// 刷新QQ登录二维码
|
||
export const QQRefreshQRcodeHandler: RequestHandler = async (_, res) => {
|
||
// 判断是否已经登录
|
||
if (WebUiDataRuntime.getQQLoginStatus()) {
|
||
// 已经登录
|
||
return sendError(res, 'QQ Is Logined');
|
||
}
|
||
// 刷新二维码
|
||
await WebUiDataRuntime.refreshQRCode();
|
||
return sendSuccess(res, null);
|
||
};
|
||
|
||
// 密码登录
|
||
export const QQPasswordLoginHandler: RequestHandler = async (req, res) => {
|
||
// 获取QQ号和密码MD5
|
||
const { uin, passwordMd5 } = req.body;
|
||
// 判断是否已经登录
|
||
const isLogin = WebUiDataRuntime.getQQLoginStatus();
|
||
if (isLogin) {
|
||
return sendError(res, 'QQ Is Logined');
|
||
}
|
||
// 判断QQ号是否为空
|
||
if (isEmpty(uin)) {
|
||
return sendError(res, 'uin is empty');
|
||
}
|
||
// 判断密码MD5是否为空
|
||
if (isEmpty(passwordMd5)) {
|
||
return sendError(res, 'passwordMd5 is empty');
|
||
}
|
||
|
||
// 执行密码登录
|
||
const { result, message } = await WebUiDataRuntime.requestPasswordLogin(uin, passwordMd5);
|
||
if (!result) {
|
||
return sendError(res, message);
|
||
}
|
||
return sendSuccess(res, null);
|
||
};
|