refactor: SendTime

This commit is contained in:
手瓜一十雪
2024-07-25 10:02:16 +08:00
parent 6affd0eb68
commit 7bff1b61e8
2 changed files with 34 additions and 15 deletions

View File

@@ -11,13 +11,25 @@ const __dirname = dirname(__filename);
export function sleep(ms: number): Promise<void> { export function sleep(ms: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, ms)); return new Promise(resolve => setTimeout(resolve, ms));
} }
export function PromiseTimer<T>(promise: Promise<T>, ms: number): Promise<T | undefined> {
return Promise.race([ export function PromiseTimer<T>(promise: Promise<T>, ms: number): Promise<T> {
promise, const timeoutPromise = new Promise<T>((_, reject) =>
new Promise<T>((_, reject) => setTimeout(() => reject(new Error("PromiseTimer: Operation timed out")), ms)
setTimeout(() => reject(undefined), ms) );
), return Promise.race([promise, timeoutPromise]);
]).catch((error) => error); }
export async function runAllWithTimeout<T>(tasks: Promise<T>[], timeout: number): Promise<T[]> {
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) { export function getMd5(s: string) {

View File

@@ -3,10 +3,7 @@ import { GeneralCallResult, NTQQUserApi, napCatCore } from '@/core';
import { NTEventDispatch } from '@/common/utils/EventTask'; import { NTEventDispatch } from '@/common/utils/EventTask';
import { log } from '@/common/utils/log'; import { log } from '@/common/utils/log';
import { groupMembers } from '../data'; import { groupMembers } from '../data';
import { PromiseTimer } from '@/common/utils/helper'; import { runAllWithTimeout } from '@/common/utils/helper';
// setTimeout(async () => {
// console.log(JSON.stringify(await NTQQGroupApi.getGroupMemberLastestSendTime('726067488'), null, 2));
// }, 21000);
export class NTQQGroupApi { export class NTQQGroupApi {
static async setGroupAvatar(gc: string, filePath: string) { static async setGroupAvatar(gc: string, filePath: string) {
return napCatCore.session.getGroupService().setHeader(gc, filePath); return napCatCore.session.getGroupService().setHeader(gc, filePath);
@@ -24,6 +21,16 @@ export class NTQQGroupApi {
); );
return groupList; return groupList;
} }
/**
* 通过QQ自带数据库获取群成员最后发言时间(仅返回有效数据 且消耗延迟大 需要进行缓存)
* @param GroupCode 群号
* @returns Map<string, string> 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) { static async getGroupMemberLastestSendTime(GroupCode: string) {
async function getdata(uid: string) { async function getdata(uid: string) {
let NTRet = await NTQQGroupApi.getLastestMsgByUids(GroupCode, [uid]); let NTRet = await NTQQGroupApi.getLastestMsgByUids(GroupCode, [uid]);
@@ -36,18 +43,18 @@ export class NTQQGroupApi {
let PromiseData: Promise<({ let PromiseData: Promise<({
sendUin: string; sendUin: string;
sendTime: string; sendTime: string;
} | undefined) | undefined>[] = []; } | undefined)>[] = [];
let ret: Map<string, string> = new Map(); let ret: Map<string, string> = new Map();
if (!currentGroupMembers) { if (!currentGroupMembers) {
return ret; return ret;
} }
for (let member of currentGroupMembers.values()) { 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) { for (let PromiseDo of allRet) {
if (PromiseDo) { if (PromiseDo) {
ret.set(PromiseDo.sendUin, PromiseDo.sendTime) ret.set(PromiseDo.sendUin, PromiseDo.sendTime);
} }
} }
return ret; return ret;