Skip to content

Commit 6b2438d

Browse files
authored
Merge pull request #249 from underctrl-io/fix-ai
refactor: update messageFilter to include commandkit parameter for improved filtering logic
2 parents e14978f + 5073b14 commit 6b2438d

File tree

8 files changed

+35
-29
lines changed

8 files changed

+35
-29
lines changed

apps/test-bot/src/ai.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,4 @@ configureAI({
1313
model,
1414
};
1515
},
16-
messageFilter: async (message) => {
17-
return (
18-
message.inGuild() && message.mentions.users.has(message.client.user.id)
19-
);
20-
},
2116
});

apps/website/docs/guide/13-ai-powered-commands/01-introduction.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ message: 'Hey bot, can you play some music?';
127127
### 2. Message Filtering
128128

129129
```ts
130-
messageFilter: async (message) => {
130+
messageFilter: async (commandkit, message) => {
131131
return message.mentions.users.has(message.client.user.id);
132132
};
133133
```
@@ -176,7 +176,7 @@ await message.reply('🎵 Now playing music!');
176176
```ts
177177
configureAI({
178178
selectAiModel: async () => ({ model: myModel }),
179-
messageFilter: async (message) =>
179+
messageFilter: async (commandkit, message) =>
180180
message.mentions.users.has(message.client.user.id),
181181
});
182182
```

apps/website/docs/guide/13-ai-powered-commands/02-ai-configuration.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ configureAI({
4444
},
4545

4646
// Optional: Filter which messages trigger AI processing
47-
messageFilter: async (message) => {
47+
messageFilter: async (commandkit, message) => {
4848
// Only respond when the bot is mentioned
4949
return (
5050
message.inGuild() && message.mentions.users.has(message.client.user.id)
@@ -89,7 +89,7 @@ selectAiModel: async (ctx, message) => {
8989
Control which messages trigger AI processing:
9090

9191
```ts
92-
messageFilter: async (message) => {
92+
messageFilter: async (commandkit, message) => {
9393
// Only respond to mentions
9494
return message.mentions.users.has(message.client.user.id);
9595

@@ -236,7 +236,7 @@ configureAI({
236236
};
237237
},
238238

239-
messageFilter: async (message) => {
239+
messageFilter: async (commandkit, message) => {
240240
return message.mentions.users.has(message.client.user.id);
241241
},
242242
});

apps/website/docs/guide/13-ai-powered-commands/05-advanced-configuration.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ configureAI({
2626
}),
2727

2828
// Optional: Filter which messages trigger AI processing
29-
messageFilter: async (message) => {
29+
messageFilter: async (commandkit, message) => {
3030
return message.mentions.users.has(message.client.user.id);
3131
},
3232

@@ -130,7 +130,7 @@ selectAiModel: async (ctx, message) => ({
130130
### Basic Filtering
131131

132132
```ts
133-
messageFilter: async (message) => {
133+
messageFilter: async (commandkit, message) => {
134134
// Only respond to mentions
135135
return message.mentions.users.has(message.client.user.id);
136136
};
@@ -139,7 +139,7 @@ messageFilter: async (message) => {
139139
### Advanced Filtering
140140

141141
```ts
142-
messageFilter: async (message) => {
142+
messageFilter: async (commandkit, message) => {
143143
// Don't process bot messages
144144
if (message.author.bot) return false;
145145

@@ -165,7 +165,7 @@ messageFilter: async (message) => {
165165
### Role-based Filtering
166166

167167
```ts
168-
messageFilter: async (message) => {
168+
messageFilter: async (commandkit, message) => {
169169
if (!message.inGuild()) return false;
170170

171171
const member = message.member;

apps/website/docs/guide/13-ai-powered-commands/08-troubleshooting.mdx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ This guide covers common issues you might encounter when working with CommandKit
2929

3030
```ts
3131
// Check your message filter
32-
messageFilter: async (message) => {
32+
messageFilter: async (commandkit, message) => {
3333
console.log('Filtering message:', message.content);
3434
const shouldProcess = message.mentions.users.has(message.client.user.id);
3535
console.log('Should process:', shouldProcess);
@@ -153,7 +153,7 @@ This guide covers common issues you might encounter when working with CommandKit
153153
```ts
154154
const userCooldowns = new Map<string, number>();
155155

156-
messageFilter: async (message) => {
156+
messageFilter: async (commandkit, message) => {
157157
const userId = message.author.id;
158158
const now = Date.now();
159159
const cooldown = userCooldowns.get(userId) || 0;
@@ -368,7 +368,7 @@ export const ai: AiCommand<typeof aiConfig> = async (ctx) => {
368368
### Channel Access Issues
369369

370370
```ts
371-
messageFilter: async (message) => {
371+
messageFilter: async (commandkit, message) => {
372372
// Check if bot can send messages in the channel
373373
if (!message.channel.isSendable()) {
374374
console.log('Cannot send messages in channel:', message.channelId);

packages/ai/src/configure.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,21 @@ export interface ConfigureAI {
6565

6666
const AIConfig: Required<ConfigureAI> = {
6767
disableBuiltInTools: false,
68-
messageFilter: async (message) =>
69-
message.mentions.users.has(message.client.user.id),
68+
messageFilter: async (commandkit, message) => {
69+
const prefixOrPrefixes =
70+
await commandkit.config.getMessageCommandPrefix(message);
71+
72+
const prefixes = Array.isArray(prefixOrPrefixes)
73+
? prefixOrPrefixes
74+
: [prefixOrPrefixes];
75+
76+
const possiblyCommand = prefixes.some((p) => message.content.startsWith(p));
77+
78+
// TODO: figure out a workaround for mention prefixes
79+
return (
80+
!possiblyCommand && message.mentions.users.has(message.client.user.id)
81+
);
82+
},
7083
prepareSystemPrompt: async (_ctx, message) => createSystemPrompt(message),
7184
preparePrompt: async (_ctx, message) => {
7285
const recentMessages = await message.channel.messages.fetch({

packages/ai/src/plugin.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,9 @@ export class AiPlugin extends RuntimePlugin<AiPluginOptions> {
8585

8686
if (!message.channel.isTextBased() || !message.channel.isSendable()) return;
8787

88-
const shouldContinue = messageFilter ? await messageFilter(message) : true;
88+
const shouldContinue = messageFilter
89+
? await messageFilter(commandkit, message)
90+
: true;
8991
if (!shouldContinue) return;
9092

9193
const ctx = new AiContext<any>({

packages/ai/src/types.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Tool, type generateText } from 'ai';
22
import { Message } from 'discord.js';
33
import { AiContext } from './context';
4-
import { LoadedCommand, MessageCommandContext } from 'commandkit';
4+
import CommandKit, { LoadedCommand, MessageCommandContext } from 'commandkit';
55
import { AiConfig } from './plugin';
66
import { InferParameters } from './tools/common';
77

@@ -10,19 +10,15 @@ import { InferParameters } from './tools/common';
1010
*/
1111
export type AIGenerateResult = Awaited<ReturnType<typeof generateText>>;
1212

13-
/**
14-
* Function type for filtering commands based on their name.
15-
* @param commandName - The name of the command to filter.
16-
* @returns A boolean indicating whether the command should be included in the filter.
17-
*/
18-
export type CommandFilterFunction = (commandName: string) => boolean;
19-
2013
/**
2114
* Function type for filtering messages before they are processed by the AI.
2215
* @param message - The message to filter.
2316
* @returns A promise that resolves to a boolean indicating whether the message should be processed.
2417
*/
25-
export type MessageFilter = (message: Message) => Promise<boolean>;
18+
export type MessageFilter = (
19+
commandkit: CommandKit,
20+
message: Message,
21+
) => Promise<boolean>;
2622

2723
/**
2824
* Function type for selecting an AI model based on the message.

0 commit comments

Comments
 (0)