From 7bff1b61e82d3b1859f24a0c3251076fdec09ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Thu, 25 Jul 2024 10:02:16 +0800 Subject: [PATCH] refactor: SendTime --- src/common/utils/helper.ts | 26 +++++++++++++++++++------- src/core/src/apis/group.ts | 23 +++++++++++++++-------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/common/utils/helper.ts b/src/common/utils/helper.ts index e6631ac6..8f973b14 100644 --- a/src/common/utils/helper.ts +++ b/src/common/utils/helper.ts @@ -11,13 +11,25 @@ const __dirname = dirname(__filename); export function sleep(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } -export function PromiseTimer(promise: Promise, ms: number): Promise { - return Promise.race([ - promise, - new Promise((_, reject) => - setTimeout(() => reject(undefined), ms) - ), - ]).catch((error) => error); + +export function PromiseTimer(promise: Promise, ms: number): Promise { + const timeoutPromise = new Promise((_, reject) => + setTimeout(() => reject(new Error("PromiseTimer: Operation timed out")), ms) + ); + return Promise.race([promise, timeoutPromise]); +} + +export async function runAllWithTimeout(tasks: Promise[], timeout: number): Promise { + const wrappedTasks = tasks.map(task => + PromiseTimer(task, timeout).then( + result => ({ status: 'fulfilled', value: result }), + error => ({ status: 'rejected', reason: error }) + ) + ); + const results = await Promise.all(wrappedTasks); + return results + .filter(result => result.status === 'fulfilled') + .map(result => (result as { status: 'fulfilled'; value: T }).value); } export function getMd5(s: string) { diff --git a/src/core/src/apis/group.ts b/src/core/src/apis/group.ts index 17b184b1..fa792058 100644 --- a/src/core/src/apis/group.ts +++ b/src/core/src/apis/group.ts @@ -3,10 +3,7 @@ import { GeneralCallResult, NTQQUserApi, napCatCore } from '@/core'; import { NTEventDispatch } from '@/common/utils/EventTask'; import { log } from '@/common/utils/log'; import { groupMembers } from '../data'; -import { PromiseTimer } from '@/common/utils/helper'; -// setTimeout(async () => { -// console.log(JSON.stringify(await NTQQGroupApi.getGroupMemberLastestSendTime('726067488'), null, 2)); -// }, 21000); +import { runAllWithTimeout } from '@/common/utils/helper'; export class NTQQGroupApi { static async setGroupAvatar(gc: string, filePath: string) { return napCatCore.session.getGroupService().setHeader(gc, filePath); @@ -24,6 +21,16 @@ export class NTQQGroupApi { ); return groupList; } + /** + * 通过QQ自带数据库获取群成员最后发言时间(仅返回有效数据 且消耗延迟大 需要进行缓存) + * @param GroupCode 群号 + * @returns Map key: uin value: sendTime + * @example + * let ret = await NTQQGroupApi.getGroupMemberLastestSendTime('123456'); + * for (let [uin, sendTime] of ret) { + * console.log(uin, sendTime); + * } + */ static async getGroupMemberLastestSendTime(GroupCode: string) { async function getdata(uid: string) { let NTRet = await NTQQGroupApi.getLastestMsgByUids(GroupCode, [uid]); @@ -36,18 +43,18 @@ export class NTQQGroupApi { let PromiseData: Promise<({ sendUin: string; sendTime: string; - } | undefined) | undefined>[] = []; + } | undefined)>[] = []; let ret: Map = new Map(); if (!currentGroupMembers) { return ret; } for (let member of currentGroupMembers.values()) { - PromiseData.push(PromiseTimer(getdata(member.uid), 2500)); + PromiseData.push(getdata(member.uid).catch(() => undefined)); } - let allRet = await Promise.all(PromiseData); + let allRet = await runAllWithTimeout(PromiseData, 2500); for (let PromiseDo of allRet) { if (PromiseDo) { - ret.set(PromiseDo.sendUin, PromiseDo.sendTime) + ret.set(PromiseDo.sendUin, PromiseDo.sendTime); } } return ret;