Skip to content

Built‑in filters

Instead of manually checking every incoming message, you can use the provided filters.

Example

import { Agent, filter } from '@xmtp/agent-sdk';
 
const agent = await Agent.createFromEnv();
 
// Using filter in message handler
agent.on('text', async (ctx) => {
  if (filter.isText(ctx.message)) {
    await ctx.sendText('You sent a text message!');
  }
});
 
// Combine multiple conditions
agent.on('text', async (ctx) => {
  if (
    filter.hasContent(ctx.message) &&
    !filter.fromSelf(ctx.message, ctx.client) &&
    filter.isText(ctx.message)
  ) {
    await ctx.sendText('Valid text message received ✅');
  }
});

For convenience, the filter object can also be imported as f:

// You can import either name:
import { filter, f } from '@xmtp/agent-sdk';
 
// Both work the same way:
if (f.isText(ctx.message)) {
  // Handle message...
}

Available filters

  • fromSelf
  • hasContent
  • isDM
  • isGroup
  • isGroupAdmin
  • isGroupSuperAdmin
  • isReaction
  • isReply
  • isRemoteAttachment
  • isText
  • isTextReply

To learn more about all available prebuilt filters, see filter.ts.

Node
import { filter } from '@xmtp/agent-sdk';
 
const fromSelf = <ContentTypes>(
  message: DecodedMessage<ContentTypes>,
  client: Client<ContentTypes>
) => {
  return message.senderInboxId === client.inboxId;
};
 
const hasContent = <ContentTypes>(
  message: DecodedMessage<ContentTypes>
): message is DecodedMessage<ContentTypes> & {
  content: NonNullable<ContentTypes>;
} => {
  return message.content !== undefined && message.content !== null;
};
 
const isDM = (conversation: Conversation): conversation is Dm => {
  return conversation instanceof Dm;
};
 
const isGroup = (conversation: Conversation): conversation is Group => {
  return conversation instanceof Group;
};
 
const isGroupAdmin = (conversation: Conversation, message: DecodedMessage) => {
  if (isGroup(conversation)) {
    return conversation.isAdmin(message.senderInboxId);
  }
  return false;
};
 
const isGroupSuperAdmin = (
  conversation: Conversation,
  message: DecodedMessage
) => {
  if (isGroup(conversation)) {
    return conversation.isSuperAdmin(message.senderInboxId);
  }
  return false;
};
 
const isReaction = (
  message: DecodedMessage
): message is DecodedMessage & { content: Reaction } => {
  return !!message.contentType?.sameAs(ContentTypeReaction);
};
 
const isReply = (
  message: DecodedMessage
): message is DecodedMessage & { content: Reply } => {
  return !!message.contentType?.sameAs(ContentTypeReply);
};
 
const isRemoteAttachment = (
  message: DecodedMessage
): message is DecodedMessage & { content: RemoteAttachment } => {
  return !!message.contentType?.sameAs(ContentTypeRemoteAttachment);
};
 
const isText = (
  message: DecodedMessage
): message is DecodedMessage & { content: string } => {
  return !!message.contentType?.sameAs(ContentTypeText);
};
 
const isTextReply = (message: DecodedMessage) => {
  return isReply(message) && typeof message.content.content === 'string';
};