From c9122a3fee2b470ff1c00c5f73838f744b55e60b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Tue, 3 Dec 2024 20:55:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=B8=B4=E6=97=B6=E7=9A=84=E6=8A=BD?= =?UTF-8?q?=E8=B1=A1=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/apis/group.ts | 22 +++++++++++++------ src/core/apis/user.ts | 2 +- src/onebot/action/group/GetGroupMemberList.ts | 7 ++++-- src/onebot/api/msg.ts | 7 +++--- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 51868c65..b4a331ad 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -33,6 +33,7 @@ export class NTQQGroupApi { this.groups = await this.getGroups(); for (const group of this.groups) { this.groupCache.set(group.groupCode, group); + this.refreshGroupMemberCache(group.groupCode).then().catch(e => this.context.logger.logError(e)); } this.context.logger.logDebug(`加载${this.groups.length}个群组缓存完成`); // process.pid 调试点 @@ -54,11 +55,13 @@ export class NTQQGroupApi { pageLimit: 300, }, pskey); } + async getGroupShutUpMemberList(groupCode: string) { const data = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onShutUpMemberListChanged', (group_id) => group_id === groupCode, 1, 1000); this.context.session.getGroupService().getGroupShutUpMemberList(groupCode); return (await data)[1]; } + async clearGroupNotifiesUnreadCount(uk: boolean) { return this.context.session.getGroupService().clearGroupNotifiesUnreadCount(uk); } @@ -139,26 +142,31 @@ export class NTQQGroupApi { async getGroupMemberAll(groupCode: string, forced = false) { return this.context.session.getGroupService().getAllMemberList(groupCode, forced); } + async refreshGroupMemberCache(groupCode: string) { try { const members = await this.getGroupMemberAll(groupCode, true); + 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); + if (existingMember) { + members.result.infos.set(e.uid, { ...existingMember, ...e }); + } + }); this.groupMemberCache.set(groupCode, members.result.infos); } catch (e) { this.context.logger.logError(`刷新群成员缓存失败, ${e}`); } } + async getGroupMember(groupCode: string | number, memberUinOrUid: string | number) { const groupCodeStr = groupCode.toString(); const memberUinOrUidStr = memberUinOrUid.toString(); let members = this.groupMemberCache.get(groupCodeStr); if (!members) { - try { - members = (await this.getGroupMemberAll(groupCodeStr)).result.infos; - this.groupMemberCache.set(groupCodeStr, members); - } catch (e) { - return null; - } + this.refreshGroupMemberCache(groupCodeStr); } + function getMember() { let member: GroupMember | undefined; if (isNumeric(memberUinOrUidStr)) { @@ -171,7 +179,7 @@ export class NTQQGroupApi { let member = getMember(); if (!member) { - members = members = (await this.getGroupMemberAll(groupCodeStr)).result.infos; + members = (await this.getGroupMemberAll(groupCodeStr)).result.infos; member = getMember(); } return member; diff --git a/src/core/apis/user.ts b/src/core/apis/user.ts index cbb62699..90c99c36 100644 --- a/src/core/apis/user.ts +++ b/src/core/apis/user.ts @@ -90,7 +90,7 @@ export class NTQQUserApi { }; return RetUser; } - + async getUserDetailInfo(uid: string): Promise { let retUser = await solveAsyncProblem(async (uid) => this.fetchUserDetailInfo(uid, UserDetailSource.KDB), uid); if (retUser && retUser.uin !== '0') { diff --git a/src/onebot/action/group/GetGroupMemberList.ts b/src/onebot/action/group/GetGroupMemberList.ts index 0f26d325..0bb3fda4 100644 --- a/src/onebot/action/group/GetGroupMemberList.ts +++ b/src/onebot/action/group/GetGroupMemberList.ts @@ -21,8 +21,11 @@ export class GetGroupMemberList extends OneBotAction const memberCache = this.core.apis.GroupApi.groupMemberCache; let groupMembers = memberCache.get(groupIdStr); if (noCache || !groupMembers) { - groupMembers = (await this.core.apis.GroupApi.getGroupMemberAll(groupIdStr)).result.infos; - memberCache.set(groupIdStr, groupMembers); + await this.core.apis.GroupApi.refreshGroupMemberCache(groupIdStr); + groupMembers = memberCache.get(groupIdStr); + if (!groupMembers) { + throw new Error(`Failed to get group member list for group ${groupIdStr}`); + } } const memberPromises = Array.from(groupMembers.values()).map(item => OB11Construct.groupMember(groupIdStr, item) diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index ace71a72..c1b28f7b 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -968,10 +968,9 @@ export class OneBotMsgApi { async parseSysMessage(msg: number[]) { const SysMessage = new NapProtoMsg(PushMsgBody).decode(Uint8Array.from(msg)); - console.log(Buffer.from(msg).toString('hex')); 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()); + await this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString()).then().catch(); return new OB11GroupIncreaseEvent( this.core, groupChange.groupUin, @@ -981,7 +980,7 @@ export class OneBotMsgApi { ); } else if (SysMessage.contentHead.type == 34 && SysMessage.body?.msgContent) { const groupChange = new NapProtoMsg(GroupChange).decode(SysMessage.body.msgContent); - await this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString()); + this.core.apis.GroupApi.refreshGroupMemberCache(groupChange.groupUin.toString()).then().catch(); return new OB11GroupDecreaseEvent( this.core, groupChange.groupUin, @@ -991,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()); + await this.core.apis.GroupApi.refreshGroupMemberCache(groupAmin.groupUin.toString()).then().catch(); let enabled = false; let uid = ''; if (groupAmin.body.extraEnable != null) {