Merge pull request #466 from cnxysoft/upmain

perf: 群成员拉取
This commit is contained in:
手瓜一十雪 2024-10-26 16:18:17 +08:00 committed by GitHub
commit 8823895a03
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 12 deletions

View File

@ -316,12 +316,13 @@ export class NTQQGroupApi {
return undefined; 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<string, GroupMember>; infos: Map<string, GroupMember>;
finish: boolean; finish: boolean;
hasNext: boolean | undefined;
}>{ }>{
const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1'); 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(() => {}); .catch(() => {});
const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num); const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num);
if (result.errCode !== 0) { if (result.errCode !== 0) {
@ -338,19 +339,19 @@ export class NTQQGroupApi {
return { return {
infos: resMode2?.infos || result.result.infos, infos: resMode2?.infos || result.result.infos,
finish: result.result.finish, finish: result.result.finish,
hasNext: resMode2?.hasNext,
}; };
} }
async getGroupMembersV2(groupQQ: string, num = 3000): Promise<Map<string, GroupMember>> { async getGroupMembersV2(groupQQ: string, num = 3000): Promise<Map<string, GroupMember>> {
let result = await this.tryGetGroupMembersV2(false, groupQQ); let res = await this.tryGetGroupMembersV2(true, groupQQ);
if (result.finish === false || (result.infos.size === 0 && result.finish === true)) { if (res.hasNext || !res.finish || res.infos.size === 0) {
result = await this.tryGetGroupMembersV2(false, groupQQ, num); res = 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]);
}
} }
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<Map<string, GroupMember>> { async getGroupMembers(groupQQ: string, num = 3000): Promise<Map<string, GroupMember>> {

View File

@ -21,7 +21,14 @@ export class GetGroupMemberList extends BaseAction<Payload, OB11GroupMember[]> {
async _handle(payload: Payload) { async _handle(payload: Payload) {
const groupIdStr = payload.group_id.toString(); 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 => const memberPromises = Array.from(groupMembers.values()).map(item =>
OB11Entities.groupMember(groupIdStr, item) OB11Entities.groupMember(groupIdStr, item)
@ -30,4 +37,7 @@ export class GetGroupMemberList extends BaseAction<Payload, OB11GroupMember[]> {
const MemberMap = new Map(_groupMembers.map(member => [member.user_id, member])); const MemberMap = new Map(_groupMembers.map(member => [member.user_id, member]));
return Array.from(MemberMap.values()); return Array.from(MemberMap.values());
} }
} stringToBoolean(str: string | boolean): boolean {
return typeof str === 'boolean' ? str : str.toLowerCase() === "true";
}
}