From 0bc4f6fd96f9814eaa25b03c3b6629024da993a7 Mon Sep 17 00:00:00 2001 From: Seijo Cecilia Date: Mon, 26 Aug 2024 15:37:17 +0800 Subject: [PATCH] refactor: enhanced type definition for other methods --- src/common/framework/event-legacy.ts | 44 ++++++++++----- src/core/apis/file.ts | 53 +++---------------- src/core/apis/friend.ts | 6 +-- src/core/apis/group.ts | 21 ++++---- src/core/apis/system.ts | 4 +- src/core/apis/user.ts | 3 +- .../NodeIKernelSearchListener_Polyfill.ts | 39 ++++++++++++++ src/core/listeners/index.ts | 3 ++ .../services/NodeIKernelProfileService.ts | 4 +- src/core/services/index.ts | 6 +++ src/onebot/action/msg/DeleteMsg.ts | 3 +- 11 files changed, 102 insertions(+), 84 deletions(-) create mode 100644 src/core/listeners/NodeIKernelSearchListener_Polyfill.ts diff --git a/src/common/framework/event-legacy.ts b/src/common/framework/event-legacy.ts index 8f7956e8..aecd5219 100644 --- a/src/common/framework/event-legacy.ts +++ b/src/common/framework/event-legacy.ts @@ -41,7 +41,13 @@ export class LegacyNTEventWrapper { ); } - createEventFunction any>(eventName: string): T | undefined { + createEventFunction< + Service extends keyof ServiceNamingMapping, + ServiceMethod extends Exclude, + // eslint-disable-next-line + // @ts-ignore + T extends (...args: any) => any = ServiceNamingMapping[Service][ServiceMethod], + >(eventName: `${Service}/${ServiceMethod}`): T | undefined { const eventNameArr = eventName.split('/'); type eventType = { [key: string]: () => { [key: string]: (...params: Parameters) => Promise> }; @@ -65,9 +71,10 @@ export class LegacyNTEventWrapper { if (!existListener) { const Listener = this.createProxyDispatch(listenerMainName); const ServiceSubName = /^NodeIKernel(.*?)Listener$/.exec(listenerMainName)![1]; - const Service = 'NodeIKernel' + ServiceSubName + 'Service/addKernel' + ServiceSubName + 'Listener'; - const addfunc = this.createEventFunction<(listener: T) => number>(Service); - addfunc!(Listener as T); + const Service = `NodeIKernel${ServiceSubName}Service/addKernel${ServiceSubName}Listener`; + // eslint-disable-next-line + // @ts-ignore + this.createEventFunction(Service)(Listener as T); this.listenerManager.set(listenerMainName + uniqueCode, Listener); return Listener as T; } @@ -89,22 +96,33 @@ export class LegacyNTEventWrapper { }); } - async callNoListenerEvent Promise | any>( - EventName = '', + async callNoListenerEvent< + Service extends keyof ServiceNamingMapping, + ServiceMethod extends Exclude, + // eslint-disable-next-line + // @ts-ignore + EventType extends (...args: any) => any = ServiceNamingMapping[Service][ServiceMethod], + >( + serviceAndMethod: `${Service}/${ServiceMethod}`, ...args: Parameters ): Promise>> { - const EventFunc = this.createEventFunction(EventName); - return EventFunc!(...args); + return (this.createEventFunction(serviceAndMethod))!(...args); } - async RegisterListen void>( - ListenerName = '', + async registerListen< + Listener extends keyof ListenerNamingMapping, + ListenerMethod extends Exclude, + // eslint-disable-next-line + // @ts-ignore + ListenerType extends (...args: any) => any = ListenerNamingMapping[Listener][ListenerMethod], + >( + listenerAndMethod: `${Listener}/${ListenerMethod}`, waitTimes = 1, timeout = 5000, checker: (...args: Parameters) => boolean, ) { return new Promise>((resolve, reject) => { - const ListenerNameList = ListenerName.split('/'); + const ListenerNameList = listenerAndMethod.split('/'); const ListenerMainName = ListenerNameList[0]; const ListenerSubName = ListenerNameList[1]; const id = randomUUID(); @@ -113,7 +131,7 @@ export class LegacyNTEventWrapper { function sendDataCallback() { if (complete == 0) { - reject(new Error(' ListenerName:' + ListenerName + ' timeout')); + reject(new Error(' ListenerName:' + listenerAndMethod + ' timeout')); } else { resolve(retData!); } @@ -216,7 +234,7 @@ export class LegacyNTEventWrapper { } this.EventTask.get(ListenerMainName)?.get(ListenerSubName)?.set(id, eventCallback); this.createListenerFunction(ListenerMainName); - const eventFunction = this.createEventFunction(serviceAndMethod); + const eventFunction = this.createEventFunction(serviceAndMethod); retEvent = await eventFunction!(...(args)); if (!checkerEvent(retEvent)) { clearTimeout(timeoutRef); diff --git a/src/core/apis/file.ts b/src/core/apis/file.ts index 88ec39db..586c74f1 100644 --- a/src/core/apis/file.ts +++ b/src/core/apis/file.ts @@ -431,55 +431,14 @@ export class NTQQFileApi { } async searchfile(keys: string[]) { - type EventType = NodeIKernelSearchService['searchFileWithKeywords']; - - interface OnListener { - searchId: string, - hasMore: boolean, - resultItems: { - chatType: ChatType, - buddyChatInfo: any[], - discussChatInfo: any[], - groupChatInfo: - { - groupCode: string, - isConf: boolean, - hasModifyConfGroupFace: boolean, - hasModifyConfGroupName: boolean, - groupName: string, - remark: string - }[], - dataLineChatInfo: any[], - tmpChatInfo: any[], - msgId: string, - msgSeq: string, - msgTime: string, - senderUid: string, - senderNick: string, - senderRemark: string, - senderCard: string, - elemId: string, - elemType: number, - fileSize: string, - filePath: string, - fileName: string, - hits: - { - start: number, - end: number - }[] - }[] - } - - const Event = this.core.eventWrapper.createEventFunction('NodeIKernelSearchService/searchFileWithKeywords'); - let id = ''; - const Listener = this.core.eventWrapper.RegisterListen<(params: OnListener) => void>( + const Event = this.core.eventWrapper.createEventFunction('NodeIKernelSearchService/searchFileWithKeywords'); + const id = await Event!(keys, 12); + const Listener = this.core.eventWrapper.registerListen( 'NodeIKernelSearchListener/onSearchFileKeywordsResult', - 1, - 20000, - (params) => id !== '' && params.searchId == id, + 1, + 20000, + (params) => id !== '' && params.searchId == id, ); - id = await Event!(keys, 12); const [ret] = (await Listener); return ret; } diff --git a/src/core/apis/friend.ts b/src/core/apis/friend.ts index f4d78978..7870bc01 100644 --- a/src/core/apis/friend.ts +++ b/src/core/apis/friend.ts @@ -21,7 +21,7 @@ export class NTQQFriendApi { const buddyService = this.context.session.getBuddyService(); const buddyListV2 = refresh ? await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL) : await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL); uids.push(...buddyListV2.data.flatMap(item => item.buddyUids)); - const data = await this.core.eventWrapper.callNoListenerEvent( + const data = await this.core.eventWrapper.callNoListenerEvent( 'NodeIKernelProfileService/getCoreAndBaseInfo', 'nodeStore', uids, ); return Array.from(data.values()); @@ -33,7 +33,7 @@ export class NTQQFriendApi { const buddyService = this.context.session.getBuddyService(); const buddyListV2 = refresh ? await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL) : await buddyService.getBuddyListV2('0', BuddyListReqType.KNOMAL); uids.push(...buddyListV2.data.flatMap(item => item.buddyUids)); - const data = await this.core.eventWrapper.callNoListenerEvent( + const data = await this.core.eventWrapper.callNoListenerEvent( 'NodeIKernelProfileService/getCoreAndBaseInfo', 'nodeStore', uids, ); data.forEach((value) => { @@ -55,7 +55,7 @@ export class NTQQFriendApi { }); return item.buddyUids; })); - const data = await this.core.eventWrapper.callNoListenerEvent( + const data = await this.core.eventWrapper.callNoListenerEvent( 'NodeIKernelProfileService/getCoreAndBaseInfo', 'nodeStore', uids, ); return buddyListV2.map(category => ({ diff --git a/src/core/apis/group.ts b/src/core/apis/group.ts index 0893edda..79044289 100644 --- a/src/core/apis/group.ts +++ b/src/core/apis/group.ts @@ -268,17 +268,16 @@ export class NTQQGroupApi { async getGroupMemberV2(GroupCode: string, uid: string, forced = false) { type EventType = NodeIKernelGroupService['getMemberInfo']; - const Listener = this.core.eventWrapper.RegisterListen<(params: any) => void> - ( + const Listener = this.core.eventWrapper.registerListen( 'NodeIKernelGroupListener/onMemberInfoChange', 1, forced ? 5000 : 250, - (params) => { - return params === GroupCode; - }, - ); - const EventFunc = this.core.eventWrapper.createEventFunction('NodeIKernelGroupService/getMemberInfo'); - const retData = await EventFunc!(GroupCode, [uid], forced); + (params) => params === GroupCode, + ); + const retData = await ( + this.core.eventWrapper + .createEventFunction('NodeIKernelGroupService/getMemberInfo') + )!(GroupCode, [uid], forced); if (retData.result !== 0) { throw new Error(`${retData.errMsg}`); } @@ -324,12 +323,10 @@ export class NTQQGroupApi { } async getArkJsonGroupShare(GroupCode: string) { - const ret = await this.core.eventWrapper.callNoListenerEvent<(GroupId: string) => Promise>( + const ret = await this.core.eventWrapper.callNoListenerEvent( 'NodeIKernelGroupService/getGroupRecommendContactArkJson', GroupCode, - ); + ) as GeneralCallResult & { arkJson: string }; return ret.arkJson; } diff --git a/src/core/apis/system.ts b/src/core/apis/system.ts index 015bd364..229f7e2c 100644 --- a/src/core/apis/system.ts +++ b/src/core/apis/system.ts @@ -28,9 +28,7 @@ export class NTQQSystemApi { //1-2-162b9b42-65b9-4405-a8ed-2e256ec8aa50 async getArkJsonCollection(cid: string) { - return await this.core.eventWrapper.callNoListenerEvent<(cid: string) => Promise>('NodeIKernelCollectionService/collectionArkShare', '1717662698058'); + return await this.core.eventWrapper.callNoListenerEvent('NodeIKernelCollectionService/collectionArkShare', '1717662698058'); } async BootMiniApp(appfile: string, params: string) { diff --git a/src/core/apis/user.ts b/src/core/apis/user.ts index 8e513083..8b1fdebb 100644 --- a/src/core/apis/user.ts +++ b/src/core/apis/user.ts @@ -231,8 +231,7 @@ export class NTQQUserApi { } async getUserDetailInfoByUinV2(Uin: string) { - return await this.core.eventWrapper.callNoListenerEvent<(Uin: string) => Promise> - ('NodeIKernelProfileService/getUserDetailInfoByUin', Uin); + return await this.core.eventWrapper.callNoListenerEvent('NodeIKernelProfileService/getUserDetailInfoByUin', Uin); } async forceFetchClientKey() { diff --git a/src/core/listeners/NodeIKernelSearchListener_Polyfill.ts b/src/core/listeners/NodeIKernelSearchListener_Polyfill.ts new file mode 100644 index 00000000..1e9bcdf1 --- /dev/null +++ b/src/core/listeners/NodeIKernelSearchListener_Polyfill.ts @@ -0,0 +1,39 @@ +import { ChatType } from '@/core'; + +export interface NodeIKernelSearchListener_Polyfill { + onSearchFileKeywordsResult(params: { + searchId: string, + hasMore: boolean, + resultItems: { + chatType: ChatType, + buddyChatInfo: any[], + discussChatInfo: any[], + groupChatInfo: { + groupCode: string, + isConf: boolean, + hasModifyConfGroupFace: boolean, + hasModifyConfGroupName: boolean, + groupName: string, + remark: string + }[], + dataLineChatInfo: any[], + tmpChatInfo: any[], + msgId: string, + msgSeq: string, + msgTime: string, + senderUid: string, + senderNick: string, + senderRemark: string, + senderCard: string, + elemId: string, + elemType: number, + fileSize: string, + filePath: string, + fileName: string, + hits: { + start: number, + end: number + }[] + }[] + }): void; +} diff --git a/src/core/listeners/index.ts b/src/core/listeners/index.ts index ac5b1e76..49759116 100644 --- a/src/core/listeners/index.ts +++ b/src/core/listeners/index.ts @@ -9,6 +9,7 @@ export * from './NodeIKernelProfileListener'; export * from './NodeIKernelTicketListener'; export * from './NodeIKernelStorageCleanListener'; export * from './NodeIKernelFileAssistantListener'; +export * from './NodeIKernelSearchListener_Polyfill'; import type { NodeIKernelBuddyListener, @@ -21,6 +22,7 @@ import type { NodeIKernelSessionListener, NodeIKernelStorageCleanListener, NodeIKernelTicketListener, + NodeIKernelSearchListener_Polyfill, } from '.'; export type ListenerNamingMapping = { @@ -34,4 +36,5 @@ export type ListenerNamingMapping = { NodeIKernelTicketListener: NodeIKernelTicketListener; NodeIKernelStorageCleanListener: NodeIKernelStorageCleanListener; NodeIKernelFileAssistantListener: NodeIKernelFileAssistantListener; + NodeIKernelSearchListener: NodeIKernelSearchListener_Polyfill; }; diff --git a/src/core/services/NodeIKernelProfileService.ts b/src/core/services/NodeIKernelProfileService.ts index 362a5a42..0cafa0cc 100644 --- a/src/core/services/NodeIKernelProfileService.ts +++ b/src/core/services/NodeIKernelProfileService.ts @@ -1,5 +1,5 @@ import { AnyCnameRecord } from 'node:dns'; -import { BizKey, ModifyProfileParams, SimpleInfo, UserDetailInfoByUin } from '@/core'; +import { BizKey, ModifyProfileParams, SimpleInfo, UserDetailInfoByUin, UserDetailInfoByUinV2 } from '@/core'; import { NodeIKernelProfileListener } from '@/core'; import { GeneralCallResult } from '@/core/services/common'; @@ -86,7 +86,7 @@ export interface NodeIKernelProfileService { getUserDetailInfoWithBizInfo(uid: string, Biz: BizKey[]): Promise; - getUserDetailInfoByUin(uin: string): Promise; + getUserDetailInfoByUin(uin: string): Promise; getZplanAvatarInfos(args: string[]): Promise; diff --git a/src/core/services/index.ts b/src/core/services/index.ts index bd9d015e..a1ca5256 100644 --- a/src/core/services/index.ts +++ b/src/core/services/index.ts @@ -14,6 +14,8 @@ export * from './NodeIKernelRobotService'; export * from './NodeIKernelRichMediaService'; export * from './NodeIKernelDbToolsService'; export * from './NodeIKernelTipOffService'; +export * from './NodeIKernelSearchService'; +export * from './NodeIKernelCollectionService'; import type { NodeIKernelAvatarService, @@ -31,6 +33,8 @@ import type { NodeIKernelStorageCleanService, NodeIKernelTicketService, NodeIKernelTipOffService, + NodeIKernelSearchService, + NodeIKernelCollectionService, } from '.'; export type ServiceNamingMapping = { @@ -49,4 +53,6 @@ export type ServiceNamingMapping = { NodeIKernelRichMediaService: NodeIKernelRichMediaService; NodeIKernelDbToolsService: NodeIKernelDbToolsService; NodeIKernelTipOffService: NodeIKernelTipOffService; + NodeIKernelSearchService: NodeIKernelSearchService, + NodeIKernelCollectionService: NodeIKernelCollectionService; }; diff --git a/src/onebot/action/msg/DeleteMsg.ts b/src/onebot/action/msg/DeleteMsg.ts index 9dd84b0a..834a24bb 100644 --- a/src/onebot/action/msg/DeleteMsg.ts +++ b/src/onebot/action/msg/DeleteMsg.ts @@ -27,8 +27,7 @@ class DeleteMsg extends BaseAction { const NTQQMsgApi = this.core.apis.MsgApi; const msg = MessageUnique.getMsgIdAndPeerByShortId(Number(payload.message_id)); if (msg) { - const ret = this.core.eventWrapper.RegisterListen - ( + const ret = this.core.eventWrapper.registerListen( 'NodeIKernelMsgListener/onMsgInfoListUpdate', 1, 5000,