diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index d4e02c8f..6d80090e 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -9,8 +9,9 @@ import { MemberExtSourceType, NapCatCore, } from '@/core'; -import { isNumeric } from '@/common/helper'; +import { isNumeric, solveAsyncProblem } from '@/common/helper'; import { LimitedHashTable } from '@/common/message-unique'; +import { NTEventWrapper } from '@/common/event'; export class NTQQGroupApi { context: InstanceContext; @@ -264,7 +265,27 @@ export class NTQQGroupApi { } return member; } - + async getGroupMemberEx(GroupCode: string, uid: string, forced = false, retry = 2) { + let data = await solveAsyncProblem((eventWrapper: NTEventWrapper, GroupCode: string, uid: string, forced = false) => { + return eventWrapper.callNormalEventV2( + 'NodeIKernelGroupService/getMemberInfo', + 'NodeIKernelGroupListener/onMemberInfoChange', + [GroupCode, [uid], forced], + (ret) => ret.result === 0, + (params, _, members) => params === GroupCode && members.size > 0 && members.has(uid), + 1, + forced ? 2500 : 250 + ); + }, this.core.eventWrapper, GroupCode, uid, forced); + if (data && data[3] instanceof Map && data[3].has(uid)) { + return data[3].get(uid); + } + if (retry > 0) { + let trydata = await this.getGroupMemberEx(GroupCode, uid, true, retry - 1) as GroupMember | undefined; + if (trydata) return trydata; + } + return undefined; + } async getGroupMembersV2(groupQQ: string, num = 3000): Promise> { const groupService = this.context.session.getGroupService(); const sceneId = groupService.createMemberListScene(groupQQ, 'groupMemberList_MainWindow'); diff --git a/src/onebot/action/group/GetGroupMemberInfo.ts b/src/onebot/action/group/GetGroupMemberInfo.ts index b1dfe207..6c1a04fd 100644 --- a/src/onebot/action/group/GetGroupMemberInfo.ts +++ b/src/onebot/action/group/GetGroupMemberInfo.ts @@ -26,7 +26,7 @@ class GetGroupMemberInfo extends BaseAction { const uid = await this.core.apis.UserApi.getUidByUinV2(payload.user_id.toString()); if (!uid) throw new Error(`Uin2Uid Error ${payload.user_id}不存在`); const [member, info] = await Promise.allSettled([ - this.core.apis.GroupApi.getGroupMemberV2(payload.group_id.toString(), uid, isNocache), + this.core.apis.GroupApi.getGroupMemberEx(payload.group_id.toString(), uid, isNocache), this.core.apis.UserApi.getUserDetailInfo(uid), ]); if (member.status !== 'fulfilled') throw new Error(`群(${payload.group_id})成员${payload.user_id}获取失败 ${member.reason}`);