PRBackgroundTaskAttribute

using PRTelegramBot.BackgroundTasks.Interfaces;
using PRTelegramBot.Extensions;

namespace PRTelegramBot.BackgroundTasks
{
    /// <summary>
    /// Атрибут метаданных фоновой задачи.
    /// </summary>
    [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
    public sealed class PRBackgroundTaskAttribute : Attribute, IPRBackgroundTaskMetadata
    {
        #region IPRBackgroundTaskMetadata

         /// <summary>
        /// Идентификатор бота для которого предназначена фоновая задача.
        /// Не обязательный параметр. Требуется, чтобы через DI можно было разграничить фоновые задачи для разных ботов.
        /// Пустая коллекция или значение "-1" означает, что это используется для всех ботов.
        /// </summary>
        public HashSet<long> BotIds { get; } = new HashSet<long>();

         /// <summary>
        /// Идентификатор задачи.
        /// </summary>
        public Guid Id { get; private set; }

        /// <summary>
        /// Уникальное название фоновой задачи.
        /// Используется для логирования, диагностики и идентификации задачи.
        /// </summary>
        public string Name { get; private set; }

        /// <summary>
        /// Задержка перед первым запуском фоновой задачи в секундах.
        /// Значение 0 или меньше означает немедленный запуск после старта бота.
        /// </summary>
        public int? InitialDelaySeconds { get; private set; }

         /// <summary>
        /// Интервал повторного выполнения фоновой задачи в секундах.
        /// Минимальный интервал повторения всегда будет 1 секунда.
        /// </summary>
        public int? RepeatSeconds { get; private set; }

        /// <summary>
        /// Максимальное количество запусков фоновой задачи (успешных и неуспешных).
        /// Значение null || -1  означает бесконечное выполнение.
        /// </summary>
        public int? MaxErrorAttempts { get; private set; }

        /// <summary>
        /// Максимальное количество попыток выполнения фоновой задачи при ошибке
        /// (включая первый запуск).
        /// Значение 1 означает однократное выполнение без повторов.
        /// </summary>
        public int? MaxRepeatCount { get; private set; }

        #endregion

        #region Конструкторы

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="id">Идентификатор.</param>
        /// <param name="name">Название задачи.</param>
        public PRBackgroundTaskAttribute(string id, string name)
            : this(Array.Empty<long>(), id, name, null, null, null, null) { }

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="id">Идентификатор.</param>
        /// <param name="name">Название задачи.</param>
        /// <param name="initialDelaySeconds">Задержка перед запуском задачи</param>
        public PRBackgroundTaskAttribute(string id, int initialDelaySeconds, string name)
            : this(Array.Empty<long>(), id, name, initialDelaySeconds, null, null, null) { }

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="id">Идентификатор.</param>
        /// <param name="name">Название задачи.</param>
        /// <param name="repeatSeconds">Через сколько задача должна снова выполниться.</param>
        public PRBackgroundTaskAttribute(string id, string name, int repeatSeconds)
            : this(Array.Empty<long>(), id, name, null, null, repeatSeconds, null) { }

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="id">Идентификатор.</param>
        /// <param name="name">Название задачи.</param>
        /// <param name="repeatSeconds">Через сколько задача должна снова выполниться.</param>
        /// <param name="maxRepeatCount">Через сколько задача должна снова выполниться.</param>
        public PRBackgroundTaskAttribute(string id, string name, int repeatSeconds, int maxRepeatCount)
            : this(Array.Empty<long>(), id, name, null, maxRepeatCount, repeatSeconds, null) { }

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="id">Идентификатор.</param>
        /// <param name="initialDelaySeconds">Задержка перед запуском задачи</param>
        /// <param name="name">Название задачи.</param>
        /// <param name="repeatSeconds">Через сколько задача должна снова выполниться.</param>
        public PRBackgroundTaskAttribute(string id, int initialDelaySeconds, string name, int repeatSeconds)
            : this(Array.Empty<long>(), id, name, initialDelaySeconds, null, repeatSeconds, null) { }

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="id">Идентификатор.</param>
        /// <param name="initialDelaySeconds">Задержка перед запуском задачи</param>
        /// <param name="name">Название задачи.</param>
        /// <param name="maxRepeatCount">Через сколько задача должна снова выполниться.</param>
        /// <param name="repeatSeconds">Через сколько задача должна снова выполниться.</param>
        public PRBackgroundTaskAttribute(string id, int initialDelaySeconds, string name, int repeatSeconds, int maxRepeatCount) 
            : this(Array.Empty<long>(), id, name, initialDelaySeconds, maxRepeatCount, repeatSeconds, null) { }

        /// <summary>
        /// Конструктор.
        /// </summary>
        /// <param name="botsIds">Идентификатор ботов, для который будет использоваться задача.</param>
        /// <param name="id">Идентификатор.</param>
        /// <param name="name">Название задачи.</param>
        /// <param name="initialDelaySeconds">Задержка перед запуском задачи</param>
        /// <param name="maxRepeatCount">Через сколько задача должна снова выполниться. Значение -1 означает неограниченное количество попыток.</param>
        /// <param name="repeatSeconds">Через сколько задача должна снова выполниться.</param>
        /// <param name="maxErrorAttempts">Максимальное количество ошибок при котором дальнейшее выполнение задачи прекращается. Значение -1 означает неограниченное количество попыток.</param>
        public PRBackgroundTaskAttribute(long[] botsIds, string id, string name, int? initialDelaySeconds, int? maxRepeatCount, int? repeatSeconds, int? maxErrorAttempts)
        {
            if (string.IsNullOrWhiteSpace(id))
                throw new ArgumentException("Task id cannot be null or empty.", nameof(id));

            if (string.IsNullOrWhiteSpace(name))
                throw new ArgumentException("Task name cannot be null or empty.", nameof(name));

            BotIds.AddRange(botsIds);
            Id = Guid.Parse(id);
            Name = name;
            InitialDelaySeconds = initialDelaySeconds;
            RepeatSeconds = repeatSeconds;
            MaxErrorAttempts = maxErrorAttempts;
            MaxRepeatCount = maxRepeatCount;
        }

        #endregion
    }
}

Last updated