Esempio n. 1
0
        /// <summary>
        ///     Runs cooldowns on this command.
        /// </summary>
        /// <param name="context"> The <see cref="ICommandContext"/> used for execution. </param>
        /// <param name="provider"> The <see cref="IServiceProvider"/> used for execution. </param>
        /// <returns>
        ///     A <see cref="SuccessfulResult"/> if no buckets are ratelimited, otherwise a <see cref="CommandOnCooldownResult"/>.
        /// </returns>
        public IResult RunCooldowns(ICommandContext context, IServiceProvider provider = null)
        {
            if (CooldownMap != null)
            {
                if (provider is null)
                {
                    provider = EmptyServiceProvider.Instance;
                }

                CooldownMap.Update();
                var buckets     = Cooldowns.Select(x => CooldownMap.GetBucket(x, context, provider)).ToImmutableArray();
                var rateLimited = new List <(Cooldown, TimeSpan)>(buckets.Length);
                for (var i = 0; i < buckets.Length; i++)
                {
                    var bucket = buckets[i];
                    if (bucket != null && bucket.IsRateLimited(out var retryAfter))
                    {
                        rateLimited.Add((bucket.Cooldown, retryAfter));
                    }
                }

                if (rateLimited.Count > 0)
                {
                    return(new CommandOnCooldownResult(this, rateLimited.ToImmutableArray()));
                }

                for (var i = 0; i < buckets.Length; i++)
                {
                    buckets[i]?.Decrement();
                }
            }

            return(new SuccessfulResult());
        }