aiogram/docs/dispatcher/flags.rst
Alex Root Junior f4251382e8
Remove filters factory, introduce docs translation (#978)
* 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
2022-10-02 00:04:31 +03:00

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)