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. Полностью стереть координаты текущего меню, заставляя бота отправить «чистый» интерфейс.
Это избавляет пользователя от необходимости вручную вычищать историю за ботом.