From c865d32d956777d784c24fffa147a95f2b8c9701 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: Sat, 10 Aug 2024 20:23:17 +0800 Subject: [PATCH] chore: add --- src/core/apis/group.ts | 114 +++++++++++++++++++++++++++---------- src/core/entities/group.ts | 8 ++- src/onebot/helper/quick.ts | 2 +- 3 files changed, 91 insertions(+), 33 deletions(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 43046cf3..a9d61659 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -1,38 +1,90 @@ import { ChatType, + Group, GroupMember, + GroupMemberCache, GroupMemberRole, GroupNotify, GroupRequestOperateTypes, MemberExtSourceType, } from '../entities'; import { GeneralCallResult, InstanceContext, NapCatCore, NodeIKernelGroupService } from '@/core'; -import { runAllWithTimeout } from '@/common/utils/helper'; +import { isNumeric, runAllWithTimeout } from '@/common/utils/helper'; import { NodeIKernelGroupListener } from '../listeners'; export class NTQQGroupApi { context: InstanceContext; core: NapCatCore; - + public groupMembers: Map> = new Map>(); + public groups: Map = new Map(); constructor(context: InstanceContext, core: NapCatCore) { this.context = context; this.core = core; } - async setGroupAvatar(gc: string, filePath: string) { return this.context.session.getGroupService().setHeader(gc, filePath); } + async getGroup(qq: string | number): Promise { + let group = this.groups.get(qq.toString()); + if (!group) { + try { + const _groups = await this.getGroups(); + if (_groups.length) { + _groups.forEach(g => { + this.groups.set(g.groupCode, g); + }); + } + } catch (e) { + return undefined; + } + } + group = this.groups.get(qq.toString()); + return group; + } + + async getGroupMember(groupQQ: string | number, memberUinOrUid: string | number) { + groupQQ = groupQQ.toString(); + memberUinOrUid = memberUinOrUid.toString(); + let members = this.groupMembers.get(groupQQ); + if (!members) { + try { + members = await this.getGroupMembers(groupQQ); + // 更新群成员列表 + this.groupMembers.set(groupQQ, members); + } + catch (e) { + return null; + } + } + // log('getGroupMember', members); + const getMember = () => { + let member: GroupMember | undefined = undefined; + if (isNumeric(memberUinOrUid)) { + member = Array.from(members!.values()).find(member => member.uin === memberUinOrUid); + } else { + member = members!.get(memberUinOrUid); + } + return member; + }; + let member = getMember(); + if (!member) { + members = await this.getGroupMembers(groupQQ); + member = getMember(); + } + return member; + } + async getGroups(forced = false) { type ListenerType = NodeIKernelGroupListener['onGroupListUpdate']; - const [_retData, _updateType, groupList] = await this.core.eventWrapper.CallNormalEvent <(force: boolean) => Promise, ListenerType> + const [_retData, _updateType, groupList] = await this.core.eventWrapper.CallNormalEvent<(force: boolean) => Promise, ListenerType> ( - 'NodeIKernelGroupService/getGroupList', - 'NodeIKernelGroupListener/onGroupListUpdate', - 1, - 5000, - (updateType) => true, - forced, + 'NodeIKernelGroupService/getGroupList', + 'NodeIKernelGroupListener/onGroupListUpdate', + 1, + 5000, + (updateType) => true, + forced, ); return groupList; } @@ -172,16 +224,16 @@ export class NTQQGroupApi { } async getSingleScreenNotifies(num: number) { - const [_retData, _doubt, _seq, notifies] = await this.core.eventWrapper.CallNormalEvent <(arg1: boolean, arg2: string, arg3: number) => Promise, (doubt: boolean, seq: string, notifies: GroupNotify[]) => void> + const [_retData, _doubt, _seq, notifies] = await this.core.eventWrapper.CallNormalEvent<(arg1: boolean, arg2: string, arg3: number) => Promise, (doubt: boolean, seq: string, notifies: GroupNotify[]) => void> ( - 'NodeIKernelGroupService/getSingleScreenNotifies', - 'NodeIKernelGroupListener/onGroupSingleScreenNotifies', - 1, - 5000, - () => true, - false, - '', - num, + 'NodeIKernelGroupService/getSingleScreenNotifies', + 'NodeIKernelGroupListener/onGroupSingleScreenNotifies', + 1, + 5000, + () => true, + false, + '', + num, ); return notifies; } @@ -191,17 +243,17 @@ 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 - ( - 'NodeIKernelGroupService/getMemberInfo', - 'NodeIKernelGroupListener/onMemberInfoChange', - 1, - 5000, - (groupCode: string, changeType: number, members: Map) => { - return groupCode == GroupCode && members.has(uid); - }, - GroupCode, [uid], forced, - ); + const [ret, _groupCode, _changeType, _members] = await this.core.eventWrapper.CallNormalEvent + ( + 'NodeIKernelGroupService/getMemberInfo', + 'NodeIKernelGroupListener/onMemberInfoChange', + 1, + 5000, + (groupCode: string, changeType: number, members: Map) => { + return groupCode == GroupCode && members.has(uid); + }, + GroupCode, [uid], forced, + ); return _members.get(uid); } @@ -244,7 +296,7 @@ export class NTQQGroupApi { 'NodeIKernelGroupService/getGroupRecommendContactArkJson', 5000, GroupCode, - ); + ); return ret.arkJson; } diff --git a/src/core/entities/group.ts b/src/core/entities/group.ts index aba45f02..a4aeea84 100644 --- a/src/core/entities/group.ts +++ b/src/core/entities/group.ts @@ -6,7 +6,13 @@ export enum GroupListUpdateType { MODIFIED, REMOVE } - +export interface GroupMemberCache { + group: { + data: GroupMember[]; + isExpired: boolean; + } + isExpired: boolean; +} export interface Group { groupCode: string, createTime?: string,//高版本才有 diff --git a/src/onebot/helper/quick.ts b/src/onebot/helper/quick.ts index 38957955..02a0158a 100644 --- a/src/onebot/helper/quick.ts +++ b/src/onebot/helper/quick.ts @@ -35,7 +35,7 @@ async function handleMsg(coreContext: NapCatCore, msg: OB11Message, quickAction: let replyMessage: OB11MessageData[] = []; if (msg.message_type == 'group') { - group = await getGroup(msg.group_id!.toString()); + group = await coreContext.getApiContext().GroupApi.getGroup(msg.group_id!.toString()); replyMessage.push({ type: 'reply', data: {