Files
BotPages/BotPages.Core/Context/PageContext.cs
2025-12-05 19:45:59 +03:00

108 lines
3.8 KiB
C#

using BotPages.Core.Abstractions;
using BotPages.Core.Context;
using BotPages.Core.Messaging;
namespace BotPages.Core;
/// <summary>
/// Контекст страницы, объединяющий пользователя, чат, состояние и адаптер.
/// </summary>
public sealed class PageContext
{
/// <summary>Ключ сессии.</summary>
public required CompositeSessionKey SessionKey { get; init; }
/// <summary>Данные обновления.</summary>
public required UpdateContext Update { get; init; }
/// <summary>Хранилище состояния.</summary>
public required IStateStorage StateStorage { get; init; }
/// <summary>Сервис навигации.</summary>
public required NavigationService Navigation { get; init; }
/// <summary>Адаптер мессенджера.</summary>
public required IMessengerAdapter Adapter { get; init; }
//Storage
/// <summary>Получить состояние по ключу.</summary>
public Task<T?> GetStorageAsync<T>(string key, CancellationToken ct)
=> StateStorage.GetAsync<T>(SessionKey, key, ct);
/// <summary>Сохранить состояние по ключу.</summary>
public Task SetStorageAsync<T>(string key, T state, CancellationToken ct)
=> StateStorage.SetAsync<T>(SessionKey, key, state, ct);
/// <summary>Удалить состояние по ключу.</summary>
public Task<bool> RemoveStorageAsync(string key, CancellationToken ct)
=> StateStorage.RemoveAsync(SessionKey, key, ct);
/// <summary>Удалить все состояния по ключу.</summary>
public Task<bool> ClearStorageAsync(CancellationToken ct)
=> StateStorage.ClearAsync(SessionKey, ct);
//Adapter
/// <summary>
/// Отправить текстовое сообщение.
/// </summary>
public Task SendTextAsync(string text, MessageFormat format = MessageFormat.Plain,
IEnumerable<IEnumerable<InlineButton>>? inline = null,
IEnumerable<IEnumerable<ReplyButton>>? reply = null,
CancellationToken ct = default)
=> Adapter.SendTextAsync(this.Update.Chat.Id, text, format, inline, reply, ct);
/// <summary>
/// Отправить файл.
/// </summary>
public Task SendFileAsync(FileDescriptor file, string? caption = null, CancellationToken ct = default)
=> Adapter.SendFileAsync(this.Update.Chat.Id, file, caption, ct);
/// <summary>
/// Получить билдер альбомов.
/// </summary>
public IAlbumBuilder Albums => Adapter.CreateAlbumBuilder(this);
/// <summary>
/// Начать прогресс операции.
/// </summary>
public async Task<string?> StartProgressAsync(string title, CancellationToken ct)
{
var messageId = await Adapter.StartProgressAsync(this, title, ct);
if (messageId != null)
{
_progressMessageId = messageId;
_progressTitle = title;
}
return messageId;
}
/// <summary>
/// Обновить прогресс операции.
/// </summary>
public Task UpdateProgressAsync(int percent, CancellationToken ct)
{
if (_progressMessageId != null)
{
return Adapter.UpdateProgressAsync(this, _progressMessageId, _progressTitle ?? "", percent, ct);
}
else
{
return Task.CompletedTask;
}
}
/// <summary>
/// Обновить прогресс операции.
/// </summary>
public Task UpdateProgressAsync(string messageId, int percent, CancellationToken ct)
{
return Adapter.UpdateProgressAsync(this, messageId, _progressTitle ?? "", percent, ct);
}
private string? _progressMessageId = null;
private string? _progressTitle = null;
}