mirror of
https://github.com/NapNeko/NapCatQQ.git
synced 2025-07-19 12:03:37 +00:00
refactor:NTEvent
This commit is contained in:
@@ -1,99 +1,144 @@
|
|||||||
|
import { NodeIQQNTWrapperSession } from "@/core/wrapper";
|
||||||
import { randomUUID } from "crypto";
|
import { randomUUID } from "crypto";
|
||||||
export enum NTEventMode {
|
// export enum NTEventMode {
|
||||||
Once = 1,
|
// Once = 1,
|
||||||
Twice = 2
|
// Twice = 2
|
||||||
}
|
// }
|
||||||
export interface NTEventType<U extends (...args: any[]) => any> {
|
// export interface NTEventType<U extends (...args: any[]) => Promise<any>> {
|
||||||
EventName: string,
|
// EventName: string,
|
||||||
EventFunction: U,
|
// EventFunction: U,
|
||||||
ListenerName: string,
|
// ListenerName: string,
|
||||||
ListenerFunction: Function
|
// ListenerFunction: Function
|
||||||
}
|
// }
|
||||||
interface Internal_MapKey {
|
// interface Internal_MapKey {
|
||||||
mode: NTEventMode,
|
// mode: NTEventMode,
|
||||||
timeout: number,
|
// timeout: number,
|
||||||
createtime: number,
|
// createtime: number,
|
||||||
func: Function
|
// func: Function
|
||||||
}
|
// }
|
||||||
export class NTEvent<T extends (...args: any[]) => any, R = any> {
|
// export class NTEvent<T extends (...args: any[]) => any, R = any> {
|
||||||
EventData: NTEventType<T>;
|
// EventData: NTEventType<T>;
|
||||||
EventTask: Map<string, Internal_MapKey> = new Map<string, Internal_MapKey>();
|
// EventTask: Map<string, Internal_MapKey> = new Map<string, Internal_MapKey>();
|
||||||
constructor(params: NTEventType<T>) {
|
// constructor(params: NTEventType<T>) {
|
||||||
params.ListenerFunction = this.DispatcherListener.bind(this);
|
// params.ListenerFunction = this.DispatcherListener.bind(this);
|
||||||
this.EventData = params;
|
// this.EventData = params;
|
||||||
this.EventData.EventFunction = params.EventFunction.bind(this) as any;
|
// this.EventData.EventFunction = params.EventFunction.bind(this) as any;
|
||||||
}
|
// }
|
||||||
async DispatcherListener(...args: any[]) {
|
// async DispatcherListener(...args: any[]) {
|
||||||
console.log(...args);
|
// console.log(...args);
|
||||||
this.EventTask.forEach((task, uuid) => {
|
// this.EventTask.forEach((task, uuid) => {
|
||||||
if (task.createtime + task.timeout > Date.now()) {
|
// if (task.createtime + task.timeout > Date.now()) {
|
||||||
this.EventTask.delete(uuid);
|
// this.EventTask.delete(uuid);
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
task.func(...args);
|
// task.func(...args);
|
||||||
})
|
// })
|
||||||
}
|
// }
|
||||||
async CallTwiceEvent(timeout: number = 3000, ...args: Parameters<T>) {
|
// async CallTwiceEvent(timeout: number = 3000, ...args: Parameters<T>) {
|
||||||
return new Promise<R>((resolve, reject) => {
|
// return new Promise<R>((resolve, reject) => {
|
||||||
const id = randomUUID();
|
// const id = randomUUID();
|
||||||
let complete = 0;
|
// let complete = 0;
|
||||||
let retData: R | undefined = undefined;
|
// let retData: R | undefined = undefined;
|
||||||
let databack = () => {
|
// let databack = () => {
|
||||||
if (!complete) {
|
// if (!complete) {
|
||||||
this.EventTask.delete(id);
|
// this.EventTask.delete(id);
|
||||||
reject(new Error('NTEvent EventName:' + this.EventData.EventName + ' EventListener:' + this.EventData.ListenerName + ' timeout'));
|
// reject(new Error('NTEvent EventName:' + this.EventData.EventName + ' EventListener:' + this.EventData.ListenerName + ' timeout'));
|
||||||
} else {
|
// } else {
|
||||||
resolve(retData as R);
|
// resolve(retData as R);
|
||||||
}
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// let Timeouter = setTimeout(databack, timeout);
|
||||||
|
|
||||||
|
// this.EventTask.set(id, {
|
||||||
|
// mode: NTEventMode.Once,
|
||||||
|
// timeout: timeout,
|
||||||
|
// createtime: Date.now(),
|
||||||
|
// func: (...args: any[]) => {
|
||||||
|
// complete++;
|
||||||
|
// retData = args as R;
|
||||||
|
// if (complete == 2) {
|
||||||
|
// clearTimeout(Timeouter);
|
||||||
|
// databack();
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// this.EventData.EventFunction(...args);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// async CallOnceEvent(timeout: number = 3000, ...args: Parameters<T>) {
|
||||||
|
// return new Promise<R>((resolve, reject) => {
|
||||||
|
// const id = randomUUID();
|
||||||
|
// let complete = false;
|
||||||
|
// let retData: R | undefined = undefined;
|
||||||
|
// let databack = () => {
|
||||||
|
// if (!complete) {
|
||||||
|
// this.EventTask.delete(id);
|
||||||
|
// reject(new Error('NTEvent EventName:' + this.EventData.EventName + ' EventListener:' + this.EventData.ListenerName + ' timeout'));
|
||||||
|
// } else {
|
||||||
|
// resolve(retData as R);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// let Timeouter = setTimeout(databack, timeout);
|
||||||
|
|
||||||
|
// this.EventTask.set(id, {
|
||||||
|
// mode: NTEventMode.Once,
|
||||||
|
// timeout: timeout,
|
||||||
|
// createtime: Date.now(),
|
||||||
|
// func: (...args: any[]) => {
|
||||||
|
// clearTimeout(Timeouter);
|
||||||
|
// complete = true;
|
||||||
|
// retData = args as R;
|
||||||
|
// databack();
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// this.EventData.EventFunction(...args);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
export class ListenerClassBase {
|
||||||
|
[key: string]: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
let Timeouter = setTimeout(databack, timeout);
|
export class NTEventWrapper {
|
||||||
|
private ListenerMap: Map<string, typeof ListenerClassBase>;
|
||||||
|
private WrapperSession: NodeIQQNTWrapperSession;
|
||||||
|
private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>();
|
||||||
|
constructor({ ListenerMap, WrapperSession }: { ListenerMap: Map<string, typeof ListenerClassBase>, WrapperSession: NodeIQQNTWrapperSession }) {
|
||||||
|
this.ListenerMap = ListenerMap;
|
||||||
|
this.WrapperSession = WrapperSession;
|
||||||
|
}
|
||||||
|
GetEvent<T extends (...args: any) => any>(eventName: string) {
|
||||||
|
// 将 eventName 'NodeIKernelProfileLikeService/GetTest' => 转换成 this.WrapperSession.getProfileLikeService().getTest
|
||||||
|
let eventNameArr = eventName.split('/');
|
||||||
|
type eventType = {
|
||||||
|
[key: string]: () => { [key: string]: (...params: Parameters<T>) => Promise<ReturnType<T>> }
|
||||||
|
}
|
||||||
|
if (eventNameArr.length > 1) {
|
||||||
|
let serviceName = 'get' + eventNameArr[0].replace('NodeIKernel', '');
|
||||||
|
let eventName = eventNameArr[1];
|
||||||
|
let services = (this.WrapperSession as unknown as eventType)[serviceName]();
|
||||||
|
let event = services[eventName];
|
||||||
|
//重新绑定this
|
||||||
|
event = event.bind(services);
|
||||||
|
if (event) {
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
|
||||||
this.EventTask.set(id, {
|
|
||||||
mode: NTEventMode.Once,
|
|
||||||
timeout: timeout,
|
|
||||||
createtime: Date.now(),
|
|
||||||
func: (...args: any[]) => {
|
|
||||||
complete++;
|
|
||||||
retData = args as R;
|
|
||||||
if (complete == 2) {
|
|
||||||
clearTimeout(Timeouter);
|
|
||||||
databack();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.EventData.EventFunction(...args);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async CallOnceEvent(timeout: number = 3000, ...args: Parameters<T>) {
|
}
|
||||||
return new Promise<R>((resolve, reject) => {
|
// 获取某个Listener
|
||||||
const id = randomUUID();
|
GetListener(listenerName: string, uniqueCode: string = "") {
|
||||||
let complete = false;
|
let ListenerType = this.ListenerMap.get(listenerName);
|
||||||
let retData: R | undefined = undefined;
|
let Listener = this.ListenerManger.get(listenerName + uniqueCode);
|
||||||
let databack = () => {
|
if (!Listener && ListenerType) {
|
||||||
if (!complete) {
|
Listener = new ListenerType();
|
||||||
this.EventTask.delete(id);
|
this.ListenerManger.set(listenerName + uniqueCode, Listener);
|
||||||
reject(new Error('NTEvent EventName:' + this.EventData.EventName + ' EventListener:' + this.EventData.ListenerName + ' timeout'));
|
}
|
||||||
} else {
|
return Listener;
|
||||||
resolve(retData as R);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let Timeouter = setTimeout(databack, timeout);
|
|
||||||
|
|
||||||
this.EventTask.set(id, {
|
|
||||||
mode: NTEventMode.Once,
|
|
||||||
timeout: timeout,
|
|
||||||
createtime: Date.now(),
|
|
||||||
func: (...args: any[]) => {
|
|
||||||
clearTimeout(Timeouter);
|
|
||||||
complete = true;
|
|
||||||
retData = args as R;
|
|
||||||
databack();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.EventData.EventFunction(...args);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user