diff --git a/src/bot.ts b/src/bot.ts index 323948d..194aa1f 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,5 +1,4 @@ import { - BaseInteraction, CacheType, Client, GatewayIntentBits, @@ -12,6 +11,13 @@ import { import { Logger } from './utils/log'; import { config } from './utils/config'; +type BotEventListeners = { + 'messageCreate': (message: Message) => void; + 'interactionCreate': (interaction: Interaction) => void; + 'voiceStateUpdate': (oldState: VoiceState, newState: VoiceState) => void; +}; +type BotEventListener = BotEventListeners[K]; + export class Bot { private client: Client | undefined; @@ -20,6 +26,66 @@ export class Bot { private readonly log: Logger; + private eventListeners: { + [K in keyof BotEventListeners]?: BotEventListener[]; + } = {}; + + /* + event methods + */ + public on( + event: K, + listener: BotEventListener + ): void { + if (!this.eventListeners[event]) { + this.eventListeners[event] = []; + } + (this.eventListeners[event] as BotEventListener[]).push(listener); + } + + public off( + event: K, + listener: BotEventListener + ): boolean { + const listeners = this.eventListeners[event]; + if (!listeners) return false; + + const index = (listeners as BotEventListener[]).indexOf(listener); + if (index > -1) { + (listeners as BotEventListener[]).splice(index, 1); + return true; + } + return false; + } + + public once( + event: K, + listener: BotEventListener + ): void { + const onceWrapper = ((...args: Parameters>) => { + this.off(event, onceWrapper as BotEventListener); + (listener as (...args: unknown[]) => void)(...args); + }) as BotEventListener; + + this.on(event, onceWrapper); + } + + private emit( + event: K, + ...args: Parameters> + ): void { + const listeners = this.eventListeners[event]; + if (listeners) { + for (const listener of listeners as BotEventListener[]) { + try { + (listener as (...args: unknown[]) => void)(...args); + } catch (error) { + this.log.error(`Error in event listener for ${String(event)}:`, error); + } + } + } + } + /* class methods */ @@ -100,16 +166,20 @@ export class Bot { error.stack ); } - private async onInteraction(interaction: BaseInteraction): Promise { + /* + public event listeners + */ + private async onInteraction(interaction: Interaction): Promise { + this.emit('interactionCreate', interaction); } - private async onMessage(message: Message): Promise { - + private async onMessage(message: Message): Promise { + this.emit('messageCreate', message); } private async onVoiceStateUpdate(oldState: VoiceState, newState: VoiceState): Promise { - + this.emit('voiceStateUpdate', oldState, newState); } /*