From 3cca06712b2ca8285d97d82741a62f7bcd33d8bc Mon Sep 17 00:00:00 2001 From: Alen Date: Tue, 27 Aug 2024 02:43:27 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E7=BE=A4=E6=88=90=E5=91=98=E6=8B=89?= =?UTF-8?q?=E5=8F=96=E5=A4=B1=E8=B4=A5(=E5=AE=9E=E9=AA=8C=E6=80=A7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/group.ts | 44 ++++++++++++++++--- src/core/core.ts | 7 +-- .../listeners/NodeIKernelGroupListener.ts | 3 ++ src/onebot/action/group/GetGroupMemberList.ts | 2 +- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index e7f6fc58..b61adfc8 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -23,17 +23,15 @@ export class NTQQGroupApi { constructor(context: InstanceContext, core: NapCatCore) { this.context = context; this.core = core; - sleep(1000).then(() => { - this.initCache().then().catch(context.logger.logError); - }); + this.initCache().then().catch(context.logger.logError); } async initCache() { this.groups = await this.getGroups(); for (const group of this.groups) { this.groupCache.set(group.groupCode, group); - const data = await this.getGroupMembers(group.groupCode, 3000); - this.groupMemberCache.set(group.groupCode, data); + //const data = await this.getGroupMembers(group.groupCode, 3000); + //this.groupMemberCache.set(group.groupCode, data); } this.context.logger.logDebug(`加载${this.groups.length}个群组缓存完成`); } @@ -175,7 +173,7 @@ export class NTQQGroupApi { let members = this.groupMemberCache.get(groupCodeStr); if (!members) { try { - members = await this.getGroupMembers(groupCodeStr); + members = await this.getGroupMembersV2(groupCodeStr); // 更新群成员列表 this.groupMemberCache.set(groupCodeStr, members); } catch (e) { @@ -196,7 +194,7 @@ export class NTQQGroupApi { let member = getMember(); if (!member) { - members = await this.getGroupMembers(groupCodeStr); + members = await this.getGroupMembersV2(groupCodeStr); member = getMember(); } return member; @@ -330,6 +328,38 @@ export class NTQQGroupApi { return member; } + async getGroupMembersV2(groupQQ: string, num = 3000): Promise> { + const groupService = this.context.session.getGroupService(); + const sceneId = groupService.createMemberListScene(groupQQ, 'groupMemberList_MainWindow'); + const listener = this.core.eventWrapper.registerListen( + 'NodeIKernelGroupListener/onMemberListChange', + 1, + 500, + (params) => params.sceneId === sceneId, + ); + try { + const [membersFromFunc, membersFromListener] = await Promise.allSettled([ + groupService.getNextMemberList(sceneId, undefined, num), + listener, + ]); + if (membersFromFunc.status === 'fulfilled' && membersFromListener.status === 'fulfilled') { + return new Map([ + ...membersFromFunc.value.result.infos, + ...membersFromListener.value[0].infos + ]); + } + if (membersFromFunc.status === 'fulfilled') { + return membersFromFunc.value.result.infos; + } + if (membersFromListener.status === 'fulfilled') { + return membersFromListener.value[0].infos; + } + throw new Error('获取群成员列表失败'); + } finally { + groupService.destroyMemberListScene(sceneId); + } + } + async getGroupMembers(groupQQ: string, num = 3000): Promise> { const groupService = this.context.session.getGroupService(); const sceneId = groupService.createMemberListScene(groupQQ, 'groupMemberList_MainWindow'); diff --git a/src/core/core.ts b/src/core/core.ts index ce123ee7..3ae6a1f6 100644 --- a/src/core/core.ts +++ b/src/core/core.ts @@ -130,12 +130,13 @@ export class NapCatCore { // 获取群成员 } const sceneId = this.context.session.getGroupService().createMemberListScene(g.groupCode, 'groupMemberList_MainWindow'); - this.context.session.getGroupService().getNextMemberList(sceneId!, undefined, 3000).then( /* r => { + this.context.session.getGroupService().getNextMemberList(sceneId, undefined, 3000).then( /* r => { // console.log(`get group ${g.groupCode} members`, r); // r.result.infos.forEach(member => { // }); // groupMembers.set(g.groupCode, r.result.infos); } */); + this.context.session.getGroupService().destroyMemberListScene(sceneId); }); }; groupListener.onMemberListChange = (arg) => { @@ -159,10 +160,10 @@ export class NapCatCore { } else { this.apis.GroupApi.groupMemberCache.set(groupCode, arg.infos); } - // console.log('onMemberListChange', groupCode, arg); + //console.log('onMemberListChange', groupCode, arg.infos.size); }; groupListener.onMemberInfoChange = (groupCode, dataSource, members) => { - //console.log('onMemberInfoChange', groupCode, changeType, members); + //console.log('onMemberInfoChange', groupCode, dataSource, members.size); if (dataSource === DataSource.LOCAL && members.get(this.selfInfo.uid)?.isDelete) { // 自身退群或者被踢退群 5s用于Api操作 之后不再出现 setTimeout(() => { diff --git a/src/core/listeners/NodeIKernelGroupListener.ts b/src/core/listeners/NodeIKernelGroupListener.ts index 64c7a02b..276f08ca 100644 --- a/src/core/listeners/NodeIKernelGroupListener.ts +++ b/src/core/listeners/NodeIKernelGroupListener.ts @@ -80,4 +80,7 @@ export class NodeIKernelGroupListener { onShutUpMemberListChanged(...args: unknown[]) { } + + onGroupListInited(...args: unknown[]) { + } } \ No newline at end of file diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 37c5cd9d..980053e8 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -22,7 +22,7 @@ class GetGroupMemberList extends BaseAction { async _handle(payload: Payload) { const NTQQGroupApi = this.core.apis.GroupApi; const NTQQWebApi = this.core.apis.WebApi; - const groupMembers = await NTQQGroupApi.getGroupMembers(payload.group_id.toString()); + const groupMembers = await NTQQGroupApi.getGroupMembersV2(payload.group_id.toString()); const groupMembersArr = Array.from(groupMembers.values()); let _groupMembers = groupMembersArr.map(item => { From 5a0028be26787f5afee328863be320aacd99ac21 Mon Sep 17 00:00:00 2001 From: Alen <33656288+cnxysoft@users.noreply.github.com> Date: Tue, 27 Aug 2024 13:41:30 +0800 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20=E5=8E=BB=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/group.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index bcc77f33..1227d860 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -305,7 +305,6 @@ export class NTQQGroupApi { } async getGroupMemberV2(GroupCode: string, uid: string, forced = false) { - type EventType = NodeIKernelGroupService['getMemberInfo']; const Listener = this.core.eventWrapper.registerListen( 'NodeIKernelGroupListener/onMemberInfoChange', 1, From b64d1ff4ff1c7376d1b427e8ab057dbb32dad0d9 Mon Sep 17 00:00:00 2001 From: Alen <33656288+cnxysoft@users.noreply.github.com> Date: Tue, 27 Aug 2024 13:52:23 +0800 Subject: [PATCH 3/3] =?UTF-8?q?revert:=20=E5=85=A5=E7=BE=A4=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 因getGroupMembers切换到V2,恢复原本逻辑 --- src/onebot/api/group.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/onebot/api/group.ts b/src/onebot/api/group.ts index 0ca6fe6f..bf7509bc 100644 --- a/src/onebot/api/group.ts +++ b/src/onebot/api/group.ts @@ -78,7 +78,7 @@ export class OneBotGroupApi { const NTQQGroupApi = this.core.apis.GroupApi; const groupElement = grayTipElement?.groupElement; if (!groupElement) return undefined; - const member = await NTQQGroupApi.getGroupMemberV2(GroupCode, groupElement.memberUid); + const member = await NTQQGroupApi.getGroupMember(GroupCode, groupElement.memberUid); const memberUin = member?.uin; const adminMember = await NTQQGroupApi.getGroupMember(GroupCode, groupElement.adminUid); if (memberUin) {