diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 29e788b4..0fba1c66 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -316,12 +316,13 @@ export class NTQQGroupApi { return undefined; } - async tryGetGroupMembersV2(modeListener = false, groupQQ: string, num = 30, timeout = 500): Promise<{ + async tryGetGroupMembersV2(modeListener = false, groupQQ: string, num = 30, timeout = 100): Promise<{ infos: Map; finish: boolean; + hasNext: boolean | undefined; }>{ const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1'); - const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', 1, timeout, (params) => params.sceneId === sceneId) + const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', 0, timeout, (params) => params.sceneId === sceneId) .catch(() => {}); const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num); if (result.errCode !== 0) { @@ -338,19 +339,19 @@ export class NTQQGroupApi { return { infos: resMode2?.infos || result.result.infos, finish: result.result.finish, + hasNext: resMode2?.hasNext, }; } async getGroupMembersV2(groupQQ: string, num = 3000): Promise> { - let result = await this.tryGetGroupMembersV2(false, groupQQ); - if (result.finish === false || (result.infos.size === 0 && result.finish === true)) { - result = await this.tryGetGroupMembersV2(false, groupQQ, num); - if (result.finish === true && (result.infos.size === 30 || result.infos.size === 0)) { - const retListener = await this.tryGetGroupMembersV2(true, groupQQ, num); - result.infos = new Map([...retListener.infos,...result.infos]); - } + let res = await this.tryGetGroupMembersV2(true, groupQQ); + if (res.hasNext || !res.finish || res.infos.size === 0) { + res = await this.tryGetGroupMembersV2(false, groupQQ, num); } - return result.infos; + if ((res.infos.size === 0 || res.infos.size === 30) && res.finish) { + res = await this.tryGetGroupMembersV2(true, groupQQ, num); + } + return res.infos; } async getGroupMembers(groupQQ: string, num = 3000): Promise> { diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 56ec9cc4..018a6f4d 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -21,7 +21,14 @@ export class GetGroupMemberList extends BaseAction { async _handle(payload: Payload) { const groupIdStr = payload.group_id.toString(); - const groupMembers = await this.core.apis.GroupApi.getGroupMembersV2(groupIdStr); + const noCache = payload.no_cache ? this.stringToBoolean(payload.no_cache) : false; + const memberCache = this.core.apis.GroupApi.groupMemberCache; + let groupMembers; + if (noCache) { + groupMembers = await this.core.apis.GroupApi.getGroupMembersV2(groupIdStr); + } else { + groupMembers = memberCache.get(groupIdStr) ?? await this.core.apis.GroupApi.getGroupMembersV2(groupIdStr); + } const memberPromises = Array.from(groupMembers.values()).map(item => OB11Entities.groupMember(groupIdStr, item) @@ -30,4 +37,7 @@ export class GetGroupMemberList extends BaseAction { const MemberMap = new Map(_groupMembers.map(member => [member.user_id, member])); return Array.from(MemberMap.values()); } -} \ No newline at end of file + stringToBoolean(str: string | boolean): boolean { + return typeof str === 'boolean' ? str : str.toLowerCase() === "true"; + } +}