2025-07-27 14:19:40 +04:00
|
|
|
using Telegram.Bot.Types.Enums;
|
2025-07-24 23:19:59 +04:00
|
|
|
using Telegrator.MadiatorCore;
|
|
|
|
|
using Telegrator.MadiatorCore.Descriptors;
|
|
|
|
|
|
|
|
|
|
namespace Telegrator.Providers
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Provider for managing awaiting handlers that can wait for specific update types.
|
|
|
|
|
/// Extends HandlersProvider to provide functionality for creating and managing awaiter handlers.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="options">The bot configuration options.</param>
|
2025-07-28 20:35:48 +04:00
|
|
|
public class AwaitingProvider(TelegratorOptions options) : HandlersProvider([], options), IAwaitingProvider
|
2025-07-24 23:19:59 +04:00
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// List of handler descriptors for awaiting handlers.
|
|
|
|
|
/// </summary>
|
|
|
|
|
protected readonly HandlerDescriptorList HandlersList = [];
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
2025-07-27 14:19:40 +04:00
|
|
|
public override bool TryGetDescriptorList(UpdateType updateType, out HandlerDescriptorList? list)
|
2025-07-24 23:19:59 +04:00
|
|
|
{
|
2025-07-27 14:19:40 +04:00
|
|
|
list = HandlersList;
|
|
|
|
|
return true;
|
2025-07-24 23:19:59 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public IDisposable UseHandler(HandlerDescriptor handlerDescriptor)
|
|
|
|
|
{
|
|
|
|
|
HandlerToken handlerToken = new HandlerToken(HandlersList, handlerDescriptor);
|
|
|
|
|
handlerToken.Register();
|
|
|
|
|
return handlerToken;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Token for managing the lifetime of a handler in the awaiting provider.
|
|
|
|
|
/// Implements IDisposable to automatically remove the handler when disposed.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="handlersList">The list of handler descriptors.</param>
|
|
|
|
|
/// <param name="handlerDescriptor">The handler descriptor to manage.</param>
|
|
|
|
|
private readonly struct HandlerToken(HandlerDescriptorList handlersList, HandlerDescriptor handlerDescriptor) : IDisposable
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Registers the handler descriptor in the handlers list.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <exception cref="Exception">Thrown when the handler descriptor has no singleton instance.</exception>
|
|
|
|
|
public readonly void Register()
|
|
|
|
|
{
|
|
|
|
|
if (handlerDescriptor.SingletonInstance == null)
|
|
|
|
|
throw new Exception();
|
|
|
|
|
|
|
|
|
|
handlersList.Add(handlerDescriptor);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Disposes of the handler token by removing the handler descriptor from the list.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public readonly void Dispose()
|
|
|
|
|
{
|
|
|
|
|
handlersList.Remove(handlerDescriptor.Indexer);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|