🌙

Dispatcher и Router

Dispatcher и Router

Dispatcher — маршрутизатор апдейтов. Наследует Router и добавляет метод start_polling.

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

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_reaction(filters.reaction("👍"))
async def on_like(reaction):
    print(f"Лайк на {reaction.message_id} от {reaction.user_id}")

Приоритет хендлеров

Хендлеры проверяются в порядке регистрации — первый подходящий получает апдейт. После вызова обработка прекращается.

@dp.message(filters.command("start"))
async def start(msg): ...       # вызывается для /start

@dp.message()
async def fallback(msg): ...    # вызывается для всех остальных

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

from pykodaribot import Router, Dispatcher, filters

shop_router = Router()
admin_router = Router()

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

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

dp = Dispatcher()
dp.include_router(shop_router)
dp.include_router(admin_router)

start_polling

import asyncio
from pykodaribot import Bot, Dispatcher

bot = Bot("bot_ВАШ_ТОКЕН")
dp = Dispatcher()

asyncio.run(dp.start_polling(bot))             # timeout=20 по умолчанию
asyncio.run(dp.start_polling(bot, timeout=10)) # кастомный timeout

При Ctrl+C поллинг корректно завершается и закрывает HTTP-сессию.

1 просмотр