mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
refactor: SendTime
This commit is contained in:
@@ -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) {
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user