fix:修复某些登录问题

This commit is contained in:
Jerry 2025-09-30 18:06:58 +08:00
parent 304f2c9e6c
commit 89e2862237
3 changed files with 54 additions and 36 deletions

View File

@ -225,24 +225,33 @@ export default class LoginService extends plugin {
} }
const qrPath = await loginInstance.login(qq, nickname); const qrPath = await loginInstance.login(qq, nickname);
e.reply(segment.image(qrPath), true); if (qrPath) {
const timerKey = `login:timer:${qq}`; e.reply(segment.image(qrPath), true);
await redis.set(timerKey, 120, 'pending'); const timerKey = `login:timer:${qq}`;
await redis.set(timerKey, 120, 'pending');
const check = setInterval(async () => { const check = setInterval(async () => {
const status = await loginInstance.checkStatus(); const status = await loginInstance.checkStatus(qq);
if (status) {
clearInterval(check);
await redis.del(timerKey);
return e.reply(`QQ[${qq}] 登录成功!`, true);
}
const ttl = await redis.ttl(timerKey);
if (ttl <= 0) {
clearInterval(check);
await loginInstance.disconnect(nickname);
return e.reply(`QQ[${qq}] 登录超时,已断开,请重新发起登录..`, true);
}
}, 5000);
} else {
const status = await loginInstance.checkStatus(qq);
if (status) { if (status) {
clearInterval(check); return e.reply(`QQ[${qq}] 使用上次登录缓存登录成功!`, true);
await redis.del(timerKey); } else {
return e.reply(`QQ[${qq}] 登录成功!`, true); return e.reply(`QQ[${qq}] 登录出现未知错误,请联系管理员操作..`, true);
} }
const ttl = await redis.ttl(timerKey); }
if (ttl <= 0) {
clearInterval(check);
await loginInstance.disconnect(nickname);
return e.reply(`QQ[${qq}] 登录超时,已断开,请重新发起登录..`, true);
}
}, 5000);
} catch (err) { } catch (err) {
logger.error('[crystelf-admin]登录流程出现错误', err); logger.error('[crystelf-admin]登录流程出现错误', err);
return e.reply(`出了点小问题,过会儿再来试试吧..`); return e.reply(`出了点小问题,过会儿再来试试吧..`);

View File

@ -55,31 +55,36 @@ export default class LgrService {
/** /**
* 等待qr图片更新 * 等待qr图片更新
* @param targetDir 目标文件夹 * @param targetDir 目标文件夹
* @param timeout * @param timeout 最大等待时间 (默认 30s)
* @returns {Promise<unknown>} * @returns {Promise<string|undefined>}
*/ */
async waitForQrUpdate(targetDir, timeout = 10000) { async waitForQrUpdate(targetDir, timeout = 30000) {
const qrPath = path.join(targetDir, 'qr-0.png'); const qrPath = path.join(targetDir, 'qr-0.png');
if (!fs.existsSync(qrPath)) { if (!fs.existsSync(qrPath)) {
return 'none'; return 'none';
} }
let lastMtime = fs.statSync(qrPath).mtimeMs; let lastMtime = fs.statSync(qrPath).mtimeMs;
return new Promise((resolve) => { return new Promise((resolve) => {
const timer = setTimeout(() => { let resolved = false;
watcher.close();
resolve('none');
}, timeout);
const timer = setTimeout(() => {
if (!resolved) {
resolved = true;
watcher.close();
resolve(undefined);
}
}, timeout);
const watcher = fs.watch(qrPath, (eventType) => { const watcher = fs.watch(qrPath, (eventType) => {
if (eventType === 'change') { if (eventType === 'change') {
const stat = fs.statSync(qrPath); const stat = fs.statSync(qrPath);
if (stat.mtimeMs !== lastMtime) { if (stat.mtimeMs !== lastMtime) {
lastMtime = stat.mtimeMs; lastMtime = stat.mtimeMs;
clearTimeout(timer); if (!resolved) {
watcher.close(); resolved = true;
resolve(qrPath); clearTimeout(timer);
watcher.close();
resolve(qrPath);
}
} }
} }
}); });

View File

@ -64,27 +64,31 @@ export default class NapcatService {
* @param timeout * @param timeout
* @returns {Promise<unknown>} * @returns {Promise<unknown>}
*/ */
async waitForQrUpdate(timeout = 10000) { async waitForQrUpdate(timeout = 30000) {
if (!fs.existsSync(this.qrPath)) { if (!fs.existsSync(this.qrPath)) {
return 'none'; return 'none';
} }
let lastMtime = fs.statSync(this.qrPath).mtimeMs; let lastMtime = fs.statSync(this.qrPath).mtimeMs;
return new Promise((resolve) => { return new Promise((resolve) => {
let resolved = false;
const timer = setTimeout(() => { const timer = setTimeout(() => {
watcher.close(); if (!resolved) {
resolve('none'); resolved = true;
watcher.close();
resolve(undefined);
}
}, timeout); }, timeout);
const watcher = fs.watch(this.qrPath, (eventType) => { const watcher = fs.watch(this.qrPath, (eventType) => {
if (eventType === 'change') { if (eventType === 'change') {
const stat = fs.statSync(this.qrPath); const stat = fs.statSync(this.qrPath);
if (stat.mtimeMs !== lastMtime) { if (stat.mtimeMs !== lastMtime) {
lastMtime = stat.mtimeMs; lastMtime = stat.mtimeMs;
clearTimeout(timer); if (!resolved) {
watcher.close(); resolved = true;
resolve(this.qrPath); clearTimeout(timer);
watcher.close();
resolve(this.qrPath);
}
} }
} }
}); });