FrigaT 57b3706241
All checks were successful
CI / build-test (push) Successful in 29s
Release / pack-and-publish (release) Successful in 32s
Выделены отдельные расширения
2025-12-06 07:52:01 +03:00
ci
2025-12-02 17:50:32 +03:00
ci
2025-12-02 16:03:27 +03:00
ci
2025-12-02 16:03:27 +03:00
2025-12-05 13:51:57 +03:00

BotPages Framework

BotPages — это архитектурный фреймворк для построения Telegram/MAXботов с чистыми слоями, расширяемыми API и удобным developer experience.

Возможности

  • Навигация через страницы: каждая страница — отдельный обработчик логики.
  • Единый метод GoToAsync: автоматически поддерживает как SingletonPage, так и StatefulPage.
  • StatefulPage: свойства автоматически сохраняются в StateStorage.
  • SingletonPage: один экземпляр на всё приложение, без состояния.
  • Middleware: подключение промежуточных обработчиков (логирование, обработка ошибок).
  • Автоматическая регистрация страниц: через рефлексию.
  • Роутинг страниц: возможность устанавливать пути вызова для страниц.
  • Команды: возможность установки команд, которые работают приоритетнее обработчиков страниц.
  • Минимум boilerplate: декларативные интерфейсы и fluent API.

🚀 Быстрый старт

var app = new BotPagesApp(factory, state, logger)
    .UseDefaultPage<WelcomePage>()
    .MapCommand<WelcomePage>("/start")
    .AddMiddleware(new LoggingMiddleware(logger))
    .AddMiddleware(new ErrorHandlingMiddleware(logger));

📄 Пример страниц

StatefulPage

public sealed class WelcomePage : StatefulPage
{
    [Statefull("visitCount")]
    private int VisitCount;

    private PageContext? Context { get; set; }

    public override async Task OnEnter(PageContext ctx, CancellationToken ct)
    {
        Context = ctx;

        LoadState();
        VisitCount++;
        SaveState();

        await ctx.SendTextAsync($"Добро пожаловать 🚀. Вы заходили сюда {VisitCount} раз(а).", ct: ct);
    }
}

SingletonPage

public sealed class HelpPage : SingletonPage
{
    public override Task OnEnter(PageContext ctx, CancellationToken ct)
        => ctx.SendTextAsync("Это справка 📖", ct: ct);
}

🧩 Навигация

await ctx.Navigation.GoToAsync<WelcomePage>(ctx, ct); // Stateful
await ctx.Navigation.GoToAsync<WelcomePage>(ctx, agrs, ct);    // Stateful with arguments
await ctx.Navigation.GoToAsync<HelpPage>(ctx, ct);    // Singleton
await ctx.Navigation.GoToHome(ctx, ct); // Stateful

⚙️ Middleware

public sealed class LoggingMiddleware : IPageMiddleware
{
    private readonly ILogger _logger;
    public LoggingMiddleware(ILogger logger) => _logger = logger;

    public async Task InvokeAsync(PageContext ctx, Func<Task> next, CancellationToken ct)
    {
        _logger.Log(LogLevel.Info, $"Update: {ctx.Update.Kind}");
        await next();
    }
}

🏗 Архитектурные принципы

  • Separation of concerns: страницы не знают о транспорте, всё через адаптеры.
  • Расширяемость: новые страницы и middleware подключаются декларативно.
  • Прозрачность: минимум скрытой логики, всё явно через контекст.
  • Developer Experience: удобные API, автоматическая регистрация, документация через ///summary.

📌 Итог

BotPages позволяет писать чистые, расширяемые и удобные для команды боты:

  • минимум boilerplate,
  • декларативные интерфейсы,
  • прозрачная навигация,
  • автоматическое управление состоянием.
Description
No description provided
Readme MIT 402 KiB
2026-04-12 16:57:32 +03:00
Languages
C# 99.3%
PowerShell 0.4%
Shell 0.3%