diff --git a/src/modules/qqbot/napcat/application/login/qqbot-napcat-login.service.ts b/src/modules/qqbot/napcat/application/login/qqbot-napcat-login.service.ts index 34b3d06..2c13017 100644 --- a/src/modules/qqbot/napcat/application/login/qqbot-napcat-login.service.ts +++ b/src/modules/qqbot/napcat/application/login/qqbot-napcat-login.service.ts @@ -421,11 +421,12 @@ export class QqbotNapcatLoginService { session.errorMessage = status.loginError || undefined; if ( status.qrcodeurl && - session.mode !== 'refresh' && + (session.mode !== 'refresh' || !session.qrcode) && !this.toolsService.isNapcatExpiredQrcodeStatus(status) ) { const qrcodeChanged = session.qrcode !== status.qrcodeurl; session.qrcode = status.qrcodeurl; + session.errorMessage = undefined; if (qrcodeChanged) { this.publishScanResultEvent( session, diff --git a/test/qqbot/account/qqbot-napcat-login.service.spec.ts b/test/qqbot/account/qqbot-napcat-login.service.spec.ts index 96f02ff..445aaa2 100644 --- a/test/qqbot/account/qqbot-napcat-login.service.spec.ts +++ b/test/qqbot/account/qqbot-napcat-login.service.spec.ts @@ -3591,6 +3591,38 @@ describe('QqbotNapcatLoginService', () => { expect(result.errorMessage).toContain('正在重新生成二维码'); }); + it('accepts qrcode from login status for refresh session without stored qrcode', async () => { + (service as any).sessions.set('session-status-qrcode', { + accountId: 'account-1', + containerId: 'container-status-qrcode', + containerName: 'napcat-status-qrcode', + createdAt: Date.now(), + errorMessage: 'NapCat 正在重新生成二维码,请稍后', + expiresAt: Date.now() + 60_000, + id: 'session-status-qrcode', + mode: 'refresh', + status: 'pending', + webuiPort: 6106, + }); + jest + .spyOn(service as any, 'getSessionContainer') + .mockResolvedValue({ id: 'container-status-qrcode' }); + jest.spyOn(service as any, 'getLoginStatus').mockResolvedValue({ + isLogin: false, + qrcodeurl: 'fresh-status-qrcode', + }); + const getQrcode = jest + .spyOn(service as any, 'getQrcode') + .mockRejectedValue(new Error('NapCat 二维码仍未刷新')); + + const result = await service.status('session-status-qrcode'); + + expect(result.status).toBe('pending'); + expect(result.qrcode).toBe('fresh-status-qrcode'); + expect(result.errorMessage).toBeUndefined(); + expect(getQrcode).not.toHaveBeenCalled(); + }); + it('normalizes login status to offline when login info reports offline', async () => { jest .spyOn(service as any, 'postNapcat')