/// <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()); }