Перейти к содержанию

Роутинг и обработчики

Иерархия роутеров

Dispatcher — корневой роутер. Роутеры отдельных функций могут содержать обработчики и дочерние роутеры.

from pyromax import Dispatcher, Router

dispatcher = Dispatcher()
admin = Router(name="admin")
dispatcher.include_router(admin)

include_routers(*routers) подключает несколько роутеров. Нельзя повторно подключить роутер, подключить его к себе или создать цикл.

Наблюдатели событий

У каждого роутера есть observers:

  • message, edited_message, reply_to_message, forward_message, message_removed;
  • message_reaction, message_added_reaction, message_deleted_reaction;
  • error.

Обработчики проверяются в порядке регистрации. Первое совпадение поглощает событие, если обработчик явно не вызовет skip().

Регистрация обработчика

from pyromax.models import Message


@dispatcher.message(from_me=True)
async def echo(message: Message) -> None:
    await message.reply(message.text or "")

По умолчанию message observer игнорирует сообщения текущего аккаунта. Для их обработки передайте from_me=True.

Внедрение зависимостей по типам

Каждый параметр обработчика должен иметь аннотацию. Resolver ищет значения среди данных dispatcher, filters, middleware, FSM и MaxApi.workflow_data.

from pyromax import MaxApi
from pyromax.models import Message


@dispatcher.message()
async def inspect(message: Message, api: MaxApi) -> None:
    await api.set_presence(True)

Поддерживаются forward references. Глобальные зависимости можно передать при создании клиента:

class Database:
    pass


api = await MaxApi(workflow_data={Database: Database()})


@dispatcher.message()
async def save(message: Message, database: Database) -> None:
    ...

Для зависимостей на время обработки события обычно лучше использовать middleware.