From 8823e9eb2af04e198df21f5b3dc9c0356117e463 Mon Sep 17 00:00:00 2001 From: wlinator Date: Thu, 18 Jul 2024 12:24:57 -0400 Subject: [PATCH] refactor: Add error message for case not found --- config/JSON/strings.json | 2 + modules/moderation/__init__.py | 18 ++++++- modules/moderation/cases.py | 76 +++++++++++++++++------------ services/moderation/case_service.py | 22 ++++++++- 4 files changed, 84 insertions(+), 34 deletions(-) diff --git a/config/JSON/strings.json b/config/JSON/strings.json index c9e95c5..835106b 100644 --- a/config/JSON/strings.json +++ b/config/JSON/strings.json @@ -30,6 +30,8 @@ "error_lumi_exception_description": "{0}", "error_missing_permissions_author": "Missing Permissions", "error_missing_permissions_description": "you lack the required permissions to run this command.", + "error_no_case_found_author": "Case Not Found", + "error_no_case_found_description": "no case found with that ID.", "error_no_private_message_author": "Guild Only", "error_no_private_message_description": "this command can only be used in servers.", "error_not_allowed_in_channel_author": "Not Allowed In Channel", diff --git a/modules/moderation/__init__.py b/modules/moderation/__init__.py index 1b09f30..a2923e9 100644 --- a/modules/moderation/__init__.py +++ b/modules/moderation/__init__.py @@ -1,7 +1,7 @@ import discord from discord.ext import bridge, commands -from modules.moderation import ban +from modules.moderation import ban, cases class Moderation(commands.Cog): @@ -46,6 +46,22 @@ class Moderation(commands.Cog): ): await ban.unban_user(ctx, target, reason) + @bridge.bridge_command( + name="case", + aliases=["c"], + description="View a case by its number.", + help="Views a case by its number in the server.", + guild_only=True, + ) + @bridge.has_permissions(view_audit_log=True) + @commands.guild_only() + async def case_command( + self, + ctx, + case_number: int, + ): + await cases.view_case_by_number(ctx, ctx.guild.id, case_number) + def setup(client): client.add_cog(Moderation(client)) diff --git a/modules/moderation/cases.py b/modules/moderation/cases.py index 1456f91..a3ed8a9 100644 --- a/modules/moderation/cases.py +++ b/modules/moderation/cases.py @@ -1,5 +1,8 @@ -from discord.ext import pages +from discord.ext.commands import UserConverter from services.moderation.case_service import CaseService +from modules.moderation.utils.case_embed import create_case_embed +from lib.embed_builder import EmbedBuilder +from lib.constants import CONST case_service = CaseService() @@ -8,47 +11,58 @@ async def view_case_by_number(ctx, guild_id: int, case_number: int): case = case_service.fetch_case_by_guild_and_number(guild_id, case_number) if not case: - return await ctx.send("No case found with that ID.") + embed = EmbedBuilder.create_error_embed( + ctx, + author_text=CONST.STRINGS["error_no_case_found_author"], + description=CONST.STRINGS["error_no_case_found_description"], + ) + return await ctx.respond(embed=embed) - await ctx.send( - f"Case {case['case_number']}: {case['action_type']} - {case['reason']}", + target = await UserConverter().convert(ctx, str(case["target_id"])) + embed = create_case_embed( + ctx, + target, + case["case_number"], + case["action_type"], + case["reason"], ) + await ctx.respond(embed=embed) -async def view_all_cases_in_guild(ctx, guild_id: int): - cases = case_service.fetch_all_cases_in_guild(guild_id) +# async def view_all_cases_in_guild(ctx, guild_id: int): +# cases = case_service.fetch_all_cases_in_guild(guild_id) - if not cases: - return await ctx.send("No cases found for this guild.") +# if not cases: +# return await ctx.send("No cases found for this guild.") - pages_list = [ - f"Case {case['case_number']}: {case['action_type']} - {case['reason']}" - for case in cases - ] - paginator = pages.Paginator(pages=pages_list, loop_pages=True) - await paginator.send(ctx) +# pages_list = [ +# f"Case {case['case_number']}: {case['action_type']} - {case['reason']}" +# for case in cases +# ] +# paginator = pages.Paginator(pages=pages_list, loop_pages=True) +# await paginator.send(ctx) -async def view_all_cases_by_mod(ctx, guild_id: int, mod_id: int): - cases = case_service.fetch_all_cases_by_mod(guild_id, mod_id) +# async def view_all_cases_by_mod(ctx, guild_id: int, mod_id: int): +# cases = case_service.fetch_all_cases_by_mod(guild_id, mod_id) - if not cases: - return await ctx.send("No cases found for this moderator in this guild.") +# if not cases: +# return await ctx.send("No cases found for this moderator in this guild.") - pages_list = [ - f"Case {case['case_number']}: {case['action_type']} - {case['reason']}" - for case in cases - ] - paginator = pages.Paginator(pages=pages_list, loop_pages=True) - await paginator.send(ctx) +# pages_list = [ +# f"Case {case['case_number']}: {case['action_type']} - {case['reason']}" +# for case in cases +# ] +# paginator = pages.Paginator(pages=pages_list, loop_pages=True) +# await paginator.send(ctx) -async def edit_case_reason(ctx, guild_id: int, case_number: int, new_reason: str): - changes = {"reason": new_reason} - case_service.edit_case(guild_id, case_number, changes) - await ctx.respond(f"Case {case_number} reason updated to: {new_reason}") +# async def edit_case_reason(ctx, guild_id: int, case_number: int, new_reason: str): +# changes = {"reason": new_reason} +# case_service.edit_case(guild_id, case_number, changes) +# await ctx.respond(f"Case {case_number} reason updated to: {new_reason}") -async def close_case(ctx, guild_id: int, case_number: int): - case_service.close_case(guild_id, case_number) - await ctx.respond(f"Case {case_number} has been closed.") +# async def close_case(ctx, guild_id: int, case_number: int): +# case_service.close_case(guild_id, case_number) +# await ctx.respond(f"Case {case_number} has been closed.") diff --git a/services/moderation/case_service.py b/services/moderation/case_service.py index 43aae0b..e2b66f7 100644 --- a/services/moderation/case_service.py +++ b/services/moderation/case_service.py @@ -83,9 +83,27 @@ class CaseService: SELECT * FROM cases WHERE guild_id = %s AND case_number = %s ORDER BY case_number DESC + LIMIT 1 """ - result = select_query_one(query, (guild_id, case_number)) - return dict(result) if result else None + result = select_query(query, (guild_id, case_number)) + if result: + case = result[0] # Get the first result from the list + return { + "id": case[0], + "guild_id": case[1], + "case_number": case[2], + "target_id": case[3], + "moderator_id": case[4], + "action_type": case[5], + "reason": case[6], + "duration": case[7], + "expires_at": case[8], + "modlog_message_id": case[9], + "is_closed": case[10], + "created_at": case[11], + "updated_at": case[12], + } + return None def fetch_cases_by_guild(self, guild_id): query = """