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 просмотров