fix(aurora): fixing a whole bunch of stuff

This commit is contained in:
Seaswimmer 2024-05-06 14:15:05 -04:00
parent 0553856aa9
commit 37e471fbaa
Signed by untrusted user: cswimr
GPG key ID: 5D671B5D03D65A7F
4 changed files with 118 additions and 13 deletions

View file

@ -8,7 +8,8 @@ from discord import ButtonStyle, Interaction, Message, ui
from redbot.core import commands from redbot.core import commands
from redbot.core.utils.chat_formatting import box, warning from redbot.core.utils.chat_formatting import box, warning
from ..utilities.database import connect, create_guild_table, mysql_log from aurora.models import Moderation
from aurora.utilities.database import connect, create_guild_table
class ImportAuroraView(ui.View): class ImportAuroraView(ui.View):
@ -91,7 +92,8 @@ class ImportAuroraView(ui.View):
else: else:
duration = None duration = None
await mysql_log( Moderation.log(
interaction.client,
self.ctx.guild.id, self.ctx.guild.id,
case["moderator_id"], case["moderator_id"],
case["moderation_type"], case["moderation_type"],

View file

@ -1,4 +1,6 @@
import sqlite3
from datetime import datetime, timedelta from datetime import datetime, timedelta
from time import time
from typing import Any, Dict, List, Literal, Optional, Union from typing import Any, Dict, List, Literal, Optional, Union
from discord import Forbidden, HTTPException, InvalidData, NotFound from discord import Forbidden, HTTPException, InvalidData, NotFound
@ -6,7 +8,7 @@ from pydantic import BaseModel, ConfigDict
from redbot.core.bot import Red from redbot.core.bot import Red
from aurora.utilities.logger import logger from aurora.utilities.logger import logger
from aurora.utilities.utils import generate_dict from aurora.utilities.utils import generate_dict, get_next_case_number
class AuroraBaseModel(BaseModel): class AuroraBaseModel(BaseModel):
@ -80,7 +82,6 @@ class Moderation(AuroraGuildModel):
def update(self): def update(self):
from aurora.utilities.database import connect from aurora.utilities.database import connect
from aurora.utilities.json import dumps
query = f"UPDATE moderation_{self.guild_id} SET timestamp = ?, moderation_type = ?, target_type = ?, moderator_id = ?, role_id = ?, duration = ?, end_timestamp = ?, reason = ?, resolved = ?, resolved_by = ?, resolve_reason = ?, expired = ?, changes = ?, metadata = ? WHERE moderation_id = ?;" query = f"UPDATE moderation_{self.guild_id} SET timestamp = ?, moderation_type = ?, target_type = ?, moderator_id = ?, role_id = ?, duration = ?, end_timestamp = ?, reason = ?, resolved = ?, resolved_by = ?, resolve_reason = ?, expired = ?, changes = ?, metadata = ? WHERE moderation_id = ?;"
with connect() as database: with connect() as database:
@ -98,8 +99,8 @@ class Moderation(AuroraGuildModel):
self.resolved_by, self.resolved_by,
self.resolve_reason, self.resolve_reason,
self.expired, self.expired,
dumps(self.changes).replace('\\"', '"').replace('["{', '[{').replace('}"]', '}]'), self.changes,
dumps(self.metadata).replace('\\"', '"').replace('["{', '[{').replace('}"]', '}]'), self.metadata,
self.moderation_id self.moderation_id
)) ))
cursor.close() cursor.close()
@ -119,8 +120,8 @@ class Moderation(AuroraGuildModel):
self.resolved_by, self.resolved_by,
self.resolve_reason, self.resolve_reason,
self.expired, self.expired,
dumps(self.changes).replace('\\"', '"').replace('["{', '[{').replace('}"]', '}]'), self.changes,
dumps(self.metadata).replace('\\"', '"').replace('["{', '[{').replace('}"]', '}]'), self.metadata,
) )
@classmethod @classmethod
@ -144,6 +145,107 @@ class Moderation(AuroraGuildModel):
def from_dict(cls, bot: Red, data: dict) -> "Moderation": def from_dict(cls, bot: Red, data: dict) -> "Moderation":
return cls(bot=bot, **data) return cls(bot=bot, **data)
@classmethod
def log(
cls,
bot: Red,
guild_id: int,
author_id: int,
moderation_type: str,
target_type: str,
target_id: int,
role_id: int,
duration: timedelta = None,
reason: str = None,
database: sqlite3.Connection = None,
timestamp: datetime = None,
resolved: bool = False,
resolved_by: int = None,
resolved_reason: str = None,
expired: bool = None,
changes: list = None,
metadata: dict = None,
) -> "Moderation":
from aurora.utilities.database import connect
if not timestamp:
timestamp = datetime.fromtimestamp(time())
elif not isinstance(timestamp, datetime):
timestamp = datetime.fromtimestamp(timestamp)
if duration != "NULL" and duration is not None:
end_timedelta = timestamp + duration
end_timestamp = int(end_timedelta.timestamp())
else:
duration = None
end_timestamp = None
if not expired:
if timestamp.timestamp() > end_timestamp:
expired = True
else:
expired = False
if reason == "NULL":
reason = None
if resolved_by == "NULL":
resolved_by = None
if resolved_reason == "NULL":
resolved_reason = None
if role_id == 0:
role_id = None
if not database:
database = connect()
close_db = True
else:
close_db = False
cursor = database.cursor()
moderation_id = get_next_case_number(guild_id=guild_id, cursor=cursor)
case = {
"guild_id": guild_id,
"moderation_id": moderation_id,
"timestamp": timestamp,
"moderation_type": moderation_type,
"target_type": target_type,
"target_id": target_id,
"moderator_id": author_id,
"role_id": role_id,
"duration": duration,
"end_timestamp": end_timestamp,
"reason": reason,
"resolved": resolved,
"resolved_by": resolved_by,
"resolve_reason": resolved_reason,
"expired": expired,
"changes": changes,
"metadata": metadata
}
case_safe = case.copy()
case_safe.pop("guild_id")
case_safe["timestamp"] = case_safe["timestamp"].timestamp()
case_safe["end_timestamp"] = case_safe["end_timestamp"].timestamp() if case_safe["end_timestamp"] else None
sql = f"INSERT INTO `moderation_{guild_id}` (moderation_id, timestamp, moderation_type, target_type, target_id, moderator_id, role_id, duration, end_timestamp, reason, resolved, resolved_by, resolve_reason, expired, changes, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
cursor.execute(sql, case_safe.values())
cursor.close()
database.commit()
if close_db:
database.close()
logger.debug(
"Row inserted into moderation_%s!\n%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s",
guild_id, case_safe.values()
)
return cls.from_dict(bot=bot, **case)
class Change(AuroraBaseModel): class Change(AuroraBaseModel):
type: Literal["ORIGINAL", "RESOLVE", "EDIT"] type: Literal["ORIGINAL", "RESOLVE", "EDIT"]
timestamp: datetime timestamp: datetime

View file

@ -8,7 +8,8 @@ from discord import Guild
from redbot.core import data_manager from redbot.core import data_manager
from .logger import logger from .logger import logger
from .utils import convert_timedelta_to_str, generate_dict, get_next_case_number from .utils import (convert_timedelta_to_str, generate_dict,
get_next_case_number)
def connect() -> sqlite3.Connection: def connect() -> sqlite3.Connection:
@ -103,7 +104,7 @@ async def create_guild_table(guild: Guild):
database.close() database.close()
async def mysql_log( def mysql_log(
guild_id: str, guild_id: str,
author_id: str, author_id: str,
moderation_type: str, moderation_type: str,
@ -158,7 +159,7 @@ async def mysql_log(
close_db = False close_db = False
cursor = database.cursor() cursor = database.cursor()
moderation_id = await get_next_case_number(guild_id=guild_id, cursor=cursor) moderation_id = get_next_case_number(guild_id=guild_id, cursor=cursor)
sql = f"INSERT INTO `moderation_{guild_id}` (moderation_id, timestamp, moderation_type, target_type, target_id, moderator_id, role_id, duration, end_timestamp, reason, resolved, resolved_by, resolve_reason, expired, changes, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" sql = f"INSERT INTO `moderation_{guild_id}` (moderation_id, timestamp, moderation_type, target_type, target_id, moderator_id, role_id, duration, end_timestamp, reason, resolved, resolved_by, resolve_reason, expired, changes, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
val = ( val = (

View file

@ -111,9 +111,9 @@ async def check_moddable(
return True return True
async def get_next_case_number(guild_id: str, cursor=None) -> int: def get_next_case_number(guild_id: str, cursor=None) -> int:
"""This function returns the next case number from the MySQL table for a specific guild.""" """This function returns the next case number from the MySQL table for a specific guild."""
from .database import connect from aurora.utilities.database import connect
if not cursor: if not cursor:
database = connect() database = connect()