Router

Hierarchical routers with 25+ Pyrogram event decorators, sub-router nesting, and deferred handler registration.

Basic Usage

from pyrogram import filters
from pyrogram_patch.router import Router

router = Router()

@router.on_message(filters.command("start"))
async def start(client, message):
    await message.reply("Hello!")

@router.on_callback_query(filters.regex("^menu_"))
async def handle_menu(client, callback_query):
    await callback_query.answer("Selected!")

Sub-Routers

Split handlers across multiple routers for modular bot architecture:

# admin_router.py
admin_router = Router()

@admin_router.on_message(filters.command("ban"))
async def ban_user(client, message):
    ...

# main.py
main_router = Router()
main_router.include_router(admin_router)

manager = await patch(app)
manager.include_router(main_router)

Available Decorators

on_message
on_callback_query
on_inline_query
on_chosen_inline_result
on_edited_message
on_deleted_messages
on_chat_member_updated
on_chat_join_request
on_raw_update
on_disconnect
on_user_status
on_poll
on_story
on_bot_business_connect
on_bot_business_message
on_edited_bot_business_message
on_deleted_bot_business_messages
on_message_reaction_updated
on_message_reaction_count_updated
on_chat_boost_updated
on_removed_chat_boost
on_pre_checkout_query
on_shipping_query
on_paid_media_purchased

Handler DI

Handlers receive dependencies via their parameter names. Add a patch_helper: PatchHelperparameter to get FSM and data access:

from pyrogram_patch.patch_helper import PatchHelper

@router.on_message(filters.command("profile"))
async def profile(client, message, patch_helper: PatchHelper):
    state = await patch_helper.get_state()
    data = await patch_helper.get_data()
    await message.reply(f"State: {state}, Data: {data}")