From 5073b1427cefc68b288bd971db4a93cb927a0a07 Mon Sep 17 00:00:00 2001 From: twlite <46562212+twlite@users.noreply.github.com> Date: Sat, 14 Jun 2025 13:24:39 +0545 Subject: [PATCH] refactor: update messageFilter to include commandkit parameter for improved filtering logic --- apps/test-bot/src/ai.ts | 5 ----- .../13-ai-powered-commands/01-introduction.mdx | 4 ++-- .../02-ai-configuration.mdx | 6 +++--- .../05-advanced-configuration.mdx | 8 ++++---- .../08-troubleshooting.mdx | 6 +++--- packages/ai/src/configure.ts | 17 +++++++++++++++-- packages/ai/src/plugin.ts | 4 +++- packages/ai/src/types.ts | 14 +++++--------- 8 files changed, 35 insertions(+), 29 deletions(-) diff --git a/apps/test-bot/src/ai.ts b/apps/test-bot/src/ai.ts index ad835237..12f79cb1 100644 --- a/apps/test-bot/src/ai.ts +++ b/apps/test-bot/src/ai.ts @@ -13,9 +13,4 @@ configureAI({ model, }; }, - messageFilter: async (message) => { - return ( - message.inGuild() && message.mentions.users.has(message.client.user.id) - ); - }, }); diff --git a/apps/website/docs/guide/13-ai-powered-commands/01-introduction.mdx b/apps/website/docs/guide/13-ai-powered-commands/01-introduction.mdx index 5a58e2da..4512e31e 100644 --- a/apps/website/docs/guide/13-ai-powered-commands/01-introduction.mdx +++ b/apps/website/docs/guide/13-ai-powered-commands/01-introduction.mdx @@ -127,7 +127,7 @@ message: 'Hey bot, can you play some music?'; ### 2. Message Filtering ```ts -messageFilter: async (message) => { +messageFilter: async (commandkit, message) => { return message.mentions.users.has(message.client.user.id); }; ``` @@ -176,7 +176,7 @@ await message.reply('🎵 Now playing music!'); ```ts configureAI({ selectAiModel: async () => ({ model: myModel }), - messageFilter: async (message) => + messageFilter: async (commandkit, message) => message.mentions.users.has(message.client.user.id), }); ``` diff --git a/apps/website/docs/guide/13-ai-powered-commands/02-ai-configuration.mdx b/apps/website/docs/guide/13-ai-powered-commands/02-ai-configuration.mdx index 99547e96..bddbd294 100644 --- a/apps/website/docs/guide/13-ai-powered-commands/02-ai-configuration.mdx +++ b/apps/website/docs/guide/13-ai-powered-commands/02-ai-configuration.mdx @@ -44,7 +44,7 @@ configureAI({ }, // Optional: Filter which messages trigger AI processing - messageFilter: async (message) => { + messageFilter: async (commandkit, message) => { // Only respond when the bot is mentioned return ( message.inGuild() && message.mentions.users.has(message.client.user.id) @@ -89,7 +89,7 @@ selectAiModel: async (ctx, message) => { Control which messages trigger AI processing: ```ts -messageFilter: async (message) => { +messageFilter: async (commandkit, message) => { // Only respond to mentions return message.mentions.users.has(message.client.user.id); @@ -236,7 +236,7 @@ configureAI({ }; }, - messageFilter: async (message) => { + messageFilter: async (commandkit, message) => { return message.mentions.users.has(message.client.user.id); }, }); diff --git a/apps/website/docs/guide/13-ai-powered-commands/05-advanced-configuration.mdx b/apps/website/docs/guide/13-ai-powered-commands/05-advanced-configuration.mdx index e9aaf071..db514f4e 100644 --- a/apps/website/docs/guide/13-ai-powered-commands/05-advanced-configuration.mdx +++ b/apps/website/docs/guide/13-ai-powered-commands/05-advanced-configuration.mdx @@ -26,7 +26,7 @@ configureAI({ }), // Optional: Filter which messages trigger AI processing - messageFilter: async (message) => { + messageFilter: async (commandkit, message) => { return message.mentions.users.has(message.client.user.id); }, @@ -130,7 +130,7 @@ selectAiModel: async (ctx, message) => ({ ### Basic Filtering ```ts -messageFilter: async (message) => { +messageFilter: async (commandkit, message) => { // Only respond to mentions return message.mentions.users.has(message.client.user.id); }; @@ -139,7 +139,7 @@ messageFilter: async (message) => { ### Advanced Filtering ```ts -messageFilter: async (message) => { +messageFilter: async (commandkit, message) => { // Don't process bot messages if (message.author.bot) return false; @@ -165,7 +165,7 @@ messageFilter: async (message) => { ### Role-based Filtering ```ts -messageFilter: async (message) => { +messageFilter: async (commandkit, message) => { if (!message.inGuild()) return false; const member = message.member; diff --git a/apps/website/docs/guide/13-ai-powered-commands/08-troubleshooting.mdx b/apps/website/docs/guide/13-ai-powered-commands/08-troubleshooting.mdx index 038af3f9..ef40c8ec 100644 --- a/apps/website/docs/guide/13-ai-powered-commands/08-troubleshooting.mdx +++ b/apps/website/docs/guide/13-ai-powered-commands/08-troubleshooting.mdx @@ -29,7 +29,7 @@ This guide covers common issues you might encounter when working with CommandKit ```ts // Check your message filter - messageFilter: async (message) => { + messageFilter: async (commandkit, message) => { console.log('Filtering message:', message.content); const shouldProcess = message.mentions.users.has(message.client.user.id); console.log('Should process:', shouldProcess); @@ -153,7 +153,7 @@ This guide covers common issues you might encounter when working with CommandKit ```ts const userCooldowns = new Map(); - messageFilter: async (message) => { + messageFilter: async (commandkit, message) => { const userId = message.author.id; const now = Date.now(); const cooldown = userCooldowns.get(userId) || 0; @@ -368,7 +368,7 @@ export const ai: AiCommand = async (ctx) => { ### Channel Access Issues ```ts -messageFilter: async (message) => { +messageFilter: async (commandkit, message) => { // Check if bot can send messages in the channel if (!message.channel.isSendable()) { console.log('Cannot send messages in channel:', message.channelId); diff --git a/packages/ai/src/configure.ts b/packages/ai/src/configure.ts index 26449275..7748ec0e 100644 --- a/packages/ai/src/configure.ts +++ b/packages/ai/src/configure.ts @@ -65,8 +65,21 @@ export interface ConfigureAI { const AIConfig: Required = { disableBuiltInTools: false, - messageFilter: async (message) => - message.mentions.users.has(message.client.user.id), + messageFilter: async (commandkit, message) => { + const prefixOrPrefixes = + await commandkit.config.getMessageCommandPrefix(message); + + const prefixes = Array.isArray(prefixOrPrefixes) + ? prefixOrPrefixes + : [prefixOrPrefixes]; + + const possiblyCommand = prefixes.some((p) => message.content.startsWith(p)); + + // TODO: figure out a workaround for mention prefixes + return ( + !possiblyCommand && message.mentions.users.has(message.client.user.id) + ); + }, prepareSystemPrompt: async (_ctx, message) => createSystemPrompt(message), preparePrompt: async (_ctx, message) => { const recentMessages = await message.channel.messages.fetch({ diff --git a/packages/ai/src/plugin.ts b/packages/ai/src/plugin.ts index f76bb07e..16365927 100644 --- a/packages/ai/src/plugin.ts +++ b/packages/ai/src/plugin.ts @@ -85,7 +85,9 @@ export class AiPlugin extends RuntimePlugin { if (!message.channel.isTextBased() || !message.channel.isSendable()) return; - const shouldContinue = messageFilter ? await messageFilter(message) : true; + const shouldContinue = messageFilter + ? await messageFilter(commandkit, message) + : true; if (!shouldContinue) return; const ctx = new AiContext({ diff --git a/packages/ai/src/types.ts b/packages/ai/src/types.ts index 6db39f12..d928db51 100644 --- a/packages/ai/src/types.ts +++ b/packages/ai/src/types.ts @@ -1,7 +1,7 @@ import { Tool, type generateText } from 'ai'; import { Message } from 'discord.js'; import { AiContext } from './context'; -import { LoadedCommand, MessageCommandContext } from 'commandkit'; +import CommandKit, { LoadedCommand, MessageCommandContext } from 'commandkit'; import { AiConfig } from './plugin'; import { InferParameters } from './tools/common'; @@ -10,19 +10,15 @@ import { InferParameters } from './tools/common'; */ export type AIGenerateResult = Awaited>; -/** - * Function type for filtering commands based on their name. - * @param commandName - The name of the command to filter. - * @returns A boolean indicating whether the command should be included in the filter. - */ -export type CommandFilterFunction = (commandName: string) => boolean; - /** * Function type for filtering messages before they are processed by the AI. * @param message - The message to filter. * @returns A promise that resolves to a boolean indicating whether the message should be processed. */ -export type MessageFilter = (message: Message) => Promise; +export type MessageFilter = ( + commandkit: CommandKit, + message: Message, +) => Promise; /** * Function type for selecting an AI model based on the message.