diff --git a/src/events/handler.ts b/src/events/handler.ts index e8a207d..ed07f6b 100644 --- a/src/events/handler.ts +++ b/src/events/handler.ts @@ -7,6 +7,7 @@ import type { import type { Client, WorkerClient } from '../client'; import { BaseHandler, + type CamelCase, ReplaceRegex, isCloudfareWorker, magicImport, @@ -15,13 +16,22 @@ import { } from '../common'; import type { ClientEvents } from '../events/hooks'; import * as RawEvents from '../events/hooks'; -import type { ClientEvent, CustomEvents, CustomEventsKeys, ClientNameEvents } from './event'; +import type { ClientEvent, CustomEvents, CustomEventsKeys, ClientNameEvents, EventContext } from './event'; import type { FileLoaded } from '../commands/handler'; export type EventValue = MakeRequired & { fired?: boolean }; - export type GatewayEvents = Uppercase>; +type ResolveEventParams = T extends CustomEventsKeys + ? Parameters + : EventContext<{ data: { name: CamelCase } }>; + +export type EventValues = { + [K in CustomEventsKeys | GatewayEvents]: Omit & { + run(...args: ResolveEventParams): any; + }; +}; + export class EventHandler extends BaseHandler { constructor(protected client: Client | WorkerClient) { super(client.logger); @@ -31,7 +41,7 @@ export class EventHandler extends BaseHandler { this.logger.warn('.events.onFail', err, event); protected filter = (path: string) => path.endsWith('.js') || (!path.endsWith('.d.ts') && path.endsWith('.ts')); - values: Partial> = {}; + values: Partial = {}; discordEvents = Object.keys(RawEvents).map(x => ReplaceRegex.camel(x.toLowerCase())) as ClientNameEvents[]; @@ -147,18 +157,26 @@ export class EventHandler extends BaseHandler { } } - async runCustom(name: T, ...args: Parameters) { + async runCustom(name: T, ...args: EventValues[T]) { const Event = this.values[name]; if (!Event) { - return this.client.collectors.run(name, args as never, this.client); + // @ts-expect-error working with non-existent types is hard + return this.client.collectors.run(name, ...args, this.client); } try { if (Event.data.once && Event.fired) { - return this.client.collectors.run(name, args as never, this.client); + // @ts-expect-error working with non-existent types is hard + return this.client.collectors.run(name, ...args, this.client); } Event.fired = true; this.logger.debug(`executed a custom event [${name}]`, Event.data.once ? 'once' : ''); - await Promise.all([Event.run(args, this.client), this.client.collectors.run(name, args as never, this.client)]); + + await Promise.all([ + // @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), + ]); } catch (e) { await this.onFail(name, e); }