Доработан менеджер состояний.
This commit is contained in:
101
README.md
101
README.md
@@ -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 для сообщений
|
||||
- [ ] Плагины для сторонних транспортов
|
||||
Reference in New Issue
Block a user