diff --git a/packages/gil/lib/GilClient.ts b/packages/gil/lib/GilClient.ts index 46b9976f..eb8f803e 100644 --- a/packages/gil/lib/GilClient.ts +++ b/packages/gil/lib/GilClient.ts @@ -8,11 +8,17 @@ import { GilEvents } from "./events"; import { CommandManager } from "./structures/Command"; import { ListenerManager } from "./structures/ListenerManager"; import { TaskManager } from "./structures/Task"; +import { CommandCustomContextFn, CommandErrorHandler } from "./types"; interface GilClientOptions { token: string; clientOptions?: ClientOptions; - customCommandContext?: (data: { serverId: string; authorId: string; messageId: string }) => Promise>; + contexts?: { + command: CommandCustomContextFn; + }; + errorHandler?: { + command: CommandErrorHandler; + }; // adapters loggingAdapter?: LoggerAdapter; databaseAdapter: DatabaseAdapter; diff --git a/packages/gil/lib/events.ts b/packages/gil/lib/events.ts index d638f6ab..490e6fa6 100644 --- a/packages/gil/lib/events.ts +++ b/packages/gil/lib/events.ts @@ -1,5 +1,6 @@ import { Member, Message } from "guilded.js"; import { StoredServer } from "./adapters/db/DatabaseAdapter"; +import { Command } from "./structures/Command"; export interface NonCommandMessageParams { message: Message; @@ -14,7 +15,15 @@ export interface CommandMessageParams { prefix: string; } +export interface CommandRanParams { + message: Message; + member: Member; + server: StoredServer; + command: Command; +} + export type GilEvents = { nonCommandMessage(params: NonCommandMessageParams): unknown; commandMessage(params: CommandMessageParams): unknown; + commandRan(params: CommandRanParams): unknown; }; diff --git a/packages/gil/lib/index.ts b/packages/gil/lib/index.ts index 66d373ad..dead4dbd 100644 --- a/packages/gil/lib/index.ts +++ b/packages/gil/lib/index.ts @@ -11,3 +11,4 @@ export * from "./adapters/db/PostgresAdapter"; export * from "./adapters/db/BetterSQLite3Adapter"; // export * from "./adapters/logging/WinstonAdapter"; export * from "./adapters/logging/PinoAdapter"; +export * from "./types"; diff --git a/packages/gil/lib/listeners/CommandMessageListener.ts b/packages/gil/lib/listeners/CommandMessageListener.ts index 953843fa..f658be59 100644 --- a/packages/gil/lib/listeners/CommandMessageListener.ts +++ b/packages/gil/lib/listeners/CommandMessageListener.ts @@ -73,14 +73,20 @@ export default class CommandMessageListener extends Listener { return; } - const context = this.gil.options.customCommandContext - ? await this.gil.options.customCommandContext({ - serverId: params.server.server_id, - authorId: params.member.id, - messageId: params.message.id, + const context = this.gil.options?.contexts?.command + ? await this.gil.options.contexts.command({ + server: params.server, + message: params.message, }) : {}; + this.gil.emitter.emit("commandRan", { + message: params.message, + member: params.member, + server: params.server, + command, + }); + try { await command.execute({ message: params.message, @@ -92,6 +98,12 @@ export default class CommandMessageListener extends Listener { this.gil.logger.error(e as Error); this.gil.logger.warn(`Error executing command ${name}`, params.message.id); + this.gil.options.errorHandler?.command?.(e as Error, { + message: params.message, + member: params.member, + server: params.server, + command, + }); } } diff --git a/packages/gil/lib/types.ts b/packages/gil/lib/types.ts new file mode 100644 index 00000000..15022940 --- /dev/null +++ b/packages/gil/lib/types.ts @@ -0,0 +1,6 @@ +import type { Member, Message } from "guilded.js"; +import type { StoredServer } from "./adapters/db/DatabaseAdapter"; +import type { Command } from "./structures/Command"; + +export type CommandCustomContextFn = (data: { server: StoredServer; message: Message }) => Promise>; +export type CommandErrorHandler = (error: Error, additionalDetails: { message: Message; member: Member; server: StoredServer; command: Command }) => void;