Skip to content

ViewSender — Слой отображения и синхронизации

ViewSender — это единственный компонент системы, который имеет право реально "общаться" с API Telegram. Его задача — сделать так, чтобы интерфейс бота ощущался как полноценное приложение (SPA), а не как бесконечная лента сообщений.


🏗 Принцип "Двух Блоков"

Фреймворк навязывает структуру интерфейса, состоящую из двух стабильных сообщений: 1. Menu (Навигация): Верхний блок, который обычно содержит кнопки разделов. Он редко меняется и служит «якорем». 2. Content (Контент): Основное сообщение, которое меняется при каждом действии пользователя.

ViewSender автоматически решает: отредактировать существующее сообщение или отправить новое (если старое было удалено или недоступно).


🔒 Изоляция координат (Group Safety)

Одна из самых сложных задач в ботах — корректная работа в группах. ViewSender решает её автоматически:

  • В ЛС: Ключ для поиска ID сообщений — user_id. Каждый пользователь видит свое меню.
  • В Группах/Каналах: Ключ — chat_id. Интерфейс бота становится «общим» для всех участников чата. Это предотвращает ситуацию, когда бот пытается отредактировать сообщение в Группе А, используя координаты из Группы Б.
  • В Топиках: Поддерживается изоляция на уровне thread_id.

🔋 Стратегии хранения (Storage)

Вы сами выбираете, где хранить ID сообщений:

1. Redis (Production-ready)

Использует Redis Hashes для мгновенного доступа. * Плюс: Состояния интерфейса сохраняются при перезагрузке бота. * Плюс: Масштабируемость (много инстансов бота работают с одной базой координат).

2. In-Memory (Fast Dev)

Хранит данные в обычном словаре Python. * Плюс: Не требует установки Redis. * Минус: При перезагрузке бота координаты теряются (бот просто отправит новые сообщения при следующем клике).


🧹 Чистка чата (Garbage Collection)

ViewSender тесно связан с GarbageStateRegistry. При переходе в определенные стейты (например, "Завершение заказа"), система может: 1. Удалить старые сообщения, которые были помечены как «мусорные» (_garbage_messages). 2. Полностью стереть координаты текущего меню, заставляя бота отправить «чистый» интерфейс.

Это избавляет пользователя от необходимости вручную вычищать историю за ботом.