Files
Telegrator/Telegrator/Attributes/Components/UpdateHandlerAttributeBase.cs
T
Rikitav bf66431089 * Added "INamedFilter" to tagging filters. Required for fallbacking system
* AnonymousCompiledFilter now has undependent realization
* All internal filters now implement INamedFilter interface
* Added new static methods to "Filter" class
* Added Filters fallbacking system
* Added "FiltersFallback" method in "UpdatehandlerBase"
* Changed filters validating system to be able to report failed filters
* Added "FiltersFallbackReport" class
* Added "FormReport" Property to "UpdateHandlerAttributeBase"
* Version incremented
2025-08-08 17:04:56 +04:00

80 lines
3.3 KiB
C#

using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegrator.Filters.Components;
using Telegrator.Handlers.Components;
using Telegrator.MadiatorCore.Descriptors;
namespace Telegrator.Attributes.Components
{
/// <summary>
/// Defines the <see cref="UpdateType"/>'s and validator (<see cref="IFilter{T}"/>) of the <see cref="Update"/> that <see cref="UpdateHandlerBase"/> will process
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public abstract class UpdateHandlerAttributeBase : Attribute, IFilter<Update>
{
/// <inheritdoc/>
public bool IsCollectible => this.HasPublicProperties();
/// <summary>
/// Gets an array of <see cref="UpdateHandlerBase"/> that this attribute can be attached to
/// </summary>
public Type[] ExpectingHandlerType { get; private set; }
/// <summary>
/// Gets an <see cref="UpdateType"/> that handlers processes
/// </summary>
public UpdateType Type { get; private set; }
/// <summary>
/// Gets or sets importance of this <see cref="UpdateHandlerBase"/> in same <see cref="UpdateType"/> pool
/// </summary>
public int Importance { get; set; }
/// <summary>
/// Gets or sets priority of this <see cref="UpdateHandlerBase"/> in same type handlers pool
/// </summary>
public int Priority { get; set; }
public bool FormReport { get; set; }
/// <summary>
/// Creates a new instance of <see cref="UpdateHandlerAttributeBase"/>
/// </summary>
/// <param name="expectingHandlerType"></param>
/// <param name="updateType"></param>
/// <param name="importance"></param>
/// <exception cref="ArgumentNullException"></exception>
/// <exception cref="ArgumentException"></exception>
/// <exception cref="Exception"></exception>
protected internal UpdateHandlerAttributeBase(Type[] expectingHandlerType, UpdateType updateType, int importance = 0)
{
if (expectingHandlerType == null)
throw new ArgumentNullException(nameof(expectingHandlerType));
if (expectingHandlerType.Any(type => !type.IsHandlerAbstract()))
throw new ArgumentException("One of expectingHandlerType is not a handler type", nameof(expectingHandlerType));
if (updateType == UpdateType.Unknown)
throw new Exception();
ExpectingHandlerType = expectingHandlerType;
Type = updateType;
Importance = importance;
}
/// <summary>
/// Gets an <see cref="DescriptorIndexer"/> of this <see cref="UpdateHandlerAttributeBase"/> from <see cref="Importance"/> and <see cref="Priority"/>
/// </summary>
/// <returns></returns>
public DescriptorIndexer GetIndexer()
=> new DescriptorIndexer(0, this);
/// <summary>
/// Validator (<see cref="IFilter{T}"/>) of the <see cref="Update"/> that <see cref="UpdateHandlerBase"/> will process
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public abstract bool CanPass(FilterExecutionContext<Update> context);
}
}