100 lines
4.0 KiB
Markdown
100 lines
4.0 KiB
Markdown
# 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 для сообщений
|
||
- [ ] Плагины для сторонних транспортов |