Фабрика миток зворотнього вызова и фильтрування

class litegram.filters.callback_data.CallbackData[исходный код]

Базовый класс для обгортки метки обратного вызова

Этот класс следует использовать как супер-класс зворотних викликив, визначених пользователем.

Ключове слово класса prefix потрибне для определения префикса, а также аргумент sep можно передать для определения разделителя (за замовчуванням это :).

pack() str[исходный код]

Генерування строку метки обратного вызова

Результат:

дийсна митка обратного вызова для Telegram Bot API

classmethod unpack(value: str) Self[исходный код]

Анализ рядка метки обратного вызова

Параметры:

value – значение с Telegram

Результат:

экземпляр метки обратного вызова

classmethod filter(rule: MagicFilter | None = None) CallbackQueryFilter[исходный код]

Створюе фильтр для запиту обратного вызова с правилом

Параметры:

rule – магичне правило

Результат:

экземпляр фильтру

Использование

Создания пидкласу CallbackData:

class MyCallback(CallbackData, prefix="my"):
    foo: str
    bar: int

После этого вы можете создать будь-который зворотний виклик на основе этого класса, например:

cb1 = MyCallback(foo="demo", bar=42)
cb1.pack()  # returns 'my:demo:42'
cb1.unpack('my:demo:42')  # returns <MyCallback(foo="demo", bar=42)>

Отже… Тепер вы можете использовать этот класс для создания будь-которых зворотних викликив из визначеною структурою

...
# Pass it into the markup
InlineKeyboardButton(
    text="demo",
    callback_data=MyCallback(foo="demo", bar="42").pack()  # value should be packed to string
)
...

… и обробляти за певними правилами

# Filter callback by type and value of field :code:`foo`
@router.callback_query(MyCallback.filter(F.foo == "demo"))
async def my_callback_foo(query: CallbackQuery, callback_data: MyCallback):
    await query.answer(...)
    ...
    print("bar =", callback_data.bar)

Also can be used in Keyboard builder:

builder = InlineKeyboardBuilder()
builder.button(
    text="demo",
    callback_data=MyCallback(foo="demo", bar="42")  # Value can be not packed to string inplace, because builder knows what to do with callback instance
)

Ещё один абстрактний пример:

class Action(str, Enum):
    ban = "ban"
    kick = "kick"
    warn = "warn"

class AdminAction(CallbackData, prefix="adm"):
    action: Action
    chat_id: int
    user_id: int

...
# Inside handler
builder = InlineKeyboardBuilder()
for action in Action:
    builder.button(
        text=action.value.title(),
        callback_data=AdminAction(action=action, chat_id=chat_id, user_id=user_id),
    )
await bot.send_message(
    chat_id=admins_chat,
    text=f"What do you want to do with {html.quote(name)}",
    reply_markup=builder.as_markup(),
)
...

@router.callback_query(AdminAction.filter(F.action == Action.ban))
async def ban_user(query: CallbackQuery, callback_data: AdminAction, bot: Bot):
    await bot.ban_chat_member(
        chat_id=callback_data.chat_id,
        user_id=callback_data.user_id,
        ...
    )

Викми обмеження

Дозволени типы и их пидкласи:

  • str

  • int

  • bool

  • float

  • Decimal (from decimal import Decimal)

  • Fraction (from fractions import Fraction)

  • UUID (from uuid import UUID)

  • Enum (from enum import Enum, только для переликив рядкив)

  • IntEnum (from enum import IntEnum, только для переликив int)

Примечание

Заметьте, что целое число Enum всегда имеет быть пидкласом IntEnum через проблеми с синтаксичним анализом.