mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2026-02-13 00:10:27 +00:00
feat: 迁移事件解析原理
This commit is contained in:
@@ -139,14 +139,21 @@ 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);
|
||||
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.getGroupMembers(groupCodeStr);
|
||||
members = (await this.getGroupMemberAll(groupCodeStr)).result.infos;
|
||||
this.groupMemberCache.set(groupCodeStr, members);
|
||||
} catch (e) {
|
||||
return null;
|
||||
@@ -164,7 +171,7 @@ export class NTQQGroupApi {
|
||||
|
||||
let member = getMember();
|
||||
if (!member) {
|
||||
members = await this.getGroupMembers(groupCodeStr);
|
||||
members = members = (await this.getGroupMemberAll(groupCodeStr)).result.infos;
|
||||
member = getMember();
|
||||
}
|
||||
return member;
|
||||
@@ -253,28 +260,28 @@ export class NTQQGroupApi {
|
||||
return notifies;
|
||||
}
|
||||
|
||||
async getGroupMemberV2(GroupCode: string, uid: string, forced = false) {
|
||||
const Listener = this.core.eventWrapper.registerListen(
|
||||
'NodeIKernelGroupListener/onMemberInfoChange',
|
||||
(params, _, members) => params === GroupCode && members.size > 0,
|
||||
1,
|
||||
forced ? 5000 : 250,
|
||||
);
|
||||
const retData = await (
|
||||
this.core.eventWrapper
|
||||
.createEventFunction('NodeIKernelGroupService/getMemberInfo')
|
||||
)!(GroupCode, [uid], forced);
|
||||
if (retData.result !== 0) {
|
||||
throw new Error(`${retData.errMsg}`);
|
||||
}
|
||||
const result = await Listener as unknown;
|
||||
let member: GroupMember | undefined;
|
||||
if (Array.isArray(result) && result?.[2] instanceof Map) {
|
||||
const members = result[2] as Map<string, GroupMember>;
|
||||
member = members.get(uid);
|
||||
}
|
||||
return member;
|
||||
}
|
||||
// async getGroupMemberV2(GroupCode: string, uid: string, forced = false) {
|
||||
// const Listener = this.core.eventWrapper.registerListen(
|
||||
// 'NodeIKernelGroupListener/onMemberInfoChange',
|
||||
// (params, _, members) => params === GroupCode && members.size > 0,
|
||||
// 1,
|
||||
// forced ? 5000 : 250,
|
||||
// );
|
||||
// const retData = await (
|
||||
// this.core.eventWrapper
|
||||
// .createEventFunction('NodeIKernelGroupService/getMemberInfo')
|
||||
// )!(GroupCode, [uid], forced);
|
||||
// if (retData.result !== 0) {
|
||||
// throw new Error(`${retData.errMsg}`);
|
||||
// }
|
||||
// const result = await Listener as unknown;
|
||||
// let member: GroupMember | undefined;
|
||||
// if (Array.isArray(result) && result?.[2] instanceof Map) {
|
||||
// const members = result[2] as Map<string, GroupMember>;
|
||||
// member = members.get(uid);
|
||||
// }
|
||||
// return member;
|
||||
// }
|
||||
|
||||
async searchGroup(groupCode: string) {
|
||||
const [, ret] = await this.core.eventWrapper.callNormalEventV2(
|
||||
@@ -316,88 +323,88 @@ export class NTQQGroupApi {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
async tryGetGroupMembersV2(groupQQ: string, modeListener = false, num = 30, timeout = 100): Promise<{
|
||||
infos: Map<string, GroupMember>;
|
||||
finish: boolean;
|
||||
hasNext: boolean | undefined;
|
||||
}> {
|
||||
const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1');
|
||||
const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', (params) => params.sceneId === sceneId, 0, timeout)
|
||||
.catch(() => { });
|
||||
const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num);
|
||||
if (result.errCode !== 0) {
|
||||
throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
}
|
||||
let resMode2;
|
||||
if (modeListener) {
|
||||
const ret = (await once)?.[0];
|
||||
if (ret) {
|
||||
resMode2 = ret;
|
||||
}
|
||||
}
|
||||
this.context.session.getGroupService().destroyMemberListScene(sceneId);
|
||||
return {
|
||||
infos: new Map([...(resMode2?.infos ?? []), ...result.result.infos]),
|
||||
finish: result.result.finish,
|
||||
hasNext: resMode2?.hasNext,
|
||||
};
|
||||
}
|
||||
// async tryGetGroupMembersV2(groupQQ: string, modeListener = false, num = 30, timeout = 100): Promise<{
|
||||
// infos: Map<string, GroupMember>;
|
||||
// finish: boolean;
|
||||
// hasNext: boolean | undefined;
|
||||
// }> {
|
||||
// const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1');
|
||||
// const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', (params) => params.sceneId === sceneId, 0, timeout)
|
||||
// .catch(() => { });
|
||||
// const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num);
|
||||
// if (result.errCode !== 0) {
|
||||
// throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
// }
|
||||
// let resMode2;
|
||||
// if (modeListener) {
|
||||
// const ret = (await once)?.[0];
|
||||
// if (ret) {
|
||||
// resMode2 = ret;
|
||||
// }
|
||||
// }
|
||||
// this.context.session.getGroupService().destroyMemberListScene(sceneId);
|
||||
// return {
|
||||
// infos: new Map([...(resMode2?.infos ?? []), ...result.result.infos]),
|
||||
// finish: result.result.finish,
|
||||
// hasNext: resMode2?.hasNext,
|
||||
// };
|
||||
// }
|
||||
|
||||
async GetGroupMembersV3(groupQQ: string, num = 3000, timeout = 2500): Promise<{
|
||||
infos: Map<string, GroupMember>;
|
||||
finish: boolean;
|
||||
hasNext: boolean | undefined;
|
||||
listenerMode: boolean;
|
||||
}> {
|
||||
const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1');
|
||||
const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', (params) => params.sceneId === sceneId, 0, timeout)
|
||||
.catch(() => { });
|
||||
const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num);
|
||||
if (result.errCode !== 0) {
|
||||
throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
}
|
||||
let resMode2;
|
||||
if (result.result.finish && result.result.infos.size === 0) {
|
||||
const ret = (await once)?.[0];
|
||||
if (ret) {
|
||||
resMode2 = ret;
|
||||
}
|
||||
}
|
||||
this.context.session.getGroupService().destroyMemberListScene(sceneId);
|
||||
return {
|
||||
infos: new Map([...(resMode2?.infos ?? []), ...result.result.infos]),
|
||||
finish: result.result.finish,
|
||||
hasNext: resMode2?.hasNext,
|
||||
listenerMode: resMode2?.hasNext !== undefined
|
||||
};
|
||||
}
|
||||
// async GetGroupMembersV3(groupQQ: string, num = 3000, timeout = 2500): Promise<{
|
||||
// infos: Map<string, GroupMember>;
|
||||
// finish: boolean;
|
||||
// hasNext: boolean | undefined;
|
||||
// listenerMode: boolean;
|
||||
// }> {
|
||||
// const sceneId = this.context.session.getGroupService().createMemberListScene(groupQQ, 'groupMemberList_MainWindow_1');
|
||||
// const once = this.core.eventWrapper.registerListen('NodeIKernelGroupListener/onMemberListChange', (params) => params.sceneId === sceneId, 0, timeout)
|
||||
// .catch(() => { });
|
||||
// const result = await this.context.session.getGroupService().getNextMemberList(sceneId, undefined, num);
|
||||
// if (result.errCode !== 0) {
|
||||
// throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
// }
|
||||
// let resMode2;
|
||||
// if (result.result.finish && result.result.infos.size === 0) {
|
||||
// const ret = (await once)?.[0];
|
||||
// if (ret) {
|
||||
// resMode2 = ret;
|
||||
// }
|
||||
// }
|
||||
// this.context.session.getGroupService().destroyMemberListScene(sceneId);
|
||||
// return {
|
||||
// infos: new Map([...(resMode2?.infos ?? []), ...result.result.infos]),
|
||||
// finish: result.result.finish,
|
||||
// hasNext: resMode2?.hasNext,
|
||||
// listenerMode: resMode2?.hasNext !== undefined
|
||||
// };
|
||||
// }
|
||||
|
||||
async getGroupMembersV2(groupQQ: string, num = 3000, no_cache: boolean = false): Promise<Map<string, GroupMember>> {
|
||||
if (no_cache) {
|
||||
return (await this.getGroupMemberAll(groupQQ, true)).result.infos;
|
||||
}
|
||||
let res = await this.GetGroupMembersV3(groupQQ, num);
|
||||
let ret = res.infos;
|
||||
if (res.infos.size === 0 && !res.listenerMode) {
|
||||
res = await this.GetGroupMembersV3(groupQQ, num);
|
||||
ret = res.infos;
|
||||
}
|
||||
if (res.infos.size === 0) {
|
||||
ret = (await this.getGroupMemberAll(groupQQ)).result.infos;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
// async getGroupMembersV2(groupQQ: string, num = 3000, no_cache: boolean = false): Promise<Map<string, GroupMember>> {
|
||||
// if (no_cache) {
|
||||
// return (await this.getGroupMemberAll(groupQQ, true)).result.infos;
|
||||
// }
|
||||
// let res = await this.GetGroupMembersV3(groupQQ, num);
|
||||
// let ret = res.infos;
|
||||
// if (res.infos.size === 0 && !res.listenerMode) {
|
||||
// res = await this.GetGroupMembersV3(groupQQ, num);
|
||||
// ret = res.infos;
|
||||
// }
|
||||
// if (res.infos.size === 0) {
|
||||
// ret = (await this.getGroupMemberAll(groupQQ)).result.infos;
|
||||
// }
|
||||
// return ret;
|
||||
// }
|
||||
|
||||
async getGroupMembers(groupQQ: string, num = 3000): Promise<Map<string, GroupMember>> {
|
||||
const groupService = this.context.session.getGroupService();
|
||||
const sceneId = groupService.createMemberListScene(groupQQ, 'groupMemberList_MainWindow');
|
||||
const result = await groupService.getNextMemberList(sceneId, undefined, num);
|
||||
if (result.errCode !== 0) {
|
||||
throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
}
|
||||
this.context.logger.logDebug(`获取群(${groupQQ})成员列表结果:`, `members: ${result.result.infos.size}`);
|
||||
return result.result.infos;
|
||||
}
|
||||
// async getGroupMembers(groupQQ: string, num = 3000): Promise<Map<string, GroupMember>> {
|
||||
// const groupService = this.context.session.getGroupService();
|
||||
// const sceneId = groupService.createMemberListScene(groupQQ, 'groupMemberList_MainWindow');
|
||||
// const result = await groupService.getNextMemberList(sceneId, undefined, num);
|
||||
// if (result.errCode !== 0) {
|
||||
// throw new Error('获取群成员列表出错,' + result.errMsg);
|
||||
// }
|
||||
// this.context.logger.logDebug(`获取群(${groupQQ})成员列表结果:`, `members: ${result.result.infos.size}`);
|
||||
// return result.result.infos;
|
||||
// }
|
||||
|
||||
async getGroupFileCount(group_ids: Array<string>) {
|
||||
return this.context.session.getRichMediaService().batchGetGroupFileCount(group_ids);
|
||||
|
||||
Reference in New Issue
Block a user