SeaCogs/aurora/importers/galacticbot.py

158 lines
5.2 KiB
Python

# pylint: disable=duplicate-code
import json
from datetime import timedelta
from time import time
from discord import ButtonStyle, Interaction, Message, ui
from redbot.core import commands
from redbot.core.utils.chat_formatting import box, warning
from ..utilities.database import connect, create_guild_table, mysql_log
class ImportGalacticBotView(ui.View):
def __init__(self, timeout, ctx, message):
super().__init__()
self.ctx: commands.Context = ctx
self.message: Message = message
@ui.button(label="Yes", style=ButtonStyle.success)
async def import_button_y(
self, interaction: Interaction, button: ui.Button
): # pylint: disable=unused-argument
await self.message.delete()
await interaction.response.send_message(
"Deleting original table...", ephemeral=True
)
database = connect()
cursor = database.cursor()
query = f"DROP TABLE IF EXISTS moderation_{self.ctx.guild.id};"
cursor.execute(query)
cursor.close()
database.commit()
await interaction.edit_original_response(content="Creating new table...")
await create_guild_table(self.ctx.guild)
await interaction.edit_original_response(content="Importing moderations...")
accepted_types = [
"NOTE",
"WARN",
"MUTE",
"UNMUTE",
"KICK",
"SOFTBAN",
"BAN",
"UNBAN",
"SLOWMODE",
"LOCKDOWN",
]
file = await self.ctx.message.attachments[0].read()
data = sorted(json.loads(file), key=lambda x: x["case"])
failed_cases = []
for case in data:
if case["type"] not in accepted_types:
continue
timestamp = round(case["timestamp"] / 1000)
try:
if case["duration"] is not None and float(case["duration"]) != 0:
duration = timedelta(seconds=round(float(case["duration"]) / 1000))
else:
duration = None
except OverflowError:
failed_cases.append(case["case"])
continue
metadata = {"imported_from": "GalacticBot", "imported_timestamp": int(time())}
if case["type"] == "SLOWMODE":
metadata["seconds"] = case["data"]["seconds"]
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 = None
resolved_reason = None
changes = []
if case["reason"] and case["reason"] != "N/A":
reason = case["reason"]
else:
reason = None
await mysql_log(
self.ctx.guild.id,
case["executor"],
case["type"],
case["targetType"],
case["target"],
0,
duration,
reason,
timestamp=timestamp,
resolved=resolved,
resolved_by=resolved_by,
resolved_reason=resolved_reason,
changes=changes,
metadata=metadata,
database=database,
)
await interaction.edit_original_response(content="Import complete.")
if failed_cases:
await interaction.edit_original_response(
content="Import complete.\n"
+ warning("Failed to import the following cases:\n")
+ box(failed_cases)
)
@ui.button(label="No", style=ButtonStyle.danger)
async def import_button_n(
self, interaction: Interaction, button: ui.Button
): # pylint: disable=unused-argument
await self.message.edit(content="Import cancelled.", view=None)
await self.message.delete(10)
await self.ctx.message.delete(10)