[commands] Split Cooldown state processing to two different functions.

This allows us to check if we are rate limited without
creating a new cool-down window for the command.
This commit is contained in:
MysterialPy
2017-09-27 21:37:07 +10:00
committed by Rapptz
parent b22f7c76c5
commit bae6f80327
2 changed files with 34 additions and 8 deletions

View File

@ -48,20 +48,27 @@ class Cooldown:
if not isinstance(self.type, BucketType):
raise TypeError('Cooldown type must be a BucketType')
def is_rate_limited(self):
def get_tokens(self, current=None):
if not current:
current = time.time()
tokens = self._tokens
if current > self._window + self.per:
tokens = self.rate
return tokens
def update_rate_limit(self):
current = time.time()
self._last = current
self._tokens = self.get_tokens(current)
# first token used means that we start a new rate limit window
if self._tokens == self.rate:
self._window = current
# check if our window has passed and we can refresh our tokens
if current > self._window + self.per:
self._tokens = self.rate
self._window = current
# check if we're rate limited
# check if we are rate limited
if self._tokens == 0:
return self.per - (current - self._window)