UIComponent
UIComponent — базовый класс для создания экранов бота с автоматической маршрутизацией callback_data.
Класс UIComponent
Заголовок раздела «Класс UIComponent»from edgebot import UIComponentКлассовые атрибуты
Заголовок раздела «Классовые атрибуты»| Атрибут | Тип | По умолчанию | Описание |
|---|---|---|---|
__prefix__ | str | "" | Уникальный префикс для callback_data (обязательно) |
prompt | str | None | None | Ключ промпта в PromptRegistry |
markup | str | None | None | Ключ клавиатуры в KeyboardRegistry |
text | str | "" | Inline-шаблон текста (альтернатива prompt) |
async open(ctx, **kwargs)
Заголовок раздела «async open(ctx, **kwargs)»Точка входа в экран. Обязательно переопределяется в наследнике.
async def open(self, ctx: Context, **kwargs) -> None: ...Обычно внутри:
- Загружает данные из KV / реестров
- Вызывает
self.send(ctx, prompt_kwargs=..., markup_kwargs=...)
async send(ctx, …)
Заголовок раздела «async send(ctx, …)»Отправляет новое сообщение экрана.
async def send( self, ctx: Context, *, prompt: str | Prompt | None = None, markup: str | InlineKeyboard | None = None, prompt_kwargs: dict | None = None, markup_kwargs: dict | None = None, parse_mode: str | None = None,) -> dict| Параметр | Описание |
|---|---|
prompt | Явный источник промпта (ключ или Prompt). Если None — self.prompt или self.text |
markup | Явный источник клавиатуры (ключ или InlineKeyboard). Если None — self.markup |
prompt_kwargs | Данные для фабрики промпта и Prompt.render() |
markup_kwargs | Данные для фабрики клавиатуры |
parse_mode | Режим парсинга; по умолчанию — bot.parse_mode |
async update(ctx, …)
Заголовок раздела «async update(ctx, …)»Редактирует текущее сообщение. Сигнатура идентична send().
async def update(self, ctx, ...) -> dict | Nonematches(callback_data)
Заголовок раздела «matches(callback_data)»Быстрая проверка принадлежности callback к этому компоненту.
def matches(self, callback_data: str) -> boolВозвращает True, если callback_data начинается с "{__prefix__}:".
async handle_callback(ctx)
Заголовок раздела «async handle_callback(ctx)»Внутренний метод маршрутизации. Вызывается из Bot.process_update().
async def handle_callback(self, ctx: Context) -> boolПоследовательность:
- Проверка
startswith("{prefix}:") - Сопоставление с зарегистрированными паттернами (first-match)
- Fallback
"*"(если задан)
Возвращает True, если callback был обработан.
Декоратор @UIComponent.callback(pattern)
Заголовок раздела «Декоратор @UIComponent.callback(pattern)»Привязывает метод к паттерну callback_data.
@UIComponent.callback(pattern: str)Паттерны
Заголовок раздела «Паттерны»| Паттерн | Пример callback_data | kwargs |
|---|---|---|
"toggle" | "prof:toggle" | — |
"del:{user_id}" | "prof:del:123" | user_id="123" |
"page:{num}" | "prof:page:5" | num="5" |
"*" | "prof:anything" | — |
- Паттерн пишется без префикса компонента
{name}— именованная переменная, значение передаётся в метод как kwarg"*"— fallback, ловит всё не подошедшее под другие паттерны
class OrderScreen(UIComponent): __prefix__ = "order"
@UIComponent.callback("confirm:{order_id}") async def on_confirm(self, ctx: Context, order_id: str) -> None: await ctx.answer_callback(f"Заказ {order_id} подтверждён")
@UIComponent.callback("cancel:{order_id}") async def on_cancel(self, ctx: Context, order_id: str) -> None: await ctx.answer_callback(f"Заказ {order_id} отменён")
@UIComponent.callback("*") async def on_fallback(self, ctx: Context) -> None: await ctx.answer_callback("Неизвестное действие")Резолвинг промпта
Заголовок раздела «Резолвинг промпта»Приоритет определения текста сообщения:
- Аргумент
promptвsend()/update()(str → ключ в реестре; Prompt → как есть) - Атрибут
self.prompt(ключ в PromptRegistry) - Атрибут
self.text(inline-шаблон, оборачивается вPrompt)
Если ни один источник не найден — UIError.
Резолвинг клавиатуры
Заголовок раздела «Резолвинг клавиатуры»Приоритет определения клавиатуры:
- Аргумент
markupвsend()/update()(str → ключ в реестре; InlineKeyboard → как есть) - Атрибут
self.markup(ключ в KeyboardRegistry) None— экран без клавиатуры (допустимо)