Доработан менеджер состояний.
All checks were successful
CI / build-test (push) Successful in 31s
Release / pack-and-publish (release) Successful in 1m12s

This commit is contained in:
2025-12-03 07:15:46 +03:00
parent 5feeffe6bf
commit 4aff8edbcd
14 changed files with 234 additions and 27 deletions

101
README.md
View File

@@ -1 +1,100 @@
# BotPages
# 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 для сообщений
- [ ] Плагины для сторонних транспортов