Skip to content

Commit

Permalink
Merge pull request #309 from cnxysoft/upmain
Browse files Browse the repository at this point in the history
fix: 群员获取异常
  • Loading branch information
cnxysoft authored Aug 27, 2024
2 parents 6384b50 + b64d1ff commit e71f784
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 13 deletions.
45 changes: 37 additions & 8 deletions src/core/apis/group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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}个群组缓存完成`);
}
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
Expand Down Expand Up @@ -307,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,
Expand All @@ -330,6 +327,38 @@ export class NTQQGroupApi {
return member;
}

async getGroupMembersV2(groupQQ: string, num = 3000): Promise<Map<string, GroupMember>> {
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<Map<string, GroupMember>> {
const groupService = this.context.session.getGroupService();
const sceneId = groupService.createMemberListScene(groupQQ, 'groupMemberList_MainWindow');
Expand Down
7 changes: 4 additions & 3 deletions src/core/core.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand All @@ -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(() => {
Expand Down
3 changes: 3 additions & 0 deletions src/core/listeners/NodeIKernelGroupListener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,7 @@ export class NodeIKernelGroupListener {

onShutUpMemberListChanged(...args: unknown[]) {
}

onGroupListInited(...args: unknown[]) {
}
}
2 changes: 1 addition & 1 deletion src/onebot/action/group/GetGroupMemberList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class GetGroupMemberList extends BaseAction<Payload, OB11GroupMember[]> {
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 => {
Expand Down
2 changes: 1 addition & 1 deletion src/onebot/api/group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit e71f784

Please sign in to comment.