From 190ffa5d75aed374fbdaf34e79a520241e31ead7 Mon Sep 17 00:00:00 2001 From: twlite <46562212+twlite@users.noreply.github.com> Date: Thu, 18 Sep 2025 09:18:13 +0545 Subject: [PATCH] feat: regex prefix --- packages/ai/src/configure.ts | 14 ++++++++++---- .../src/app/commands/MessageCommandParser.ts | 9 +++++++-- .../src/app/handlers/AppCommandHandler.ts | 13 +++++++++++-- packages/commandkit/src/commandkit.ts | 6 ++++-- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/packages/ai/src/configure.ts b/packages/ai/src/configure.ts index 533b1b57..a276363d 100644 --- a/packages/ai/src/configure.ts +++ b/packages/ai/src/configure.ts @@ -69,11 +69,17 @@ const AIConfig: Required = { const prefixOrPrefixes = await commandkit.appConfig.getMessageCommandPrefix(message); - const prefixes = Array.isArray(prefixOrPrefixes) - ? prefixOrPrefixes - : [prefixOrPrefixes]; + const prefixes = + prefixOrPrefixes instanceof RegExp + ? prefixOrPrefixes + : Array.isArray(prefixOrPrefixes) + ? prefixOrPrefixes + : [prefixOrPrefixes]; - const possiblyCommand = prefixes.some((p) => message.content.startsWith(p)); + const possiblyCommand = + prefixes instanceof RegExp + ? prefixes.test(message.content) + : prefixes.some((p) => message.content.startsWith(p)); // TODO: figure out a workaround for mention prefixes return ( diff --git a/packages/commandkit/src/app/commands/MessageCommandParser.ts b/packages/commandkit/src/app/commands/MessageCommandParser.ts index 181a33d8..6cef5cdd 100644 --- a/packages/commandkit/src/app/commands/MessageCommandParser.ts +++ b/packages/commandkit/src/app/commands/MessageCommandParser.ts @@ -56,12 +56,12 @@ export class MessageCommandParser { /** * Creates a new message command parser. * @param message - The Discord message to parse - * @param prefix - Array of valid command prefixes + * @param prefix - Array of valid command prefixes or a regular expression * @param schema - Function that returns the options schema for a command */ public constructor( public message: Message, - private prefix: string[], + private prefix: string[] | RegExp, private schema: (command: string) => MessageCommandOptionsSchema, ) {} @@ -123,6 +123,11 @@ export class MessageCommandParser { * @returns The matched prefix or undefined */ public getPrefix() { + if (this.prefix instanceof RegExp) { + const match = this.message.content.match(this.prefix); + return match?.[0]; + } + for (const p of this.prefix) { if (this.message.content.startsWith(p)) { return p; diff --git a/packages/commandkit/src/app/handlers/AppCommandHandler.ts b/packages/commandkit/src/app/handlers/AppCommandHandler.ts index 6afe51f1..f225acd0 100644 --- a/packages/commandkit/src/app/handlers/AppCommandHandler.ts +++ b/packages/commandkit/src/app/handlers/AppCommandHandler.ts @@ -450,11 +450,20 @@ export class AppCommandHandler { const prefix = await this.commandkit.appConfig.getMessageCommandPrefix(source); - if (!prefix || !prefix.length) return null; + if ( + !prefix || + ((typeof prefix === 'string' || Array.isArray(prefix)) && + !prefix.length) + ) + return null; parser = new MessageCommandParser( source, - Array.isArray(prefix) ? prefix : [prefix], + prefix instanceof RegExp + ? prefix + : Array.isArray(prefix) + ? prefix + : [prefix], (command: string) => { // Find the command by name const loadedCommand = this.findCommandByName(command); diff --git a/packages/commandkit/src/commandkit.ts b/packages/commandkit/src/commandkit.ts index bc747805..cb322aa1 100644 --- a/packages/commandkit/src/commandkit.ts +++ b/packages/commandkit/src/commandkit.ts @@ -39,7 +39,9 @@ export interface CommandKitConfiguration { * @param message The message to get the command prefix for. * @returns The command prefix or an array of prefixes. */ - getMessageCommandPrefix: (message: Message) => Awaitable; + getMessageCommandPrefix: ( + message: Message, + ) => Awaitable; } /** @@ -321,7 +323,7 @@ export class CommandKit extends EventEmitter { * @param resolver The resolver function. */ setPrefixResolver( - resolver: (message: Message) => Awaitable, + resolver: (message: Message) => Awaitable, ) { this.appConfig.getMessageCommandPrefix = resolver; return this;