Фабрика миток зворотнього вызова и фильтрування¶
- 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,
...
)
Викми обмеження¶
Дозволени типы и их пидкласи:
strintboolfloatDecimal(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 через проблеми с синтаксичним анализом.