108 lines
3.8 KiB
C#
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, text, format, inline, reply, ct);
|
|
|
|
/// <summary>
|
|
/// Отправить файл.
|
|
/// </summary>
|
|
public Task SendFileAsync(FileDescriptor file, string? caption = null, CancellationToken ct = default)
|
|
=> Adapter.SendFileAsync(this, 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;
|
|
|
|
} |