mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
fix: quick login 延迟问题
This commit is contained in:
@@ -114,124 +114,116 @@ async function handleLogin(
|
|||||||
quickLoginUin: string | undefined,
|
quickLoginUin: string | undefined,
|
||||||
historyLoginList: LoginListItem[]
|
historyLoginList: LoginListItem[]
|
||||||
): Promise<SelfInfo> {
|
): Promise<SelfInfo> {
|
||||||
return new Promise<SelfInfo>(async (resolve) => {
|
let inner_resolve: (value: SelfInfo) => void;
|
||||||
const loginListener = new NodeIKernelLoginListener();
|
let selfInfo: Promise<SelfInfo> = new Promise((resolve) => {
|
||||||
let isLogined = false;
|
inner_resolve = resolve;
|
||||||
|
});
|
||||||
loginListener.onUserLoggedIn = (userid: string) => {
|
// 连接服务
|
||||||
logger.logError(`当前账号(${userid})已登录,无法重复登录`);
|
let isLogined = false;
|
||||||
};
|
const loginListener = new NodeIKernelLoginListener();
|
||||||
|
loginListener.onUserLoggedIn = (userid: string) => {
|
||||||
loginListener.onQRCodeLoginSucceed = async (loginResult) => {
|
logger.logError(`当前账号(${userid})已登录,无法重复登录`);
|
||||||
isLogined = true;
|
};
|
||||||
resolve({
|
loginListener.onQRCodeLoginSucceed = async (loginResult) => {
|
||||||
uid: loginResult.uid,
|
isLogined = true;
|
||||||
uin: loginResult.uin,
|
inner_resolve({
|
||||||
nick: '',
|
uid: loginResult.uid,
|
||||||
online: true,
|
uin: loginResult.uin,
|
||||||
});
|
nick: '',
|
||||||
};
|
online: true,
|
||||||
|
|
||||||
loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => {
|
|
||||||
WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl);
|
|
||||||
|
|
||||||
const realBase64 = pngBase64QrcodeData.replace(/^data:image\/\w+;base64,/, '');
|
|
||||||
const buffer = Buffer.from(realBase64, 'base64');
|
|
||||||
logger.logWarn('请扫描下面的二维码,然后在手Q上授权登录:');
|
|
||||||
const qrcodePath = path.join(pathWrapper.cachePath, 'qrcode.png');
|
|
||||||
qrcode.generate(qrcodeUrl, { small: true }, (res) => {
|
|
||||||
logger.logWarn([
|
|
||||||
'\n',
|
|
||||||
res,
|
|
||||||
'二维码解码URL: ' + qrcodeUrl,
|
|
||||||
'如果控制台二维码无法扫码,可以复制解码url到二维码生成网站生成二维码再扫码,也可以打开下方的二维码路径图片进行扫码。',
|
|
||||||
].join('\n'));
|
|
||||||
fs.writeFile(qrcodePath, buffer, {}, () => {
|
|
||||||
logger.logWarn('二维码已保存到', qrcodePath);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
loginListener.onQRCodeSessionFailed = (errType: number, errCode: number) => {
|
|
||||||
if (!isLogined) {
|
|
||||||
logger.logError('[Core] [Login] Login Error,ErrType: ', errType, ' ErrCode:', errCode);
|
|
||||||
if (errType == 1 && errCode == 3) {
|
|
||||||
// 二维码过期刷新
|
|
||||||
}
|
|
||||||
loginService.getQRCodePicture();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
loginListener.onLoginFailed = (...args) => {
|
|
||||||
logger.logError('[Core] [Login] Login Error , ErrInfo: ', JSON.stringify(args));
|
|
||||||
};
|
|
||||||
|
|
||||||
loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger));
|
|
||||||
const isConnect = loginService.connect();
|
|
||||||
if (!isConnect) {
|
|
||||||
logger.logError('核心登录服务连接失败!');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.log('核心登录服务连接成功!');
|
|
||||||
|
|
||||||
loginService.getLoginList().then((res) => {
|
|
||||||
// 遍历 res.LocalLoginInfoList[x].isQuickLogin是否可以 res.LocalLoginInfoList[x].uin 转为string 加入string[] 最后遍历完成调用WebUiDataRuntime.setQQQuickLoginList
|
|
||||||
const list = res.LocalLoginInfoList.filter((item) => item.isQuickLogin);
|
|
||||||
WebUiDataRuntime.setQQQuickLoginList(list.map((item) => item.uin.toString()));
|
|
||||||
WebUiDataRuntime.setQQNewLoginList(list);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
WebUiDataRuntime.setQuickLoginCall(async (uin: string) => {
|
};
|
||||||
return await new Promise((resolve) => {
|
|
||||||
if (uin) {
|
loginListener.onQRCodeGetPicture = ({ pngBase64QrcodeData, qrcodeUrl }) => {
|
||||||
logger.log('正在快速登录 ', uin);
|
WebUiDataRuntime.setQQLoginQrcodeURL(qrcodeUrl);
|
||||||
loginService.quickLoginWithUin(uin).then(res => {
|
|
||||||
if (res.loginErrorInfo.errMsg) {
|
const realBase64 = pngBase64QrcodeData.replace(/^data:image\/\w+;base64,/, '');
|
||||||
resolve({ result: false, message: res.loginErrorInfo.errMsg });
|
const buffer = Buffer.from(realBase64, 'base64');
|
||||||
}
|
logger.logWarn('请扫描下面的二维码,然后在手Q上授权登录:');
|
||||||
resolve({ result: true, message: '' });
|
const qrcodePath = path.join(pathWrapper.cachePath, 'qrcode.png');
|
||||||
}).catch((e) => {
|
qrcode.generate(qrcodeUrl, { small: true }, (res) => {
|
||||||
logger.logError(e);
|
logger.logWarn([
|
||||||
resolve({ result: false, message: '快速登录发生错误' });
|
'\n',
|
||||||
});
|
res,
|
||||||
} else {
|
'二维码解码URL: ' + qrcodeUrl,
|
||||||
resolve({ result: false, message: '快速登录失败' });
|
'如果控制台二维码无法扫码,可以复制解码url到二维码生成网站生成二维码再扫码,也可以打开下方的二维码路径图片进行扫码。',
|
||||||
}
|
].join('\n'));
|
||||||
|
fs.writeFile(qrcodePath, buffer, {}, () => {
|
||||||
|
logger.logWarn('二维码已保存到', qrcodePath);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
let network_ok = false;
|
};
|
||||||
while (!network_ok) {
|
|
||||||
network_ok = loginService.getMsfStatus() === 0;
|
loginListener.onQRCodeSessionFailed = (errType: number, errCode: number) => {
|
||||||
logger.log('等待网络连接...');
|
if (!isLogined) {
|
||||||
await sleep(500);
|
logger.logError('[Core] [Login] Login Error,ErrType: ', errType, ' ErrCode:', errCode);
|
||||||
}
|
if (errType == 1 && errCode == 3) {
|
||||||
if (quickLoginUin) {
|
// 二维码过期刷新
|
||||||
if (historyLoginList.some(u => u.uin === quickLoginUin)) {
|
|
||||||
logger.log('正在快速登录 ', quickLoginUin);
|
|
||||||
loginService.quickLoginWithUin(quickLoginUin)
|
|
||||||
.then(result => {
|
|
||||||
if (result.loginErrorInfo.errMsg) {
|
|
||||||
logger.logError('快速登录错误:', result.loginErrorInfo.errMsg);
|
|
||||||
if (!isLogined) loginService.getQRCodePicture();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch();
|
|
||||||
} else {
|
|
||||||
logger.logError('快速登录失败,未找到该 QQ 历史登录记录,将使用二维码登录方式');
|
|
||||||
if (!isLogined) loginService.getQRCodePicture();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
logger.log('没有 -q 指令指定快速登录,将使用二维码登录方式');
|
|
||||||
if (historyLoginList.length > 0) {
|
|
||||||
logger.log(`可用于快速登录的 QQ:\n${historyLoginList
|
|
||||||
.map((u, index) => `${index + 1}. ${u.uin} ${u.nickName}`)
|
|
||||||
.join('\n')
|
|
||||||
}`);
|
|
||||||
}
|
}
|
||||||
loginService.getQRCodePicture();
|
loginService.getQRCodePicture();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
loginListener.onLoginFailed = (...args) => {
|
||||||
|
logger.logError('[Core] [Login] Login Error , ErrInfo: ', JSON.stringify(args));
|
||||||
|
};
|
||||||
|
loginService.addKernelLoginListener(proxiedListenerOf(loginListener, logger));
|
||||||
|
loginService.connect();
|
||||||
|
await waitForNetworkConnection(loginService, logger);
|
||||||
|
// 等待网络
|
||||||
|
WebUiDataRuntime.setQuickLoginCall(async (uin: string) => {
|
||||||
|
return await new Promise((resolve) => {
|
||||||
|
if (uin) {
|
||||||
|
logger.log('正在快速登录 ', uin);
|
||||||
|
loginService.quickLoginWithUin(uin).then(res => {
|
||||||
|
if (res.loginErrorInfo.errMsg) {
|
||||||
|
resolve({ result: false, message: res.loginErrorInfo.errMsg });
|
||||||
|
}
|
||||||
|
resolve({ result: true, message: '' });
|
||||||
|
}).catch((e) => {
|
||||||
|
logger.logError(e);
|
||||||
|
resolve({ result: false, message: '快速登录发生错误' });
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
resolve({ result: false, message: '快速登录失败' });
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
if (quickLoginUin) {
|
||||||
|
if (historyLoginList.some(u => u.uin === quickLoginUin)) {
|
||||||
|
logger.log('正在快速登录 ', quickLoginUin);
|
||||||
|
loginService.quickLoginWithUin(quickLoginUin)
|
||||||
|
.then(result => {
|
||||||
|
if (result.loginErrorInfo.errMsg) {
|
||||||
|
logger.logError('快速登录错误:', result.loginErrorInfo.errMsg);
|
||||||
|
if (!isLogined) loginService.getQRCodePicture();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch();
|
||||||
|
} else {
|
||||||
|
logger.logError('快速登录失败,未找到该 QQ 历史登录记录,将使用二维码登录方式');
|
||||||
|
if (!isLogined) loginService.getQRCodePicture();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logger.log('没有 -q 指令指定快速登录,将使用二维码登录方式');
|
||||||
|
if (historyLoginList.length > 0) {
|
||||||
|
logger.log(`可用于快速登录的 QQ:\n${historyLoginList
|
||||||
|
.map((u, index) => `${index + 1}. ${u.uin} ${u.nickName}`)
|
||||||
|
.join('\n')
|
||||||
|
}`);
|
||||||
|
}
|
||||||
|
loginService.getQRCodePicture();
|
||||||
|
}
|
||||||
|
|
||||||
|
loginService.getLoginList().then((res) => {
|
||||||
|
// 遍历 res.LocalLoginInfoList[x].isQuickLogin是否可以 res.LocalLoginInfoList[x].uin 转为string 加入string[] 最后遍历完成调用WebUiDataRuntime.setQQQuickLoginList
|
||||||
|
const list = res.LocalLoginInfoList.filter((item) => item.isQuickLogin);
|
||||||
|
WebUiDataRuntime.setQQQuickLoginList(list.map((item) => item.uin.toString()));
|
||||||
|
WebUiDataRuntime.setQQNewLoginList(list);
|
||||||
|
});
|
||||||
|
|
||||||
|
return await selfInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function initializeSession(
|
async function initializeSession(
|
||||||
@@ -288,6 +280,20 @@ async function handleProxy(session: NodeIQQNTWrapperSession, logger: LogWrapper)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function waitForNetworkConnection(loginService: NodeIKernelLoginService, logger: LogWrapper) {
|
||||||
|
let network_ok = false;
|
||||||
|
let tryCount = 0;
|
||||||
|
while (!network_ok) {
|
||||||
|
network_ok = loginService.getMsfStatus() === 0;
|
||||||
|
logger.log('等待网络连接...');
|
||||||
|
await sleep(500);
|
||||||
|
tryCount++;
|
||||||
|
}
|
||||||
|
logger.log('网络已连接');
|
||||||
|
return network_ok;
|
||||||
|
}
|
||||||
|
|
||||||
export async function NCoreInitShell() {
|
export async function NCoreInitShell() {
|
||||||
console.log('NapCat Shell App Loading...');
|
console.log('NapCat Shell App Loading...');
|
||||||
const pathWrapper = new NapCatPathWrapper();
|
const pathWrapper = new NapCatPathWrapper();
|
||||||
|
Reference in New Issue
Block a user