mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-11 18:01:04 +00:00
* Rewrite filters * Update README.rst * Fixed tests * Small optimization of the Text filter (TY to @bomzheg) * Remove dataclass slots argument in due to the only Python 3.10 has an slots argument * Fixed mypy * Update tests * Disable Python 3.11 * Fixed #1013: Empty mention should be None instead of empty string. * Added #990 to the changelog * Added #942 to the changelog * Fixed coverage * Update poetry and dependencies * Fixed mypy * Remove deprecated code * Added more tests, update pyproject.toml * Partial update docs * Added initial Docs translation files * Added more changes * Added log message when connection is established in polling process * Fixed action * Disable lint for PyPy * Added changelog for docs translation
89 lines
2.4 KiB
ReStructuredText
89 lines
2.4 KiB
ReStructuredText
=====
|
|
Flags
|
|
=====
|
|
|
|
Flags is a markers for handlers that can be used in `middlewares <#use-in-middlewares>`_
|
|
or special `utilities <#use-in-utilities>`_ to make classification of the handlers.
|
|
|
|
Flags can be added to the handler via `decorators <#via-decorators>`_,
|
|
`handlers registration <#via-handler-registration-method>`_ or
|
|
`filters <via-filters>`_.
|
|
|
|
Via decorators
|
|
==============
|
|
|
|
For example mark handler with `chat_action` flag
|
|
|
|
.. code-block:: python
|
|
|
|
from aiogram import flags
|
|
|
|
@flags.chat_action
|
|
async def my_handler(message: Message)
|
|
|
|
Or just for rate-limit or something else
|
|
|
|
.. code-block:: python
|
|
|
|
from aiogram import flags
|
|
|
|
@flags.rate_limit(rate=2, key="something")
|
|
async def my_handler(message: Message)
|
|
|
|
Via handler registration method
|
|
===============================
|
|
|
|
.. code-block:: python
|
|
|
|
@router.message(..., flags={'chat_action': 'typing', 'rate_limit': {'rate': 5}})
|
|
|
|
Via filters
|
|
===========
|
|
|
|
.. code-block:: python
|
|
|
|
class Command(Filter):
|
|
...
|
|
|
|
def update_handler_flags(self, flags: Dict[str, Any]) -> None:
|
|
commands = flags.setdefault("commands", [])
|
|
commands.append(self)
|
|
|
|
|
|
|
|
Use in middlewares
|
|
==================
|
|
|
|
.. automodule:: aiogram.flags.getter
|
|
:members:
|
|
|
|
Example in middlewares
|
|
----------------------
|
|
|
|
.. code-block:: python
|
|
|
|
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)
|
|
|
|
Use in utilities
|
|
================
|
|
|
|
For example you can collect all registered commands with handler description and then it can be used for generating commands help
|
|
|
|
.. code-block:: python
|
|
|
|
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)
|