namespace BotPages.Core
{
///
/// Простой роутер: команды верхнего уровня и делегирование текущей странице.
///
public sealed class Router : IRouter
{
private readonly IPageRegistry _pages;
///
/// Создаёт роутер страниц.
///
public Router(IPageRegistry pages) => _pages = pages;
///
/// Определяет текущую страницу и вызывает её обработчик.
///
public async Task RouteAsync(UpdateContext ctx, CancellationToken ct)
{
var text = ctx.Text ?? string.Empty;
if (text.StartsWith("/start", StringComparison.Ordinal))
{
await ctx.Nav.ReplaceAsync(_pages.DefaultPage.Id, null, ctx, ct);
return;
}
var current = (await ctx.Nav.CurrentAsync(ctx, ct))?.PageId;
if (current is not null)
{
var pr = await _pages.Get(current).HandleAsync(ctx, ct);
await ctx.Nav.ApplyResultAsync(ctx, pr, ct);
return;
}
else
{
await ctx.Nav.ReplaceAsync(_pages.DefaultPage.Id, null, ctx, ct);
return;
}
//TODO: Вынести в "дефолтный /start page"
await ctx.Client.SendTextAsync(ctx.Chat.Id, "Не понимаю. Нажмите /start.", null, ct);
}
}
}