diff --git a/src/client/collectors.ts b/src/client/collectors.ts index 7ed18a3..5313aa7 100644 --- a/src/client/collectors.ts +++ b/src/client/collectors.ts @@ -8,6 +8,10 @@ import type { UsingClient } from '../commands'; export type AllClientEvents = CustomEventsKeys | GatewayEvents; export type ParseClientEventName = T extends CustomEventsKeys ? T : CamelCase; +export type CollectorRunPameters = Awaited< + Parameters]>[0] +>; + type RunData = { options: { event: T; @@ -15,16 +19,9 @@ type RunData = { timeout?: number; onStop?: (reason: string) => unknown; onStopError?: (reason: string, error: unknown) => unknown; - filter: (arg: Awaited]>[0]>) => Awaitable; - run: ( - arg: Awaited]>[0]>, - stop: (reason?: string) => void, - ) => unknown; - onRunError?: ( - arg: Awaited]>[0]>, - error: unknown, - stop: (reason?: string) => void, - ) => unknown; + filter: (arg: CollectorRunPameters) => Awaitable; + run: (arg: CollectorRunPameters, stop: (reason?: string) => void) => unknown; + onRunError?: (arg: CollectorRunPameters, error: unknown, stop: (reason?: string) => void) => unknown; }; idle?: NodeJS.Timeout; timeout?: NodeJS.Timeout; diff --git a/src/events/handler.ts b/src/events/handler.ts index ed07f6b..f0d9e0e 100644 --- a/src/events/handler.ts +++ b/src/events/handler.ts @@ -18,17 +18,32 @@ import type { ClientEvents } from '../events/hooks'; import * as RawEvents from '../events/hooks'; import type { ClientEvent, CustomEvents, CustomEventsKeys, ClientNameEvents, EventContext } from './event'; import type { FileLoaded } from '../commands/handler'; +import type { UsingClient } from '../commands'; export type EventValue = MakeRequired & { fired?: boolean }; export type GatewayEvents = Uppercase>; -type ResolveEventParams = T extends CustomEventsKeys - ? Parameters - : EventContext<{ data: { name: CamelCase } }>; +export type ResolveEventParams = + T extends CustomEventsKeys + ? [...Parameters, UsingClient] + : T extends GatewayEvents + ? EventContext<{ data: { name: CamelCase } }> + : T extends ClientNameEvents + ? EventContext<{ data: { name: T } }> + : never; + +export type ResolveEventRunParams = + T extends CustomEventsKeys + ? Parameters + : T extends GatewayEvents + ? EventContext<{ data: { name: CamelCase } }> + : T extends ClientNameEvents + ? EventContext<{ data: { name: T } }> + : never; export type EventValues = { [K in CustomEventsKeys | GatewayEvents]: Omit & { - run(...args: ResolveEventParams): any; + run(...args: ResolveEventRunParams): any; }; }; @@ -157,16 +172,16 @@ export class EventHandler extends BaseHandler { } } - async runCustom(name: T, ...args: EventValues[T]) { + async runCustom(name: T, ...args: ResolveEventRunParams) { const Event = this.values[name]; if (!Event) { // @ts-expect-error working with non-existent types is hard - return this.client.collectors.run(name, ...args, this.client); + return this.client.collectors.run(name, args, this.client); } try { if (Event.data.once && Event.fired) { // @ts-expect-error working with non-existent types is hard - return this.client.collectors.run(name, ...args, this.client); + return this.client.collectors.run(name, args, this.client); } Event.fired = true; this.logger.debug(`executed a custom event [${name}]`, Event.data.once ? 'once' : ''); @@ -175,7 +190,7 @@ export class EventHandler extends BaseHandler { // @ts-expect-error working with non-existent types is hard Event.run(...args, this.client), // @ts-expect-error working with non-existent types is hard - this.client.collectors.run(name, ...args, this.client), + this.client.collectors.run(name, args, this.client), ]); } catch (e) { await this.onFail(name, e); diff --git a/src/index.ts b/src/index.ts index 30b8213..61cba94 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ import { type RuntimeConfig, type RuntimeConfigHTTP, } from './client/base'; -import type { CustomEventsKeys, ClientNameEvents, EventContext } from './events'; +import type { CustomEventsKeys, ClientNameEvents, ResolveEventParams } from './events'; import { isCloudfareWorker } from './common'; export { Logger, PermissionStrings, Formatter } from './common'; // @@ -44,7 +44,7 @@ export * from './client'; */ export function createEvent(data: { data: { name: E; once?: boolean }; - run: (...args: EventContext<{ data: { name: E } }>) => any; + run: (...args: ResolveEventParams) => any; }) { data.data.once ??= false; return data;