From bb7a2f5f6c967e8a222500cf80f00b8ee9f313c7 Mon Sep 17 00:00:00 2001 From: "Wesley F. Young" Date: Sat, 10 Aug 2024 20:25:32 +0800 Subject: [PATCH] feat: get group & group member by uin --- src/core/apis/group.ts | 74 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 43046cf3..532f7de1 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -1,18 +1,21 @@ import { ChatType, + Group, GroupMember, GroupMemberRole, GroupNotify, GroupRequestOperateTypes, MemberExtSourceType, -} from '../entities'; + NodeIKernelGroupListener, +} from '@/core'; import { GeneralCallResult, InstanceContext, NapCatCore, NodeIKernelGroupService } from '@/core'; -import { runAllWithTimeout } from '@/common/utils/helper'; -import { NodeIKernelGroupListener } from '../listeners'; +import { isNumeric, runAllWithTimeout } from '@/common/utils/helper'; export class NTQQGroupApi { context: InstanceContext; core: NapCatCore; + groupCache: Map = new Map(); + groupMemberCache: Map> = new Map>(); constructor(context: InstanceContext, core: NapCatCore) { this.context = context; @@ -31,12 +34,30 @@ export class NTQQGroupApi { 'NodeIKernelGroupListener/onGroupListUpdate', 1, 5000, - (updateType) => true, + () => true, forced, ); return groupList; } + async getGroup(groupCode: string, forced = false) { + let group = this.groupCache.get(groupCode.toString()); + if (!group) { + try { + const groupList = await this.getGroups(forced); + if (groupList.length) { + groupList.forEach(g => { + this.groupCache.set(g.groupCode, g); + }); + } + } catch (e) { + return undefined; + } + } + group = this.groupCache.get(groupCode.toString()); + return group; + } + async getGroupMemberLatestSendTimeCache(GroupCode: string, uids: string[]) { return this.getGroupMemberLatestSendTime(GroupCode, uids); } @@ -44,6 +65,7 @@ export class NTQQGroupApi { /** * 通过QQ自带数据库获取群成员最后发言时间(仅返回有效数据 且消耗延迟大 需要进行缓存) * @param GroupCode 群号 + * @param uids QQ号 * @returns Map key: uin value: sendTime * @example * let ret = await NTQQGroupApi.getGroupMemberLastestSendTime('123456'); @@ -77,7 +99,7 @@ export class NTQQGroupApi { } async getLatestMsgByUids(GroupCode: string, uids: string[]) { - const ret = await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { + return await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { chatInfo: { peerUid: GroupCode, chatType: ChatType.group, @@ -90,13 +112,46 @@ export class NTQQGroupApi { isIncludeCurrent: true, pageLimit: 1, }); - return ret; } async getGroupMemberAll(GroupCode: string, forced = false) { return this.context.session.getGroupService().getAllMemberList(GroupCode, forced); } + async getGroupMember(groupCode: string | number, memberUinOrUid: string | number) { + const groupCodeStr = groupCode.toString(); + const memberUinOrUidStr = memberUinOrUid.toString(); + let members = this.groupMemberCache.get(groupCodeStr); + if (!members) { + try { + members = await this.getGroupMembers(groupCodeStr); + // 更新群成员列表 + this.groupMemberCache.set(groupCodeStr, members); + } + catch (e) { + return null; + } + } + + // log('getGroupMember', members); + function getMember() { + let member: GroupMember | undefined; + if (isNumeric(memberUinOrUidStr)) { + member = Array.from(members!.values()).find(member => member.uin === memberUinOrUidStr); + } else { + member = members!.get(memberUinOrUidStr); + } + return member; + } + + let member = getMember(); + if (!member) { + members = await this.getGroupMembers(groupCodeStr); + member = getMember(); + } + return member; + } + async getLatestMsg(GroupCode: string, uins: string[]) { const uids: Array = []; for (const uin of uins) { @@ -105,7 +160,7 @@ export class NTQQGroupApi { uids.push(uid); } } - const ret = await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { + return await this.context.session.getMsgService().queryMsgsWithFilterEx('0', '0', '0', { chatInfo: { peerUid: GroupCode, chatType: ChatType.group, @@ -118,7 +173,6 @@ export class NTQQGroupApi { isIncludeCurrent: true, pageLimit: 1, }); - return ret; } async getGroupRecommendContactArkJson(GroupCode: string) { @@ -191,7 +245,7 @@ export class NTQQGroupApi { type EventType = NodeIKernelGroupService['getMemberInfo']; // NTEventDispatch.CreatListenerFunction('NodeIKernelGroupListener/onGroupMemberInfoUpdate', //return napCatCore.session.getGroupService().getMemberInfo(GroupCode, [uid], forced); - const [ret, _groupCode, _changeType, _members] = await this.core.eventWrapper.CallNormalEvent + const [,,, _members] = await this.core.eventWrapper.CallNormalEvent ( 'NodeIKernelGroupService/getMemberInfo', 'NodeIKernelGroupListener/onMemberInfoChange', @@ -303,9 +357,11 @@ export class NTQQGroupApi { } // 头衔不可用 + /* async setGroupTitle(groupQQ: string, uid: string, title: string) { } + */ async publishGroupBulletin(groupQQ: string, content: string, picInfo: { id: string,