Files
BotPages/README.md
FrigaT 4aff8edbcd
All checks were successful
CI / build-test (push) Successful in 31s
Release / pack-and-publish (release) Successful in 1m12s
Доработан менеджер состояний.
2025-12-03 07:15:46 +03:00

100 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 для сообщений
- [ ] Плагины для сторонних транспортов