From b37e4bb8b4371bf3230e74fff11c84ef7dd5c79a Mon Sep 17 00:00:00 2001 From: Frisk Date: Wed, 28 Aug 2024 23:54:36 +0200 Subject: [PATCH] Added Discord message cooldown in case Discord is returning server errors not to spam servers with messages --- src/discord/queue.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/discord/queue.py b/src/discord/queue.py index a20bb3a..46f8143 100644 --- a/src/discord/queue.py +++ b/src/discord/queue.py @@ -67,6 +67,7 @@ class MessageQueue: self._queue: list[QueueEntry] = [] self.webhook_suspensions: dict[str, asyncio.Task] = {} # Storing tasks counting one hour since last 404 self.global_rate_limit = False + self.discord_error_rate_tracker: float = 0.0 def __repr__(self): return self._queue @@ -90,6 +91,9 @@ class MessageQueue: def cut_messages(self, item_num: int): self._queue = self._queue[item_num:] + def track_discord_error_rate(self, number: float): + self.discord_error_rate_tracker = max(0, min(self.discord_error_rate_tracker+number, settings["max_discord_additional_await_time"])) + async def suspension_check(self, webhook_url: str): """Check after an hour if suspended webhook still returns ClientError""" logger.debug(f"Putting webhook {webhook_url} into suspension. Checking status in 2 hours.") @@ -184,6 +188,7 @@ class MessageQueue: except (aiohttp.ServerConnectionError, aiohttp.ServerTimeoutError, asyncio.TimeoutError): # Retry on next Discord message sent attempt logger.debug(f"Received timeout or connection error when sending a Discord message for {msg.wiki.script_url if hasattr(msg, "wiki") else "PATCH OR DELETE MESSAGE"}.") + self.track_discord_error_rate(1) return except aiohttp.ClientError as e: client_error = True @@ -198,6 +203,7 @@ class MessageQueue: if message and message.metadata.domain is not None: message.metadata.domain.discord_message_registration() if client_error is False: + self.track_discord_error_rate(-0.2) # decay on successful sends if method == "POST": msg.webhook = webhook_url msg.wiki.add_message(msg) @@ -225,7 +231,7 @@ class MessageQueue: tasks_to_run.append(self.send_msg_set(set_msgs)) await asyncio.gather(*tasks_to_run) # we wait for all send_msg_set functions to finish self._queue = [x for x in self._queue if x.complete() is False] # get rid of sent messages - await asyncio.sleep(1) + await asyncio.sleep(1+self.discord_error_rate_tracker) messagequeue = MessageQueue()