# Events ## EventBuilder Creates an event handler. ```typescript EventBuilder.create(event: T, name?: string): EventBuilder new EventBuilder(config: EventConfig): EventBuilder ``` ### EventConfig ```typescript interface EventConfig { event: T; name?: string; enabled?: boolean; once?: boolean; priority?: number; conditions?: Array<(...args: EventParameters) => boolean>; metadata?: EventMetadata; deployment?: EventDeployment; rateLimit?: EventRateLimitOptions; beforeExecute?: (...args: EventParameters) => any; execute?: (...args: EventParameters) => any; afterExecute?: (result: any, ...args: EventParameters) => any; onError?: (error: Error, ...args: EventParameters) => any; } ``` ### EventMetadata ```typescript interface EventMetadata { category?: string; tags?: string[]; } ``` ### EventDeployment ```typescript interface EventDeployment { environments?: ("development" | "production")[]; } ``` ### EventRateLimitOptions ```typescript interface EventRateLimitOptions { max: number; interval: number; onRateLimit?: (...args: EventParameters) => any; } ``` ### EventParameters ```typescript type EventParameters = [client: Vimcord, ...args: ClientEvents[T]]; ``` --- ## EventBuilder Methods ```typescript // Configuration builder.setEnabled(enabled: boolean): this builder.setExecute(execute: (...args: EventParameters) => any): this // Validation & Conversion builder.validate(): void builder.clone(): EventBuilder builder.toConfig(): EventConfig // Execution builder.isRateLimited(updateExecutions?: boolean): boolean builder.checkConditions(...args: EventParameters): Promise builder.executeEvent(...args: EventParameters): Promise ``` --- ## EventManager Manages event handlers. ```typescript client.events: EventManager ``` ### Methods ```typescript // Register/unregister client.events.register(...events: EventBuilder[]): void client.events.unregister(...names: string[]): void client.events.clear(): void // Lookup client.events.get(name: string): EventBuilder | undefined client.events.getByTag(tag: string): EventBuilder[] client.events.getByCategory(category: string): EventBuilder[] client.events.getByEvent(eventType: T): EventBuilder[] // Execute client.events.executeEvents(eventType: T, ...args: ClientEvents[T]): Promise ``` --- ## Event Importing Vimcord automatically imports events from directories when configured: ```typescript defineVimcordFeatures({ importModules: { events: "./events" } }); ``` ### File Naming Events should be named with the `.event` suffix by default: ``` src/events/ ├── ready.event.ts ├── messageCreate.event.ts └── interactionCreate.event.ts ``` --- ## Quick Event Examples ### Simple Event ```typescript import { EventBuilder } from "vimcord"; export default EventBuilder.create("messageCreate", "Message Logger").setExecute(async (client, message) => { if (message.author.bot) return; console.log(`[${message.guild?.name}] ${message.author.tag}: ${message.content}`); }); ``` ### Event with Conditions ```typescript import { EventBuilder } from "vimcord"; export default new EventBuilder({ event: "messageCreate", name: "Staff Only", conditions: [(client, message) => message.member?.permissions.has("Administrator") ?? false], metadata: { category: "Moderation" }, execute: async (client, message) => { // Handle staff messages } }); ``` ### Once Event ```typescript import { EventBuilder } from "vimcord"; export default new EventBuilder({ event: "ready", name: "Startup", once: true, execute: async client => { console.log(`Logged in as ${client.user?.tag}`); } }); ```