public virtual bool Audit(T watchId, Action rateLimiteResponder = null)
        {
            var id = watchId;

            watchList.Add(id);
            if (IsLimited(watchId))
            {
                var limitedEntity = new LimitedEntity
                {
                    Id        = id,
                    StartTime = DateTime.Now,
                    Timer     = new Timer
                    {
                        Interval  = cooldown,
                        AutoReset = false
                    }
                };
                if (limitedEntities.Add(limitedEntity))
                {
                    limitedEntity.Timer.Start();
                    limitedEntity.Timer.Elapsed += (sender, _) => HandleLimitedEntityRelease(sender as Timer, limitedEntity);
                    Logger.Debug(limitedEntity, $"[{limiterDebugName}] Rate Limting");
                    rateLimiteResponder?.Invoke();
                    return(true);
                }
            }

            return(limitedEntities.Any(x => x.Id.Equals(id)));
        }
 private void HandleLimitedEntityRelease(Timer timer, LimitedEntity entity)
 {
     timer.Dispose();
     watchList.RemoveAll(x => x.Equals(entity.Id));
     limitedEntities.RemoveWhere(x => x.Id.Equals(entity.Id));
 }