diff --git a/twitch.py b/twitch.py index 2f19001..487f163 100644 --- a/twitch.py +++ b/twitch.py @@ -923,7 +923,8 @@ class Twitch: kwargs["proxy"] = self.settings.proxy logger.debug(f"Request: ({method=}, {url=}, {kwargs=})") session_timeout = timedelta(seconds=session.timeout.total or 0) - for delay in ExponentialBackoff(maximum=3*60): + backoff = ExponentialBackoff(maximum=3*60) + for delay in backoff: if self.gui.close_requested: raise ExitRequest() elif ( @@ -947,7 +948,7 @@ class Twitch: self.print(_("error", "site_down").format(seconds=round(delay))) except (aiohttp.ClientConnectionError, asyncio.TimeoutError): # just so that quick retries that often happen, aren't shown - if delay > 1: + if backoff.steps > 1: self.print(_("error", "no_connection").format(seconds=round(delay))) finally: if response is not None: diff --git a/utils.py b/utils.py index f9fa29d..c021c78 100644 --- a/utils.py +++ b/utils.py @@ -195,8 +195,8 @@ class ExponentialBackoff: maximum: float = 300, ): if base <= 1: - raise ValueError("base has to be greater than 1") - self.exp: int = 0 + raise ValueError("Base has to be greater than 1") + self.steps: int = 0 self.base: float = float(base) self.shift: float = float(shift) self.maximum: float = float(maximum) @@ -208,12 +208,16 @@ class ExponentialBackoff: self.variance_min = 1 - variance self.variance_max = 1 + variance + @property + def exp(self) -> int: + return max(0, self.steps - 1) + def __iter__(self) -> abc.Iterator[float]: return self def __next__(self) -> float: value: float = ( - pow(self.base, self.exp) + pow(self.base, self.steps) * random.uniform(self.variance_min, self.variance_max) + self.shift ) @@ -222,11 +226,11 @@ class ExponentialBackoff: # NOTE: variance can cause the returned value to be lower than the previous one already, # so this should be safe to move past the first return, # to prevent the exponent from getting very big after reaching max and many iterations - self.exp += 1 + self.steps += 1 return value def reset(self) -> None: - self.exp = 0 + self.steps = 0 class OrderedSet(MutableSet[_T]):