From 6affd0eb68e7b0b68f75f8f66d13fb8754324de1 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: Wed, 24 Jul 2024 17:49:03 +0800 Subject: [PATCH] feat: GetSendTime --- src/common/utils/helper.ts | 8 ++ src/core/src/apis/group.ts | 90 +++++++++++++++++-- .../src/services/NodeIKernelMsgService.ts | 50 +++++++++-- 3 files changed, 131 insertions(+), 17 deletions(-) diff --git a/src/common/utils/helper.ts b/src/common/utils/helper.ts index 9f8242bc..e6631ac6 100644 --- a/src/common/utils/helper.ts +++ b/src/common/utils/helper.ts @@ -11,6 +11,14 @@ 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 getMd5(s: string) { diff --git a/src/core/src/apis/group.ts b/src/core/src/apis/group.ts index 52b6ff18..17b184b1 100644 --- a/src/core/src/apis/group.ts +++ b/src/core/src/apis/group.ts @@ -1,14 +1,15 @@ -import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group, MemberExtSourceType, GroupNotifyTypes } from '../entities'; +import { GroupMember, GroupRequestOperateTypes, GroupMemberRole, GroupNotify, Group, MemberExtSourceType, GroupNotifyTypes, ChatType } from '../entities'; import { GeneralCallResult, NTQQUserApi, napCatCore } from '@/core'; import { NTEventDispatch } from '@/common/utils/EventTask'; -import { logDebug } from '@/common/utils/log'; -// console.log(process.pid); +import { log } from '@/common/utils/log'; +import { groupMembers } from '../data'; +import { PromiseTimer } from '@/common/utils/helper'; // setTimeout(async () => { -// console.log(JSON.stringify(await NTQQGroupApi.getMemberExtInfo(), null, 2)); -// }, 20000); +// console.log(JSON.stringify(await NTQQGroupApi.getGroupMemberLastestSendTime('726067488'), null, 2)); +// }, 21000); export class NTQQGroupApi { - static async setGroupAvatar(gc:string,filePath: string) { - return napCatCore.session.getGroupService().setHeader(gc,filePath); + static async setGroupAvatar(gc: string, filePath: string) { + return napCatCore.session.getGroupService().setHeader(gc, filePath); } static async getGroups(forced = false) { let [_retData, _updateType, groupList] = await NTEventDispatch.CallNormalEvent @@ -18,11 +19,82 @@ export class NTQQGroupApi { 'NodeIKernelGroupListener/onGroupListUpdate', 1, 5000, - ()=>true, + () => true, forced ); return groupList; } + static async getGroupMemberLastestSendTime(GroupCode: string) { + async function getdata(uid: string) { + let NTRet = await NTQQGroupApi.getLastestMsgByUids(GroupCode, [uid]); + if (NTRet.result != 0 && NTRet.msgList.length < 1) { + return undefined; + } + return { sendUin: NTRet.msgList[0].senderUin, sendTime: NTRet.msgList[0].msgTime } + } + let currentGroupMembers = groupMembers.get(GroupCode); + let PromiseData: Promise<({ + sendUin: string; + sendTime: string; + } | undefined) | undefined>[] = []; + let ret: Map = new Map(); + if (!currentGroupMembers) { + return ret; + } + for (let member of currentGroupMembers.values()) { + PromiseData.push(PromiseTimer(getdata(member.uid), 2500)); + } + let allRet = await Promise.all(PromiseData); + for (let PromiseDo of allRet) { + if (PromiseDo) { + ret.set(PromiseDo.sendUin, PromiseDo.sendTime) + } + } + return ret; + } + static async getLastestMsgByUids(GroupCode: string, uids: string[]) { + let ret = await napCatCore.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { + chatInfo: { + peerUid: GroupCode, + chatType: ChatType.group, + }, + filterMsgType: [], + filterSendersUid: uids, + filterMsgToTime: '0', + filterMsgFromTime: '0', + isReverseOrder: false, + isIncludeCurrent: true, + pageLimit: 1, + }); + return ret; + } + static async getLastestMsg(GroupCode: string, uins: string[]) { + let uids: Array = []; + for (let uin of uins) { + try { + let uid = await NTQQUserApi.getUidByUin(uin) + if (uid) { + uids.push(uid); + } + } catch (error) { + log("getLastestMsg--->", error) + } + } + let ret = await napCatCore.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { + chatInfo: { + peerUid: GroupCode, + chatType: ChatType.group, + }, + filterMsgType: [], + filterSendersUid: uids, + filterMsgToTime: '0', + filterMsgFromTime: '0', + isReverseOrder: false, + isIncludeCurrent: true, + pageLimit: 1, + }); + return ret; + } static async getGroupRecommendContactArkJson(GroupCode: string) { return napCatCore.session.getGroupService().getGroupRecommendContactArkJson(GroupCode); } @@ -67,7 +139,7 @@ export class NTQQGroupApi { 'NodeIKernelGroupListener/onGroupSingleScreenNotifies', 1, 5000, - ()=>true, + () => true, false, '', num diff --git a/src/core/src/services/NodeIKernelMsgService.ts b/src/core/src/services/NodeIKernelMsgService.ts index 51de0425..0885c1e2 100644 --- a/src/core/src/services/NodeIKernelMsgService.ts +++ b/src/core/src/services/NodeIKernelMsgService.ts @@ -141,7 +141,7 @@ export interface NodeIKernelMsgService { getLastMessageList(peer: Peer[]): Promise; - getAioFirstViewLatestMsgs(peer:Peer,unknown:number): unknown; + getAioFirstViewLatestMsgs(peer: Peer, unknown: number): unknown; getMsgs(peer: Peer, msgId: string, count: unknown, queryOrder: boolean): Promise; @@ -186,27 +186,48 @@ export interface NodeIKernelMsgService { getSourceOfReplyMsgByClientSeqAndTime(...args: unknown[]): unknown; - getMsgsByTypeFilter(peer: Peer, msgId: string, cnt: unknown, queryOrder: boolean, typeFilters: unknown): unknown; + getMsgsByTypeFilter(peer: Peer, msgId: string, cnt: unknown, queryOrder: boolean, typeFilter: { type: number, subtype: Array }): unknown; - getMsgsByTypeFilters(...args: unknown[]): unknown; + getMsgsByTypeFilters(peer: Peer, msgId: string, cnt: unknown, queryOrder: boolean, typeFilters: Array<{ type: number, subtype: Array }>): unknown; getMsgWithAbstractByFilterParam(...args: unknown[]): unknown; queryMsgsWithFilter(...args: unknown[]): unknown; + /** + * @deprecated 该函数已被标记为废弃,请使用新的替代方法。 + * 使用过滤条件查询消息列表的版本2接口。 + * + * 该函数通过一系列过滤条件来查询特定聊天中的消息列表。这些条件包括消息类型、发送者、时间范围等。 + * 函数返回一个Promise,解析为查询结果的未知类型对象。 + * + * @param MsgId 消息ID,用于特定消息的查询。 + * @param MsgTime 消息时间,用于指定消息的时间范围。 + * @param param 查询参数对象,包含详细的过滤条件和分页信息。 + * @param param.chatInfo 聊天信息,包括聊天类型和对方用户ID。 + * @param param.filterMsgType 需要过滤的消息类型数组,留空表示不过滤。 + * @param param.filterSendersUid 需要过滤的发送者用户ID数组。 + * @param param.filterMsgFromTime 查询消息的起始时间。 + * @param param.filterMsgToTime 查询消息的结束时间。 + * @param param.pageLimit 每页的消息数量限制。 + * @param param.isReverseOrder 是否按时间顺序倒序返回消息。 + * @param param.isIncludeCurrent 是否包含当前页码。 + * @returns 返回一个Promise,解析为查询结果的未知类型对象。 + */ queryMsgsWithFilterVer2(MsgId: string, MsgTime: string, param: { chatInfo: { chatType: number, peerUid: string }, filterMsgType: [], - filterSendersUid: [], + filterSendersUid: Array, filterMsgFromTime: string, filterMsgToTime: string, pageLimit: number, isReverseOrder: boolean, isIncludeCurrent: boolean }): Promise; + // this.chatType = i2; // this.peerUid = str; @@ -228,14 +249,15 @@ export interface NodeIKernelMsgService { peerUid: string }, filterMsgType: [], - filterSendersUid: [], + filterSendersUid: string[], filterMsgFromTime: string, filterMsgToTime: string, pageLimit: number, isReverseOrder: boolean, isIncludeCurrent: boolean - - }): Promise; + }): Promise; //queryMsgsWithFilterEx(this.$msgId, this.$msgTime, this.$msgSeq, this.$param) queryFileMsgsDesktop(...args: unknown[]): unknown; @@ -261,7 +283,19 @@ export interface NodeIKernelMsgService { queryTroopEmoticonMsgs(...args: unknown[]): unknown; - queryMsgsAndAbstractsWithFilter(...args: unknown[]): unknown; + queryMsgsAndAbstractsWithFilter(msgId: string, msgTime: string, megSeq: string, param: { + chatInfo: { + chatType: number, + peerUid: string + }, + filterMsgType: [], + filterSendersUid: [], + filterMsgFromTime: string, + filterMsgToTime: string, + pageLimit: number, + isReverseOrder: boolean, + isIncludeCurrent: boolean + }): unknown; setFocusOnGuild(...args: unknown[]): unknown;