Добавьте файлы проекта.
This commit is contained in:
45
BotPages.Core/Pipeline/Router.cs
Normal file
45
BotPages.Core/Pipeline/Router.cs
Normal file
@@ -0,0 +1,45 @@
|
||||
namespace BotPages.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Простой роутер: команды верхнего уровня и делегирование текущей странице.
|
||||
/// </summary>
|
||||
public sealed class Router : IRouter
|
||||
{
|
||||
private readonly IPageRegistry _pages;
|
||||
|
||||
/// <summary>
|
||||
/// Создаёт роутер страниц.
|
||||
/// </summary>
|
||||
public Router(IPageRegistry pages) => _pages = pages;
|
||||
|
||||
/// <summary>
|
||||
/// Определяет текущую страницу и вызывает её обработчик.
|
||||
/// </summary>
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user