diff --git a/packages/napcat-webui-backend/src/api/QQLogin.ts b/packages/napcat-webui-backend/src/api/QQLogin.ts index 4eb1d832..2ce7df04 100644 --- a/packages/napcat-webui-backend/src/api/QQLogin.ts +++ b/packages/napcat-webui-backend/src/api/QQLogin.ts @@ -34,8 +34,11 @@ export const QQCheckLoginStatusHandler: RequestHandler = async (_, res) => { 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(), }; @@ -80,7 +83,17 @@ export const QQGetLoginListNewHandler: RequestHandler = async (_, res) => { // 获取登录的QQ的信息 export const getQQLoginInfoHandler: RequestHandler = async (_, res) => { - const data = WebUiDataRuntime.getQQLoginInfo(); + 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); }; diff --git a/packages/napcat-webui-frontend/src/controllers/qq_manager.ts b/packages/napcat-webui-frontend/src/controllers/qq_manager.ts index db3826fc..05dccb44 100644 --- a/packages/napcat-webui-frontend/src/controllers/qq_manager.ts +++ b/packages/napcat-webui-frontend/src/controllers/qq_manager.ts @@ -21,7 +21,8 @@ export default class QQManager { public static async checkQQLoginStatus () { const data = await serverRequest.post< ServerResponse<{ - isLogin: string; + isLogin: boolean; + isOffline?: boolean; qrcodeurl: string; }> >('/QQLogin/CheckLoginStatus'); @@ -31,7 +32,7 @@ export default class QQManager { public static async checkQQLoginStatusWithQrcode () { const data = await serverRequest.post< - ServerResponse<{ qrcodeurl: string; isLogin: string; loginError?: string; }> + ServerResponse<{ qrcodeurl: string; isLogin: boolean; isOffline?: boolean; loginError?: string; }> >('/QQLogin/CheckLoginStatus'); return data.data.data; diff --git a/packages/napcat-webui-frontend/src/layouts/default.tsx b/packages/napcat-webui-frontend/src/layouts/default.tsx index 4f394f04..2b3df6d8 100644 --- a/packages/napcat-webui-frontend/src/layouts/default.tsx +++ b/packages/napcat-webui-frontend/src/layouts/default.tsx @@ -68,8 +68,8 @@ const Layout: React.FC<{ children: React.ReactNode; }> = ({ children }) => { isOnlineRef.current = false; dialog.confirm({ title: '账号已离线', - content: '您的 QQ 账号已下线,请重新登录。', - confirmText: '重新登陆', + content: '您的 QQ 账号已掉线,是否重启进程以重新登录?', + confirmText: '重启进程', cancelText: '退出账户', onConfirm: async () => { setIsRestarting(true); @@ -115,7 +115,12 @@ const Layout: React.FC<{ children: React.ReactNode; }> = ({ children }) => { const checkIsQQLogin = async () => { try { const result = await QQManager.checkQQLoginStatus(); - if (!result.isLogin) { + // 掉线状态由 checkOnlineStatus 定期检测并弹窗处理,这里只处理未登录 + if (result.isOffline) { + // 已登录但掉线,标记状态,等待 checkOnlineStatus 弹窗 + isOnlineRef.current = false; + } else if (!result.isLogin) { + // 未登录状态:跳转到登录页面 if (isAuth) { navigate('/qq_login', { replace: true }); } else {