diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 04b43e12..0653afdd 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -175,8 +175,13 @@ export class NTQQGroupApi { async refreshGroupMemberCache(groupCode: string) { try { const members = await this.getGroupMemberAll(groupCode, true); - let groupData = (await this.GetGroupMembersV3(groupCode)).infos; - if (groupData.size === 0 || groupData.size !== members.result.infos.size) { + // 首先填入基础信息 + const existingMembers = this.groupMemberCache.get(groupCode) ?? new Map(); + members.result.infos.forEach((value, key) => { + existingMembers.set(value.uid, { ...value, ...existingMembers.get(value.uid) }); + }); + // 后台补全复杂信息 + let event = (async () => { let data = (await Promise.allSettled(members.result.ids.map(e => this.core.apis.UserApi.getUserDetailInfo(e.uid)))).filter(e => e.status === 'fulfilled').map(e => e.value); data.forEach(e => { const existingMember = members.result.infos.get(e.uid); @@ -184,14 +189,12 @@ export class NTQQGroupApi { members.result.infos.set(e.uid, { ...existingMember, ...e }); } }); - } else { - groupData.forEach((v, k) => { - if (members.result.infos.has(k)) { - members.result.infos.set(k, { ...members.result.infos.get(k), ...v }); - } - }); + this.groupMemberCache.set(groupCode, members.result.infos); + })().then().catch(e => this.context.logger.logError(e)); + // 处理首次空缺 + if (!this.groupMemberCache.get(groupCode)) { + await event; } - this.groupMemberCache.set(groupCode, members.result.infos); } catch (e) { this.context.logger.logError(`刷新群成员缓存失败, ${e}`); } @@ -202,7 +205,7 @@ export class NTQQGroupApi { const memberUinOrUidStr = memberUinOrUid.toString(); let members = this.groupMemberCache.get(groupCodeStr); if (!members) { - this.refreshGroupMemberCache(groupCodeStr); + await this.refreshGroupMemberCache(groupCodeStr); } function getMember() { diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index c1b28f7b..a9decfea 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -970,7 +970,7 @@ export class OneBotMsgApi { const SysMessage = new NapProtoMsg(PushMsgBody).decode(Uint8Array.from(msg)); if (SysMessage.contentHead.type == 33 && SysMessage.body?.msgContent) { const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); - await this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString()).then().catch(); + this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString()).then().catch(); return new OB11GroupIncreaseEvent( this.core, groupChange.groupUin, @@ -990,7 +990,7 @@ export class OneBotMsgApi { ); } else if (SysMessage.contentHead.type == 44 && SysMessage.body?.msgContent) { const groupAmin = new NapProtoMsg(GroupAdmin).decode(SysMessage.body.msgContent); - await this.core.apis.GroupApi.refreshGroupMemberCache(groupAmin.groupUin.toString()).then().catch(); + this.core.apis.GroupApi.refreshGroupMemberCache(groupAmin.groupUin.toString()).then().catch(); let enabled = false; let uid = ''; if (groupAmin.body.extraEnable != null) {