🌙

Dispatcher и Router

Dispatcher и Router

Router хранит хендлеры, Dispatcher наследует его и добавляет поллинг.

Регистрация хендлеров

from pykodaribot import Dispatcher, filters

dp = Dispatcher()

@dp.message(filters.command("start"))
async def start(msg):
    await msg.answer("Привет!")

@dp.edited_message()
async def on_edit(msg):
    await msg.answer(f"Вы поправили: {msg.text}")

@dp.callback_query(filters.callback_data("yes"))
async def on_yes(cb):
    await cb.answer()
    await cb.message.answer("Да!")
ДекораторАпдейт
@dp.message()Новое сообщение
@dp.edited_message()Отредактированное сообщение
@dp.callback_query()Нажатие inline-кнопки
@dp.message_reaction()Реакция — сервер такие апдейты не присылает

Приоритет

Хендлеры проверяются в порядке регистрации, срабатывает первый подходящий, дальше обработка прекращается.

@dp.message(filters.command("start"))
async def start(msg): ...

@dp.message()
async def fallback(msg): ...

Router — разделение по модулям

from pykodaribot import Router, Dispatcher, filters

shop = Router()
admin = Router()

@shop.message(filters.command("buy"))
async def buy(msg): ...

@admin.message(filters.command("ban"))
async def ban(msg): ...

dp = Dispatcher()
dp.include_router(shop)
dp.include_router(admin)

Хендлеры подключённых роутеров добавляются к общему списку в порядке подключения — сначала свои, затем импортированные.

start_polling

asyncio.run(dp.start_polling(bot))
asyncio.run(dp.start_polling(bot, timeout=10))

start_polling сам ведёт offset, переживает сетевые ошибки и закрывает сессию при Ctrl+C.

Ошибки внутри хендлера

Исключение в одном хендлере не роняет поллинг, но и не логируется красиво — оборачивайте рискованные вызовы сами:

from pykodaribot import BotError

@dp.message(filters.command("stat"))
async def stat(msg):
    try:
        chat = await bot.get_chat(msg.chat.id)
    except BotError as e:
        await msg.answer(f"Не вышло: {e.description}")
        return
    await msg.answer(f"Участников: {chat.member_count}")
30 просмотров