From a0b9cb3c1e6eb1e0e5169a72505c2dcf29e78437 Mon Sep 17 00:00:00 2001 From: Frisk Date: Fri, 6 Sep 2024 18:49:59 +0200 Subject: [PATCH] Fixed issue with Discord's merging of messages and debug dump trying to serialize bytes objects in db queries --- src/discord/message.py | 3 +++ src/domain_manager.py | 2 +- src/misc.py | 13 +++++++++++++ src/queue_handler.py | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/discord/message.py b/src/discord/message.py index d1be765..a608088 100644 --- a/src/discord/message.py +++ b/src/discord/message.py @@ -272,6 +272,9 @@ class StackedDiscordMessage: def add_message(self, message: DiscordMessage): if self.check_for_length(len(message)): raise MessageTooBig + # Discord merges multiple embeds with same URL into one, this is why we must to add dummy argument for this not to happen + if self.message_type == 1 and any(message.embed["url"] == stackedmessage.embed["url"] for stackedmessage in self.message_list): + message.embed["url"] += ("&" if "?" in message.embed["url"] else "?") + "_id=" + str(len(self.message_list)) self.length += len(message) + (self.message_type == 0) self.message_list.append(message) # self._setup_embed() diff --git a/src/domain_manager.py b/src/domain_manager.py index fd697af..5555e74 100644 --- a/src/domain_manager.py +++ b/src/domain_manager.py @@ -99,7 +99,7 @@ class DomainManager: "tasks": {}, "domains": {}, "queued_messages": [], - "awaiting_DB_queries": dbmanager.updated, + "awaiting_DB_queries": dbmanager.json(), "total_discord_messages_sent": sum([x.total_discord_messages_sent for x in self.domains.values()]) } for task in asyncio.all_tasks(): diff --git a/src/misc.py b/src/misc.py index b888212..dc22e89 100644 --- a/src/misc.py +++ b/src/misc.py @@ -1,5 +1,6 @@ from __future__ import annotations +import functools import json from functools import cache from html.parser import HTMLParser @@ -248,3 +249,15 @@ class LimitedList(list): def __repr__(self): return "\n".join([str(x) for x in self]) + + +def catch_exceptions(passed_context): + def wrapper(func): + @functools.wraps(func) + async def wrapped(*args, **kwargs): + try: + return await func(*args, **kwargs) + except Exception as e: + + return wrapped + return wrapper diff --git a/src/queue_handler.py b/src/queue_handler.py index e06f00e..d1fd218 100644 --- a/src/queue_handler.py +++ b/src/queue_handler.py @@ -13,6 +13,10 @@ class UpdateDB: def __init__(self): self.updated: list[tuple[str, tuple[Union[str, int], ...]]] = [] + def json(self): + # since pickled Discord messages are bytes object which is not serializable, we strip it here + return [(item[0], [arg for arg in item[1] if not isinstance(arg, bytes)]) for item in self.updated] + def add(self, sql_expression: tuple[str, tuple[Union[str, int, bytes], ...]]): self.updated.append(sql_expression)