From 212c802a1ea9b11c6df6c03c0ba08066241ce7f8 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: Sat, 24 Aug 2024 11:52:50 +0800 Subject: [PATCH] fix: BuddyReq --- src/common/framework/event-legacy.ts | 82 ++++++++++++++++++++ src/core/apis/friend.ts | 31 ++------ src/core/services/NodeIKernelBuddyService.ts | 2 +- 3 files changed, 90 insertions(+), 25 deletions(-) diff --git a/src/common/framework/event-legacy.ts b/src/common/framework/event-legacy.ts index 715e4f5f..caa82baa 100644 --- a/src/common/framework/event-legacy.ts +++ b/src/common/framework/event-legacy.ts @@ -162,7 +162,89 @@ export class LegacyNTEventWrapper { this.createListenerFunction(ListenerMainName); }); } + async CallNormalEventV2< + EventType extends (...args: any[]) => Promise, + ListenerType extends (...args: any[]) => void + >( + EventName = '', + ListenerName = '', + waitTimes = 1, + timeout: number = 3000, + checkerEvent: (ret: Awaited>) => boolean = () => true, + checkerListener: (...args: Parameters) => boolean = () => true, + ...args: Parameters + ) { + return new Promise<[EventRet: Awaited>, ...Parameters]>( + async (resolve, reject) => { + const id = randomUUID(); + let complete = 0; + let retData: Parameters | undefined = undefined; + let retEvent: any = {}; + const databack = () => { + if (complete == 0) { + reject( + new Error( + 'Timeout: NTEvent EventName:' + + EventName + + ' ListenerName:' + + ListenerName + + ' EventRet:\n' + + JSON.stringify(retEvent, null, 4) + + '\n', + ), + ); + } else { + resolve([retEvent as Awaited>, ...retData!]); + } + }; + const ListenerNameList = ListenerName.split('/'); + const ListenerMainName = ListenerNameList[0]; + const ListenerSubName = ListenerNameList[1]; + + const Timeouter = setTimeout(databack, timeout); + + const eventCallbak = { + timeout: timeout, + createtime: Date.now(), + checker: checkerListener, + func: (...args: any[]) => { + complete++; + //console.log('func', ...args); + retData = args as Parameters; + if (complete >= waitTimes) { + clearTimeout(Timeouter); + databack(); + } + }, + }; + if (!this.EventTask.get(ListenerMainName)) { + this.EventTask.set(ListenerMainName, new Map()); + } + if (!this.EventTask.get(ListenerMainName)?.get(ListenerSubName)) { + this.EventTask.get(ListenerMainName)?.set(ListenerSubName, new Map()); + } + this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallbak); + this.createListenerFunction(ListenerMainName); + const EventFunc = this.createEventFunction(EventName); + retEvent = await EventFunc!(...(args as any[])); + if(!checkerEvent(retEvent)){ + clearTimeout(Timeouter); + reject( + new Error( + 'EventChecker Failed: NTEvent EventName:' + + EventName + + ' ListenerName:' + + ListenerName + + ' EventRet:\n' + + JSON.stringify(retEvent, null, 4) + + '\n', + ), + ); + } + }, + ); + } async CallNormalEvent< EventType extends (...args: any[]) => Promise, ListenerType extends (...args: any[]) => void diff --git a/src/core/apis/friend.ts b/src/core/apis/friend.ts index 64cd045f..6949b92a 100644 --- a/src/core/apis/friend.ts +++ b/src/core/apis/friend.ts @@ -1,5 +1,5 @@ import { Friend, FriendV2, User } from '@/core/entities'; -import { BuddyListReqType, InstanceContext, NapCatCore, NodeIKernelProfileService, OnBuddyChangeParams } from '@/core'; +import { BuddyListReqType, InstanceContext, NapCatCore, NodeIKernelBuddyListener, NodeIKernelBuddyService, NodeIKernelProfileService, OnBuddyChangeParams } from '@/core'; import { LimitedHashTable } from '@/common/utils/MessageUnique'; export class NTQQFriendApi { @@ -70,31 +70,14 @@ export class NTQQFriendApi { async isBuddy(uid: string) { return this.context.session.getBuddyService().isBuddy(uid); } - async clearBuddyReqUnreadCnt(){ + async clearBuddyReqUnreadCnt() { return this.context.session.getBuddyService().clearBuddyReqUnreadCnt(); } - /** - * @deprecated - * @param forced - * @returns - */ - async getFriends(forced = false): Promise { - const [_retData, _BuddyArg] = await this.core.eventWrapper.CallNormalEvent<(force: boolean) => Promise, (arg: OnBuddyChangeParams) => void> - ( - 'NodeIKernelBuddyService/getBuddyList', - 'NodeIKernelBuddyListener/onBuddyListChange', - 1, - 5000, - () => true, - forced, - ); - const friends: User[] = []; - for (const categoryItem of _BuddyArg) { - for (const friend of categoryItem.buddyList) { - friends.push(friend); - } - } - return friends; + async getBuddyReq() { + const [, ret] = await this.core.eventWrapper.CallNormalEventV2 + + ('NodeIKernelBuddyService/getBuddyReq', 'NodeIKernelBuddyListener/onBuddyReqChange', 1, 5000); + return ret; } async handleFriendRequest(flag: string, accept: boolean) { diff --git a/src/core/services/NodeIKernelBuddyService.ts b/src/core/services/NodeIKernelBuddyService.ts index 731b39b1..b940ed8c 100644 --- a/src/core/services/NodeIKernelBuddyService.ts +++ b/src/core/services/NodeIKernelBuddyService.ts @@ -61,7 +61,7 @@ export interface NodeIKernelBuddyService { getBuddyReqUnreadCnt(): number; - getBuddyReq(): unknown; + getBuddyReq(): Promise; delBuddyReq(uid: number): void;