From 34b034bdcd9824f8851b380f4b0094e6d9dbf4be Mon Sep 17 00:00:00 2001 From: neoarz Date: Tue, 16 Sep 2025 06:57:12 -0400 Subject: [PATCH] refactor: moderation cogs && update embed styling Removed template copyright headers from moderation cogs and database files. Improved embed styling and consistency in purge and warnings commands, including unified colors, author fields, and permission checks. Added a helper for sending embeds in warnings cog and replaced decorator-based permission checks with manual checks for better feedback. Updated comments in database files. --- cogs/moderation/purge.py | 12 ++---- cogs/moderation/warnings.py | 86 ++++++++++++++++++++++++++----------- database/__init__.py | 2 +- database/schema.sql | 2 +- 4 files changed, 67 insertions(+), 35 deletions(-) diff --git a/cogs/moderation/purge.py b/cogs/moderation/purge.py index bc17fe8..646b761 100644 --- a/cogs/moderation/purge.py +++ b/cogs/moderation/purge.py @@ -1,11 +1,3 @@ -""" -Copyright © Krypton 2019-Present - https://github.com/kkrypt0nn (https://krypton.ninja) -Description: -🐍 A simple template to start to code your own and personalized Discord bot in Python - -Version: 6.4.0 -""" - import discord from discord import app_commands from discord.ext import commands @@ -33,9 +25,11 @@ class Purge(commands.Cog, name="purge"): await context.send("Deleting messages...") purged_messages = await context.channel.purge(limit=amount + 1) embed = discord.Embed( + title="Purge", description=f"**{context.author}** cleared **{len(purged_messages)-1}** messages!", - color=0xBEBEFE, + color=0x7289DA, ) + embed.set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") await context.channel.send(embed=embed) diff --git a/cogs/moderation/warnings.py b/cogs/moderation/warnings.py index 421d8e1..667f6a2 100644 --- a/cogs/moderation/warnings.py +++ b/cogs/moderation/warnings.py @@ -1,11 +1,3 @@ -""" -Copyright © Krypton 2019-Present - https://github.com/kkrypt0nn (https://krypton.ninja) -Description: -🐍 A simple template to start to code your own and personalized Discord bot in Python - -Version: 6.4.0 -""" - import discord from discord import app_commands from discord.ext import commands @@ -16,29 +8,45 @@ class Warnings(commands.Cog, name="warnings"): def __init__(self, bot) -> None: self.bot = bot + async def send_embed(self, context: Context, embed: discord.Embed, *, ephemeral: bool = False) -> None: + interaction = getattr(context, "interaction", None) + if interaction is not None: + if interaction.response.is_done(): + await interaction.followup.send(embed=embed, ephemeral=ephemeral) + else: + await interaction.response.send_message(embed=embed, ephemeral=ephemeral) + else: + await context.send(embed=embed) + @commands.hybrid_group( name="warning", description="Manage warnings of a user on a server.", ) - @commands.has_permissions(manage_messages=True) async def warning(self, context: Context) -> None: """ Manage warnings of a user on a server. :param context: The hybrid command context. """ + if not context.author.guild_permissions.manage_messages: + embed = discord.Embed( + title="Missing Permissions!", + description="You are missing the permission(s) `manage_messages` to execute this command!", + color=0xE02B2B, + ).set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") + return await self.send_embed(context, embed, ephemeral=True) + if context.invoked_subcommand is None: embed = discord.Embed( description="Please specify a subcommand.\n\n**Subcommands:**\n`add` - Add a warning to a user.\n`remove` - Remove a warning from a user.\n`list` - List all warnings of a user.", - color=0xE02B2B, + color=0x7289DA, ) - await context.send(embed=embed) + await self.send_embed(context, embed) @warning.command( name="add", description="Adds a warning to a user in the server.", ) - @commands.has_permissions(manage_messages=True) @app_commands.describe( user="The user that should be warned.", reason="The reason why the user should be warned.", @@ -53,6 +61,13 @@ class Warnings(commands.Cog, name="warnings"): :param user: The user that should be warned. :param reason: The reason for the warn. Default is "Not specified". """ + if not context.author.guild_permissions.manage_messages: + embed = discord.Embed( + title="Missing Permissions!", + description="You are missing the permission(s) `manage_messages` to execute this command!", + color=0xE02B2B, + ).set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") + return await self.send_embed(context, embed, ephemeral=True) member = context.guild.get_member(user.id) or await context.guild.fetch_member( user.id ) @@ -60,25 +75,32 @@ class Warnings(commands.Cog, name="warnings"): user.id, context.guild.id, context.author.id, reason ) embed = discord.Embed( + title="Warning", description=f"**{member}** was warned by **{context.author}**!\nTotal warns for this user: {total}", - color=0xBEBEFE, + color=0x7289DA, ) + embed.set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") embed.add_field(name="Reason:", value=reason) - await context.send(embed=embed) + await self.send_embed(context, embed) try: - await member.send( - f"You were warned by **{context.author}** in **{context.guild.name}**!\nReason: {reason}" + dm_embed = discord.Embed( + title="Warning", + description=f"You were warned by **{context.author}** in **{context.guild.name}**!\nReason: {reason}", + color=0xE02B2B, ) + dm_embed.set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") + await member.send(embed=dm_embed) except: - await context.send( - f"{member.mention}, you were warned by **{context.author}**!\nReason: {reason}" + fallback = discord.Embed( + description=f"{member.mention}, you were warned by **{context.author}**!\nReason: {reason}", + color=0xE02B2B, ) + await self.send_embed(context, fallback) @warning.command( name="remove", description="Removes a warning from a user in the server.", ) - @commands.has_permissions(manage_messages=True) @app_commands.describe( user="The user that should get their warning removed.", warn_id="The ID of the warning that should be removed.", @@ -93,21 +115,28 @@ class Warnings(commands.Cog, name="warnings"): :param user: The user that should get their warning removed. :param warn_id: The ID of the warning that should be removed. """ + if not context.author.guild_permissions.manage_messages: + embed = discord.Embed( + title="Missing Permissions!", + description="You are missing the permission(s) `manage_messages` to execute this command!", + color=0xE02B2B, + ).set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") + return await self.send_embed(context, embed, ephemeral=True) member = context.guild.get_member(user.id) or await context.guild.fetch_member( user.id ) total = await self.bot.database.remove_warn(warn_id, user.id, context.guild.id) embed = discord.Embed( description=f"I've removed the warning **#{warn_id}** from **{member}**!\nTotal warns for this user: {total}", - color=0xBEBEFE, + color=0x7289DA, ) - await context.send(embed=embed) + embed.set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") + await self.send_embed(context, embed) @warning.command( name="list", description="Shows the warnings of a user in the server.", ) - @commands.has_guild_permissions(manage_messages=True) @app_commands.describe(user="The user you want to get the warnings of.") async def warning_list(self, context: Context, user: discord.User) -> None: """ @@ -116,8 +145,16 @@ class Warnings(commands.Cog, name="warnings"): :param context: The hybrid command context. :param user: The user you want to get the warnings of. """ + if not context.author.guild_permissions.manage_messages: + embed = discord.Embed( + title="Missing Permissions!", + description="You are missing the permission(s) `manage_messages` to execute this command!", + color=0xE02B2B, + ).set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") + return await self.send_embed(context, embed, ephemeral=True) warnings_list = await self.bot.database.get_warnings(user.id, context.guild.id) - embed = discord.Embed(title=f"Warnings of {user}", color=0xBEBEFE) + embed = discord.Embed(title=f"Warnings of {user}", color=0x7289DA) + embed.set_author(name="Moderation", icon_url="https://yes.nighty.works/raw/8VLDcg.webp") description = "" if len(warnings_list) == 0: description = "This user has no warnings." @@ -125,7 +162,8 @@ class Warnings(commands.Cog, name="warnings"): for warning in warnings_list: description += f"• Warned by <@{warning[2]}>: **{warning[3]}** () - Warn ID #{warning[5]}\n" embed.description = description - await context.send(embed=embed) + await self.send_embed(context, embed) + async def setup(bot) -> None: diff --git a/database/__init__.py b/database/__init__.py index 90efbfe..bc7f757 100644 --- a/database/__init__.py +++ b/database/__init__.py @@ -1,5 +1,5 @@ # Copyright © Krypton 2019-Present - https://github.com/kkrypt0nn/Python-Discord-Bot-Template/blob/main/database/__init__.py -# Used/Edited by neoarz +# Used by neoarz import aiosqlite diff --git a/database/schema.sql b/database/schema.sql index d4068ae..3b75cd6 100644 --- a/database/schema.sql +++ b/database/schema.sql @@ -1,5 +1,5 @@ -- Copyright © Krypton 2019-Present - https://github.com/kkrypt0nn/Python-Discord-Bot-Template/blob/main/database/schema.sql --- Used/Edited by neoarz +-- Used by neoarz CREATE TABLE IF NOT EXISTS `warns` ( `id` int(11) NOT NULL,