Added Discord message cooldown in case Discord is returning server errors not to spam servers with messages

This commit is contained in:
Frisk 2024-08-28 23:54:36 +02:00
parent f81942a962
commit b37e4bb8b4

View file

@ -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()