Skip to content

Annotation overview

Tim4ik edited this page Aug 3, 2025 · 3 revisions

Telegrator Annotations Overview

This document provides a comprehensive overview of all filter attributes available in the Telegrator framework. These attributes are used to declaratively specify when handlers should be executed based on various conditions.

Table of Contents


Message Filters

Text-based Filters

[TextContains]

Filters messages that contain a specific substring.

[MessageHandler]
[TextContains("hello")]
public class HelloHandler : MessageHandler
{
    // Handles messages containing "hello"
}

// Case-insensitive matching
[TextContains("hello", StringComparison.InvariantCultureIgnoreCase)]

Parameters:

  • content (string): The substring to search for
  • comparison (StringComparison, optional): String comparison method (default: InvariantCulture)

[TextStartsWith]

Filters messages that start with a specific string.

[MessageHandler]
[TextStartsWith("/")]
public class CommandHandler : MessageHandler
{
    // Handles messages starting with "/"
}

Parameters:

  • content (string): The prefix to match
  • comparison (StringComparison, optional): String comparison method

[TextEndsWith]

Filters messages that end with a specific string.

[MessageHandler]
[TextEndsWith("!")]
public class ExclamationHandler : MessageHandler
{
    // Handles messages ending with "!"
}

Parameters:

  • content (string): The suffix to match
  • comparison (StringComparison, optional): String comparison method

[TextEquals]

Filters messages that exactly match a specific string.

[MessageHandler]
[TextEquals("ping")]
public class PingHandler : MessageHandler
{
    // Handles messages that exactly equal "ping"
}

Parameters:

  • content (string): The exact text to match
  • comparison (StringComparison, optional): String comparison method

[HasText]

Filters messages that contain any non-empty text.

[MessageHandler]
[HasText]
public class TextHandler : MessageHandler
{
    // Handles any message with text content
}

Parameters: None

[MessageRegex]

Filters messages using regular expressions.

[MessageHandler]
[MessageRegex(@"^\d+$")]
public class NumberHandler : MessageHandler
{
    // Handles messages containing only digits
}

// With regex options
[MessageRegex(@"hello\s+world", RegexOptions.IgnoreCase)]

Parameters:

  • pattern (string): Regular expression pattern
  • regexOptions (RegexOptions, optional): Regex options
  • regex (Regex): Precompiled regex object

Sender-based Filters

[FromUserId]

Filters messages from a specific user ID.

[MessageHandler]
[FromUserId(123456789)]
public class AdminHandler : MessageHandler
{
    // Handles messages from user with ID 123456789
}

Parameters:

  • userId (long): The user ID to match

[FromUsername]

Filters messages from a specific username.

[MessageHandler]
[FromUsername("john_doe")]
public class JohnHandler : MessageHandler
{
    // Handles messages from user with username "john_doe"
}

// Case-insensitive matching
[FromUsername("john_doe", StringComparison.InvariantCultureIgnoreCase)]

Parameters:

  • username (string): The username to match
  • comparison (StringComparison, optional): String comparison method

[FromUser]

Filters messages from a user with specific name.

[MessageHandler]
[FromUser("John")]
public class JohnHandler : MessageHandler
{
    // Handles messages from user with first name "John"
}

[FromUser("John", "Doe")]
public class JohnDoeHandler : MessageHandler
{
    // Handles messages from user with first name "John" and last name "Doe"
}

Parameters:

  • firstName (string): The first name to match
  • lastName (string, optional): The last name to match
  • comparison (StringComparison, optional): String comparison method

[FromBot]

Filters messages sent by bots.

[MessageHandler]
[FromBot]
public class BotMessageHandler : MessageHandler
{
    // Handles messages sent by bots
}

Parameters: None

[NotFromBot]

Filters messages sent by users (not bots).

[MessageHandler]
[NotFromBot]
public class UserMessageHandler : MessageHandler
{
    // Handles messages sent by users (not bots)
}

Parameters: None

[FromPremiumUser]

Filters messages from premium users.

[MessageHandler]
[FromPremiumUser]
public class PremiumHandler : MessageHandler
{
    // Handles messages from premium users
}

Parameters: None

Chat-based Filters

[ChatType]

Filters messages from specific chat types.

[MessageHandler]
[ChatType(ChatType.Private)]
public class PrivateChatHandler : MessageHandler
{
    // Handles messages from private chats
}

[MessageHandler]
[ChatType(ChatType.Group)]
public class GroupChatHandler : MessageHandler
{
    // Handles messages from group chats
}

// Using flags for multiple types
[ChatType(ChatTypeFlags.Private | ChatTypeFlags.Group)]

Parameters:

  • type (ChatType): The chat type to match
  • flags (ChatTypeFlags): Multiple chat types using flags

[ChatId]

Filters messages from a specific chat.

[MessageHandler]
[ChatId(-1001234567890)]
public class SpecificChatHandler : MessageHandler
{
    // Handles messages from specific chat
}

Parameters:

  • id (long): The chat ID to match

[ChatTitle]

Filters messages from chats with specific title.

[MessageHandler]
[ChatTitle("My Group")]
public class MyGroupHandler : MessageHandler
{
    // Handles messages from chat with title "My Group"
}

Parameters:

  • title (string): The chat title to match
  • comparison (StringComparison, optional): String comparison method

[ChatUsername]

Filters messages from chats with specific username.

[MessageHandler]
[ChatUsername("mygroup")]
public class MyGroupHandler : MessageHandler
{
    // Handles messages from chat with username "mygroup"
}

Parameters:

  • userName (string): The chat username to match
  • comparison (StringComparison, optional): String comparison method

[ChatName]

Filters messages from chats with specific name.

[MessageHandler]
[ChatName("My", "Group")]
public class MyGroupHandler : MessageHandler
{
    // Handles messages from chat with first name "My" and last name "Group"
}

Parameters:

  • firstName (string): The chat first name to match
  • lastName (string, optional): The chat last name to match
  • comparison (StringComparison, optional): String comparison method

[ChatIsForum]

Filters messages from forum chats.

[MessageHandler]
[ChatIsForum]
public class ForumHandler : MessageHandler
{
    // Handles messages from forum chats
}

Parameters: None

Reply-based Filters

[MeReplied]

Filters messages that are replies to messages sent by this bot.

[MessageHandler]
[MeReplied]
public class ReplyToBotHandler : MessageHandler
{
    // Handles messages that reply to bot's messages
}

Parameters: None

[HasReply]

Filters messages that have replies.

[MessageHandler]
[HasReply]
public class RepliedMessageHandler : MessageHandler
{
    // Handles messages that have replies
}

// Check for specific reply depth
[HasReply(2)]
public class DeepReplyHandler : MessageHandler
{
    // Handles messages with reply depth of 2
}

Parameters:

  • replyDepth (int, optional): The reply depth to check (default: 1)

[FromReplyChain]

Filters messages based on reply chain content.

[MessageHandler]
[FromReplyChain]
public class ReplyChainHandler : MessageHandler
{
    // Handles messages from reply chains
}

Parameters:

  • replyDepth (int, optional): The reply depth to check (default: 1)

Special Message Filters

[MessageHasEntity]

Filters messages with specific entities (mentions, links, etc.).

[MessageHandler]
[MessageHasEntity(MessageEntityType.Mention)]
public class MentionHandler : MessageHandler
{
    // Handles messages with mentions
}

[MessageHandler]
[MessageHasEntity(MessageEntityType.Url)]
public class LinkHandler : MessageHandler
{
    // Handles messages with URLs
}

// With specific content
[MessageHasEntity(MessageEntityType.Mention, "@mybot")]
public class BotMentionHandler : MessageHandler
{
    // Handles messages mentioning "@mybot"
}

Parameters:

  • type (MessageEntityType): The entity type to match
  • offset (int, optional): Starting position of the entity
  • length (int?, optional): Length of the entity
  • content (string, optional): Content that the entity should contain
  • stringComparison (StringComparison, optional): String comparison method

[DiceThrowed]

Filters messages with dice throws.

[MessageHandler]
[DiceThrowed(6)]
public class DiceSixHandler : MessageHandler
{
    // Handles dice throws with value 6
}

[MessageHandler]
[DiceThrowed(DiceType.Dart, 1)]
public class DartHandler : MessageHandler
{
    // Handles dart throws with value 1
}

Parameters:

  • value (int): The dice value to match
  • diceType (DiceType, optional): The type of dice

[IsAutomaticFormwardMessage]

Filters automatically forwarded messages.

[MessageHandler]
[IsAutomaticFormwardMessage]
public class ForwardHandler : MessageHandler
{
    // Handles automatically forwarded messages
}

Parameters: None

[IsFromOfflineMessage]

Filters messages sent while the user was offline.

[MessageHandler]
[IsFromOfflineMessage]
public class OfflineMessageHandler : MessageHandler
{
    // Handles messages sent while user was offline
}

Parameters: None

[IsServiceMessageMessage]

Filters service messages (user joined, left, etc.).

[MessageHandler]
[IsServiceMessageMessage]
public class ServiceMessageHandler : MessageHandler
{
    // Handles service messages
}

Parameters: None

[IsTopicMessageMessage]

Filters topic messages in forum chats.

[MessageHandler]
[IsTopicMessageMessage]
public class TopicMessageHandler : MessageHandler
{
    // Handles topic messages in forum chats
}

Parameters: None


Command Filters

[CommandAllias]

Filters messages based on command aliases.

[CommandHandler]
[CommandAllias("start")]
public class StartHandler : CommandHandler
{
    // Handles /start command
}

[CommandHandler]
[CommandAllias("help", "h")]
public class HelpHandler : CommandHandler
{
    // Handles both /help and /h commands
}

// With description
[CommandAllias("settings")]
public class SettingsHandler : CommandHandler
{
    public SettingsHandler()
    {
        Description = "Configure bot settings";
    }
}

Parameters:

  • alliases (params string[]): Command aliases to match
  • Description (property): Command description for Telegram

Callback Query Filters

[CallbackData]

Filters callback queries with specific data.

[CallbackQueryHandler]
[CallbackData("button1")]
public class Button1Handler : CallbackQueryHandler
{
    // Handles callback queries with data "button1"
}

Parameters:

  • data (string): The callback data to match

[CallbackInlineId]

Filters callback queries from specific inline messages.

[CallbackQueryHandler]
[CallbackInlineId("inline_message_id")]
public class InlineHandler : CallbackQueryHandler
{
    // Handles callback queries from specific inline message
}

Parameters:

  • inlineMessageId (string): The inline message ID to match

Environment Filters

[IsDebugEnvironment]

Filters updates that occur in debug environment.

[MessageHandler]
[IsDebugEnvironment]
public class DebugHandler : MessageHandler
{
    // Only runs in debug mode
}

Parameters: None

[IsReleaseEnvironment]

Filters updates that occur in release environment.

[MessageHandler]
[IsReleaseEnvironment]
public class ReleaseHandler : MessageHandler
{
    // Only runs in release mode
}

Parameters: None

[EnvironmentVariable]

Filters updates based on environment variable values.

[MessageHandler]
[EnvironmentVariable("BOT_MODE", "production")]
public class ProductionHandler : MessageHandler
{
    // Only runs when BOT_MODE=production
}

[MessageHandler]
[EnvironmentVariable("ENABLE_FEATURE")]
public class FeatureHandler : MessageHandler
{
    // Only runs when ENABLE_FEATURE environment variable exists
}

Parameters:

  • variable (string): The environment variable name
  • value (string, optional): The expected value
  • comparison (StringComparison, optional): String comparison method

State Management Filters

[NumericState]

Filters handlers based on numeric (integer) state.

[MessageHandler]
[NumericState(1)]
public class Step1Handler : MessageHandler
{
    // Handles messages when user is in state 1
}

[MessageHandler]
[NumericState(SpecialState.NoState)]
public class StartHandler : MessageHandler
{
    // Handles messages when user has no state
}

Parameters:

  • myState (int): The numeric state to match
  • specialState (SpecialState): Special state value
  • keyResolver (IStateKeyResolver, optional): Custom key resolver

[EnumState<TEnum>]

Filters handlers based on enum state.

public enum UserState
{
    Start = SpecialState.NoState,
    WaitingForName,
    WaitingForAge
}

[MessageHandler]
[EnumState<UserState>(UserState.WaitingForName)]
public class NameHandler : MessageHandler
{
    // Handles messages when user is in WaitingForName state
}

Parameters:

  • myState (TEnum): The enum state to match
  • specialState (SpecialState): Special state value
  • keyResolver (IStateKeyResolver, optional): Custom key resolver

[StringState]

Filters handlers based on string state.

[MessageHandler]
[StringState("waiting_for_name")]
public class NameHandler : MessageHandler
{
    // Handles messages when user is in "waiting_for_name" state
}

Parameters:

  • myState (string): The string state to match
  • specialState (SpecialState): Special state value
  • keyResolver (IStateKeyResolver, optional): Custom key resolver

Special States

public enum SpecialState
{
    None,       // No special state
    NoState,    // Indicates that no state is present
    AnyState    // Indicates that any state is acceptable
}

Utility Filters

[Mentioned]

Filters messages that contain mentions.

[MessageHandler]
[Mentioned]
public class MentionHandler : MessageHandler
{
    // Handles any message with mentions of this bot
}

[MessageHandler]
[Mentioned("rikitav")]
public class BotMentionHandler : MessageHandler
{
    // Handles messages mentioning "@rikitav"
}

[MessageHandler]
[Mentioned("rikitav", 0)]
public class BotMentionAtStartHandler : MessageHandler
{
    // Handles messages mentioning "@rikitav" in the start of the message
}

Parameters:

  • mention (string, optional): Specific mention text to match
  • offset (int, optional): Position where mention should occur

[Welcome]

Filters /start commands in private chats.

[MessageHandler]
[Welcome]
public class WelcomeHandler : MessageHandler
{
    // Handles /start command in private chats
}

[MessageHandler]
[Welcome(true)]
public class FirstTimeWelcomeHandler : MessageHandler
{
    // Handles only first-time /start commands (message ID = 0)
}

Parameters:

  • onlyFirst (bool, optional): Only handle first-time start commands (default: false)

Combining Filters

Filters can be combined using logical operators:

[MessageHandler]
[ChatType(ChatType.Private)]
[TextContains("hello")]
public class PrivateHelloHandler : MessageHandler
{
    // Handles "hello" messages in private chats (AND logic)
}

[MessageHandler]
[TextContains("hello", Modifiers = FilterModifier.OrNext)]
[TextContains("hi")]
public class GreetingHandler : MessageHandler
{
    // Handles messages containing "hello" OR "hi" (OR logic)
}

[MessageHandler]
[TextContains("hello", Modifiers = FilterModifier.Not)]
public class NotHelloHandler : MessageHandler
{
    // Handles messages that do NOT contain "hello" (NOT logic)
}

Filter Modifiers

  • FilterModifier.Not - Inverts the filter
  • FilterModifier.OrNext - Combines this filter with the next one using OR logic
  • These can be combined using bitwise OR: FilterModifier.Not | FilterModifier.OrNext

Best Practices

  1. Use specific filters: Prefer specific filters over generic ones for better performance
  2. Combine filters logically: Use multiple filters to create precise conditions
  3. Order matters: Place more restrictive filters first
  4. Use state management: For multi-step conversations, use state filters
  5. Environment awareness: Use environment filters for different deployment scenarios
  6. Document your filters: Add comments explaining complex filter combinations

Examples

Admin-only command handler:

[CommandHandler]
[CommandAllias("admin")]
[FromUserId(123456789)]
[IsReleaseEnvironment]
public class AdminHandler : CommandHandler
{
    // Only admin can use this command in production
}

Multi-step form:

[MessageHandler]
[EnumState<UserState>(UserState.WaitingForName)]
[HasText]
public class NameInputHandler : MessageHandler
{
    // Handles name input in form wizard
}