From c700782e17354645976b0b2983868953ae575b5e Mon Sep 17 00:00:00 2001 From: SeaswimmerTheFsh Date: Sat, 16 Dec 2023 13:35:12 -0500 Subject: [PATCH] fix(moderation): galacticbot import loop should no longer be blocking --- moderation/moderation.py | 102 +++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 48 deletions(-) diff --git a/moderation/moderation.py b/moderation/moderation.py index 7c7c0e5..c9ef28b 100644 --- a/moderation/moderation.py +++ b/moderation/moderation.py @@ -5,6 +5,7 @@ # ____) | __/ (_| \__ \\ V V /| | | | | | | | | | | | __/ | # |_____/ \___|\__,_|___/ \_/\_/ |_|_| |_| |_|_| |_| |_|\___|_| +import asyncio import logging import json import time @@ -1734,61 +1735,66 @@ class Moderation(commands.Cog): 'BAN', 'UNBAN' ] + file = await self.ctx.message.attachments[0].read() data = sorted(json.loads(file), key=lambda x: x['case']) - for case in data: - if case['type'] not in accepted_types: - continue - timestamp = round(case['timestamp'] / 1000) - - if case['duration']: - try: - duration = timedelta(seconds=round(float(case['duration']) / 1000)) - except OverflowError: + async def process_case(case, accepted_types): + for case in data: + if case['type'] not in accepted_types: continue - if case['resolved']: - resolved = 1 - resolved_by = None - resolved_reason = None - resolved_timestamp = None - if case['changes']: - for change in case['changes']: - if change['type'] == 'RESOLVE': - resolved_by = change['staff'] - resolved_reason = change['reason'] - resolved_timestamp = round(change['timestamp'] / 1000) - break - if resolved_by is None: - resolved_by = '?' - if resolved_reason is None: - resolved_reason = 'Could not get resolve reason during moderation import.' - if resolved_timestamp is None: - resolved_timestamp = timestamp - changes = [ - { - 'type': "ORIGINAL", - 'reason': case['reason'], - 'user_id': case['executor'], - 'timestamp': timestamp - }, - { - 'type': "RESOLVE", - 'reason': resolved_reason, - 'user_id': resolved_by, - 'timestamp': resolved_timestamp - } - ] - else: - resolved = 0 - resolved_by = 'NULL' - resolved_reason = 'NULL' - changes = [] + timestamp = round(case['timestamp'] / 1000) - await Moderation.mysql_log(self.cog_instance, self.ctx.guild.id, case['executor'], case['type'], case['target'], 0, duration, case['reason'], timestamp=timestamp, resolved=resolved, resolved_by=resolved_by, resolved_reason=resolved_reason, changes=changes, database=database) + if case['duration']: + try: + duration = timedelta(seconds=round(case['duration']) / 1000) + except OverflowError: + continue - await interaction.edit_original_response(content="Import complete.") + if case['resolved']: + resolved = 1 + resolved_by = None + resolved_reason = None + resolved_timestamp = None + if case['changes']: + for change in case['changes']: + if change['type'] == 'RESOLVE': + resolved_by = change['staff'] + resolved_reason = change['reason'] + resolved_timestamp = round(change['timestamp'] / 1000) + break + if resolved_by is None: + resolved_by = '?' + if resolved_reason is None: + resolved_reason = 'Could not get resolve reason during moderation import.' + if resolved_timestamp is None: + resolved_timestamp = timestamp + changes = [ + { + 'type': "ORIGINAL", + 'reason': case['reason'], + 'user_id': case['executor'], + 'timestamp': timestamp + }, + { + 'type': "RESOLVE", + 'reason': resolved_reason, + 'user_id': resolved_by, + 'timestamp': resolved_timestamp + } + ] + else: + resolved = 0 + resolved_by = 'NULL' + resolved_reason = 'NULL' + changes = [] + + await Moderation.mysql_log(self.cog_instance, self.ctx.guild.id, case['executor'], case['type'], case['target'], 0, duration, case['reason'], timestamp=timestamp, resolved=resolved, resolved_by=resolved_by, resolved_reason=resolved_reason, changes=changes, database=database) + + await interaction.edit_original_response(content="Import complete.") + + await asyncio.gather(*[process_case(case, accepted_types) for case in data]) @discord.ui.button(label="No", style=discord.ButtonStyle.danger) async def import_button_n(self, interaction: discord.Interaction, button: discord.ui.Button): # pylint: disable=unused-argument