feat: add registerable events

This commit is contained in:
2026-01-10 09:26:40 -03:00
parent 88305e5c8b
commit 710de16af1
+75 -5
View File
@@ -1,5 +1,4 @@
import { import {
BaseInteraction,
CacheType, CacheType,
Client, Client,
GatewayIntentBits, GatewayIntentBits,
@@ -12,6 +11,13 @@ import {
import { Logger } from './utils/log'; import { Logger } from './utils/log';
import { config } from './utils/config'; import { config } from './utils/config';
type BotEventListeners = {
'messageCreate': (message: Message) => void;
'interactionCreate': (interaction: Interaction) => void;
'voiceStateUpdate': (oldState: VoiceState, newState: VoiceState) => void;
};
type BotEventListener<K extends keyof BotEventListeners> = BotEventListeners[K];
export class Bot { export class Bot {
private client: Client | undefined; private client: Client | undefined;
@@ -20,6 +26,66 @@ export class Bot {
private readonly log: Logger; private readonly log: Logger;
private eventListeners: {
[K in keyof BotEventListeners]?: BotEventListener<K>[];
} = {};
/*
event methods
*/
public on<K extends keyof BotEventListeners>(
event: K,
listener: BotEventListener<K>
): void {
if (!this.eventListeners[event]) {
this.eventListeners[event] = [];
}
(this.eventListeners[event] as BotEventListener<K>[]).push(listener);
}
public off<K extends keyof BotEventListeners>(
event: K,
listener: BotEventListener<K>
): boolean {
const listeners = this.eventListeners[event];
if (!listeners) return false;
const index = (listeners as BotEventListener<K>[]).indexOf(listener);
if (index > -1) {
(listeners as BotEventListener<K>[]).splice(index, 1);
return true;
}
return false;
}
public once<K extends keyof BotEventListeners>(
event: K,
listener: BotEventListener<K>
): void {
const onceWrapper = ((...args: Parameters<BotEventListener<K>>) => {
this.off(event, onceWrapper as BotEventListener<K>);
(listener as (...args: unknown[]) => void)(...args);
}) as BotEventListener<K>;
this.on(event, onceWrapper);
}
private emit<K extends keyof BotEventListeners>(
event: K,
...args: Parameters<BotEventListener<K>>
): void {
const listeners = this.eventListeners[event];
if (listeners) {
for (const listener of listeners as BotEventListener<K>[]) {
try {
(listener as (...args: unknown[]) => void)(...args);
} catch (error) {
this.log.error(`Error in event listener for ${String(event)}:`, error);
}
}
}
}
/* /*
class methods class methods
*/ */
@@ -100,16 +166,20 @@ export class Bot {
error.stack error.stack
); );
} }
private async onInteraction(interaction: BaseInteraction): Promise<void> {
/*
public event listeners
*/
private async onInteraction(interaction: Interaction): Promise<void> {
this.emit('interactionCreate', interaction);
} }
private async onMessage(message: Message<boolean>): Promise<void> { private async onMessage(message: Message): Promise<void> {
this.emit('messageCreate', message);
} }
private async onVoiceStateUpdate(oldState: VoiceState, newState: VoiceState): Promise<void> { private async onVoiceStateUpdate(oldState: VoiceState, newState: VoiceState): Promise<void> {
this.emit('voiceStateUpdate', oldState, newState);
} }
/* /*