# BotPages.Core **BotPages.Core** — это универсальный фреймворк для построения ботов с декларативными страницами, навигацией и единым контекстом. Поддерживает работу сразу с несколькими транспортами (например, Telegram и MAX), сохраняя чистую архитектуру и удобный developer experience. --- ## ✨ Основные идеи - **PageResult** — декларативный результат обработки страницы (сообщение, файлы, кнопки, навигация). - **PageMessage** — объект сообщения с поддержкой форматов (Plain/Markdown/HTML), флагов (`IsSilent`, `DisableWebPreview`). - **PageNavigate** — объект навигации (переход на другую страницу, аргументы, режим Replace). - **PageAction** — кнопки (inline/reply, ссылки, запрос контакта/локации, стили). - **UpdateContext** — универсальный контекст обновления, независимый от транспорта, с полем `Transport` для разделения Telegram/MAX. - **PageRegistry** — реестр страниц, умеет собирать их автоматически из сборки (`CreateFromAssembly`, `CreateFromApplication`). - **IStateStore** — хранилище состояния пользователя, ключом является `(Transport, ChatId)`. --- ## 🚀 Быстрый старт ```csharp // Создаём реестр страниц var registry = PageRegistry.CreateFromApplication(defaultPageId: "main"); // Хранилище состояния IStateStore store = new InMemoryStateStore(); // Навигация INavigationService nav = new NavigationService(registry, store); // Запуск Telegram var telegramBot = new TelegramBotClient("TELEGRAM_TOKEN"); telegramBot.StartReceiving(async (bot, update, ct) => { var ctx = TelegramUpdateMapper.Map(bot, nav, store, update); await nav.HandleAsync(ctx, ct); }); // Запуск MAX var maxClient = new MaxClientAdapter("MAX_CONFIG"); maxClient.OnUpdate(async (update, ct) => { var ctx = MaxUpdateMapper.Map(maxClient, nav, store, update); ctx.Transport = "max"; await nav.HandleAsync(ctx, ct); }); ``` --- ## 📌 Пример страницы ```csharp public sealed class MainPage : IPage { public string Id => "main"; public PageResult Handle(UpdateContext ctx) { return PageResult.Text("🏠 Главная страница", new[] { new PageAction { Label = "Перейти", Value = "inlinePage", Placement = ActionPlacement.Inline } }); } } ``` --- ## 🛠️ Возможности - ✅ Декларативные страницы (`PageResult`) - ✅ Навигация (`PageNavigate`) - ✅ Сообщения с форматами и флагами (`PageMessage`) - ✅ Кнопки с расширенными параметрами (`PageAction`) - ✅ Поддержка нескольких транспортов (Telegram) - ✅ Автоматическая регистрация страниц (`PageRegistry.CreateFromApplication`) - ✅ Хранение состояния по `(ChatClientId, ChatId)` --- ## 📂 Структура проекта ``` BotPages/ ├── BotPages.Core/ # Основные классы (PageResult, PageMessage, PageNavigate, UpdateContext) ├── Demo/ # Пример страниц и запуск ├── Adapters/ # Транспортные адаптеры (Telegram) └── README.md ``` --- ## 📖 TODO - [ ] Поддержка медиагрупп (альбомов) в Telegram - [ ] Расширенные стили кнопок - [ ] TTL для сообщений - [ ] Плагины для сторонних транспортов