diff --git a/src/discord.py b/src/discord.py index 4db4871..79e1ed6 100644 --- a/src/discord.py +++ b/src/discord.py @@ -5,6 +5,7 @@ from src.misc import logger from src.config import settings from src.database import db_cursor from src.i18n import langs +from src.exceptions import EmbedListFull from asyncio import TimeoutError import aiohttp @@ -66,17 +67,16 @@ class DiscordMessage: return json.dumps(self.webhook_object) def __setup_embed(self): + """Setup another embed""" self.embed = defaultdict(dict) if "embeds" not in self.webhook_object: self.webhook_object["embeds"] = [self.embed] else: + if len(self.webhook_object["embeds"]) > 9: + raise EmbedListFull self.webhook_object["embeds"].append(self.embed) self.embed["color"] = None - def add_embed(self): - self.finish_embed() - self.__setup_embed() - def finish_embed(self): if self.embed["color"] is None: if settings["appearance"]["embed"].get(self.event_type, {"color": None})["color"] is None: @@ -103,6 +103,22 @@ class DiscordMessage: self.webhook_object["username"] = name +class StackedDiscordMessage(DiscordMessage): + def __init__(self, discordmessage: DiscordMessage): + if isinstance(discordmessage, StackedDiscordMessage): + raise TypeError("Cannot transform StackedDiscordMessage") + self.__dict__ = discordmessage.__dict__ + + def stack(self, messages: list): + for message in messages: + self.add_embed(message.embed) + + def add_embed(self, embed): + self.finish_embed() + self.__setup_embed() + self.embed = embed + + # Monitoring webhook functions async def wiki_removal_monitor(wiki_url, status): await send_to_discord_webhook_monitoring(DiscordMessage("compact", "webhook/remove", content="Removing {} because {}.".format(wiki_url, status), webhook_url=[None], wiki=None)) diff --git a/src/exceptions.py b/src/exceptions.py index 0d54bb6..a6c3f68 100644 --- a/src/exceptions.py +++ b/src/exceptions.py @@ -20,4 +20,7 @@ class QueueEmpty(Exception): pass class ListFull(Exception): + pass + +class EmbedListFull(Exception): pass \ No newline at end of file diff --git a/src/msgqueue.py b/src/msgqueue.py index 144a0ac..7c3802d 100644 --- a/src/msgqueue.py +++ b/src/msgqueue.py @@ -1,6 +1,7 @@ import asyncio, logging, aiohttp -from src.discord import send_to_discord_webhook +from src.discord import send_to_discord_webhook, DiscordMessage, StackedDiscordMessage from src.config import settings +from math import ceil from collections import defaultdict logger = logging.getLogger("rcgcdw.msgqueue") @@ -42,6 +43,18 @@ class MessageQueue: async def send_msg_set(self, msg_set: tuple): webhook_url, messages = msg_set # str("daosdkosakda/adkahfwegr34", list(DiscordMessage, DiscordMessage, DiscordMessage) + if len(messages) > 1 and messages[0].message_type == "embed": + for i, msg in enumerate(messages): + if isinstance(msg, DiscordMessage): + break + for group_index in range(ceil(len(messages)/10)): + message_group_index = group_index*10+i + stackable = StackedDiscordMessage(messages[message_group_index]) #TODO Find a way to replace item on the list with stacked message + for message in messages[message_group_index+1:message_group_index+9]: + stackable.add_embed(message.embed) + self._queue.remove(message) + messages.remove(message) + for msg in messages: if self.global_rate_limit: return # if we are globally rate limited just wait for first gblocked request to finish