Маркери#

Маркери це, так звані мітки для обробників, які можна використовувати міддлварах або в спеціальних утилітах щоб провести класифікацію обробників.

Маркери можна додати до обробника через декоратори, реєстрацію обробників або фільтри.

Через декоратори#

Наприклад, відмітимо обробник маркером chat_action

from aiogram import flags

@flags.chat_action
async def my_handler(message: Message)

Або просто для рейт-ліміту чи чогось іншого

from aiogram import flags

@flags.rate_limit(rate=2, key="something")
async def my_handler(message: Message)

Через метод реєстрації обробника#

@router.message(..., flags={'chat_action': 'typing', 'rate_limit': {'rate': 5}})

Через фільтри#

class Command(Filter):
    ...

    def update_handler_flags(self, flags: Dict[str, Any]) -> None:
        commands = flags.setdefault("commands", [])
        commands.append(self)

Використовувати в міддлварах#

aiogram.dispatcher.flags.check_flags(handler: HandlerObject | Dict[str, Any], magic: MagicFilter) Any[source]#

Check flags via magic filter

Параметри:
  • handler – handler object or data

  • magic – instance of the magic

Повертає:

the result of magic filter check

aiogram.dispatcher.flags.extract_flags(handler: HandlerObject | Dict[str, Any]) Dict[str, Any][source]#

Extract flags from handler or middleware context data

Параметри:

handler – handler object or data

Повертає:

dictionary with all handler flags

aiogram.dispatcher.flags.get_flag(handler: HandlerObject | Dict[str, Any], name: str, *, default: Any | None = None) Any[source]#

Get flag by name

Параметри:
  • handler – handler object or data

  • name – name of the flag

  • default – default value (None)

Повертає:

value of the flag or default

Приклад в міддлварах#

async def my_middleware(handler, event, data):
    typing = get_flag(data, "typing")  # Check that handler marked with `typing` flag
    if not typing:
        return await handler(event, data)

    async with ChatActionSender.typing(chat_id=event.chat.id):
        return await handler(event, data)

Використання в утилітах#

Наприклад, ви можете зібрати всі зареєстровані команди з описом обробника, а потім його можна використовувати для створення довідки щодо команд

def collect_commands(router: Router) -> Generator[Tuple[Command, str], None, None]:
    for handler in router.message.handlers:
        if "commands" not in handler.flags:  # ignore all handler without commands
            continue
        # the Command filter adds the flag with list of commands attached to the handler
        for command in handler.flags["commands"]:
            yield command, handler.callback.__doc__ or ""
    # Recursively extract commands from nested routers
    for sub_router in router.sub_routers:
        yield from collect_commands(sub_router)