From 3c18d552c2c9eb15834b33687915a7b16c98883b Mon Sep 17 00:00:00 2001 From: Parker Date: Sat, 25 Jan 2025 22:58:41 -0600 Subject: reupload --- code/cogs/mute.py | 282 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 code/cogs/mute.py (limited to 'code/cogs/mute.py') diff --git a/code/cogs/mute.py b/code/cogs/mute.py new file mode 100644 index 0000000..cf7381e --- /dev/null +++ b/code/cogs/mute.py @@ -0,0 +1,282 @@ +import discord +from discord.ext import commands, tasks +import datetime +from discord import app_commands + +from global_variables import CONNECTION, BOT_COLOR + + +class Mute(commands.Cog): + def __init__(self, bot: commands.Bot): + self.bot = bot + + def cog_load(self): + self.mute_check.start() + + @tasks.loop(seconds=60) + async def mute_check(self): + cur = CONNECTION.cursor() + cur.execute("SELECT * FROM tempmute WHERE time < %s", (datetime.datetime.now(),)) + data = cur.fetchall() + for row in data: + try: + guild_id = row[0] + user_id = row[1] + role_id = row[2] + guild = await self.bot.fetch_guild(guild_id) + user = await guild.fetch_member(user_id) + role = guild.get_role(role_id) + await user.remove_roles(role) + cur.execute("DELETE FROM tempmute WHERE guild_id = %s AND user_id = %s", (guild_id, user_id)) + CONNECTION.commit() + except: + pass + + + @app_commands.default_permissions(manage_roles=True) + @app_commands.command() + @app_commands.checks.has_permissions(manage_roles=True) + @app_commands.describe(role_name='Name of your servers muted role') + async def setmute( + self, + interaction: discord.Interaction, + role_name: discord.Role + ): + "Set the role for users to be given when muted" + guild_id = interaction.user.guild.id + role = role_name + role_id = role.id + + cur = CONNECTION.cursor() + cur.execute("SELECT role_id FROM mute WHERE guild_id = %s", (guild_id,)) + role_id = cur.fetchone() + if role_id != None: + cur.execute("UPDATE mute SET role_id = %s WHERE guild_id = %s", (role.id, guild_id)) + CONNECTION.commit() + + else: + cur.execute("INSERT INTO mute (role_id, guild_id) VALUES(%s, %s)", (role.id, guild_id)) + CONNECTION.commit() + + embed = discord.Embed( + title = "Mute Role Set", + description = f"The mute role for {interaction.guild.name} has been set to: <@&{role.id}>", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed) + + + @app_commands.default_permissions(manage_roles=True) + @app_commands.command() + @app_commands.checks.has_permissions(manage_roles=True) + async def delmute( + self, + interaction: discord.Interaction + ): + "Delete the role set to be given to muted users" + guild_id = interaction.user.guild.id + cur = CONNECTION.cursor() + cur.execute("SELECT role_id FROM mute WHERE guild_id = %s", (guild_id,)) + data = cur.fetchone() + if data: + cur.execute("DELETE FROM mute WHERE guild_id = %s", (guild_id,)) + CONNECTION.commit() + + embed = discord.Embed( + title = "Mute Role Deleted", + description = f"The mute role for {interaction.user.guild.name} has been deleted from my database.", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed) + + else: + embed = discord.Embed( + title = "Mute Role Not Set", + description = f"The mute role is not set, therefore there is no role I can delete.", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed, ephemeral=True) + + + @app_commands.default_permissions(manage_roles=True) + @app_commands.command() + @app_commands.checks.has_permissions(manage_roles=True) + async def muterole( + self, + interaction: discord.Interaction + ): + "See the current role set for when users are muted" + guild_id = interaction.user.guild.id + cur = CONNECTION.cursor() + cur.execute("SELECT role_id FROM mute WHERE guild_id = %s", (guild_id,)) + data = cur.fetchone() + if data: + role = interaction.guild.get_role(data[0]) + if role: + embed = discord.Embed( + title=f"Mute Role for {interaction.user.guild.name}", + description=f"The role given to members who are muted in this server is: <@&{role.id}>", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + return await interaction.response.send_message(embed=embed) + + else: + embed = discord.Embed( + title="Mute Role Not Found", + description=f"You have previously set a mute role, but it seems that the role you set has since been deleted. Please add a new mute role with the `/setmute` command.", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + return await interaction.response.send_message(embed=embed) + + else: + embed = discord.Embed( + title = "No Role Set", + description = f"It seems you haven't set a muted role yet. Please go do that with `/setmute` before running this command.", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed, ephemeral=True) + + + @app_commands.default_permissions(manage_roles=True) + @app_commands.command() + @app_commands.checks.has_permissions(manage_roles=True) + @app_commands.describe(member='Name of the member you want to temporarily mute') + @app_commands.describe(time='Amount of time (in hours) to mute the member') + async def tempmute( + self, + interaction: discord.Interaction, + member: discord.Member, + time: app_commands.Range[int, 1, None] + ): + "Mute a user for a specified amount of time" + try: + guild_id = interaction.user.guild.id + cur = CONNECTION.cursor() + cur.execute("SELECT role_id FROM mute WHERE guild_id = %s", (guild_id,)) + data = cur.fetchone() + role_id = data[0] + role_name = interaction.user.guild.get_role(role_id) + role = discord.utils.get(interaction.user.guild.roles, name=f"{role_name}") + + await member.add_roles(role) + embed = discord.Embed( + title=f"Temporarily Muted {member}", + description=f"{interaction.user.mention} has temporarily muted {member.mention} for {time} hours.", + color=discord.Color.orange() + ) + embed.set_thumbnail(url=member.avatar.url) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed) + + cur = CONNECTION.cursor() + cur.execute("INSERT INTO tempmute (guild_id, user_id, role_id, time) VALUES (%s, %s, %s, %s)", (guild_id, member.id, role.id, (datetime.datetime.now() + datetime.timedelta(hours=time)))) + CONNECTION.commit() + + except TypeError: + embed = discord.Embed( + title = "No Role Set", + description = f"It seems you haven't set a muted role yet. Please go do that with `/setmute` before running this command.", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed, ephemeral=True) + + + @app_commands.default_permissions(manage_roles=True) + @app_commands.command() + @app_commands.checks.has_permissions(manage_roles=True) + @app_commands.describe(member='Name of the member you want to mute') + @app_commands.describe(reason='Reason for muting the member') + async def mute( + self, + interaction: discord.Interaction, + member: discord.Member, + reason: str + ): + "Mutes a user for an indefinite amount of time" + try: + guild_id = interaction.user.guild.id + cur = CONNECTION.cursor() + cur.execute("SELECT role_id FROM mute WHERE guild_id = %s", (guild_id,)) + data = cur.fetchone() + role_id = data[0] + role_name = interaction.user.guild.get_role(role_id) + role = discord.utils.get(interaction.user.guild.roles, name=f"{role_name}") + + await member.add_roles(role) + embed = discord.Embed( + title=f"Muted {member}", + description=f"{interaction.user.mention} has successfully muted {member.mention} for `\"{reason}\"`.", + color=discord.Color.red() + ) + embed.set_thumbnail(url=member.avatar.url) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed) + + except TypeError or AttributeError: + embed = discord.Embed( + title = "No Role Set", + description = f"It seems you haven't set a muted role yet. Please go do that with `/setmute` before running this command.", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed, ephemeral=True) + + + @app_commands.default_permissions(manage_roles=True) + @app_commands.command() + @app_commands.checks.has_permissions(manage_roles=True) + @app_commands.describe(member='Name of the member you want to unmute') + async def unmute( + self, + interaction: discord.Interaction, + member: discord.Member + ): + "Unmute a specified member" + try: + guild_id = interaction.user.guild.id + cur = CONNECTION.cursor() + cur.execute("SELECT role_id FROM mute WHERE guild_id = %s", (guild_id,)) + data = cur.fetchone() + role_id = data[0] + role_name = interaction.user.guild.get_role(role_id) + role = discord.utils.get(interaction.user.guild.roles, name=f"{role_name}") + + if role in member.roles: + await member.remove_roles(role) + embed = discord.Embed( + title=f"Unmuted {member}", + description=f"{interaction.user.mention} has successfully unmuted {member.mention}.", + color=discord.Color.green() + ) + embed.set_thumbnail(url=member.avatar.url) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed) + + else: + embed = discord.Embed( + title="User Isn't Muted", + description=f"{member.mention} isn't muted, therefore I cannot unmute them. Maybe you meant to mute them with the `mute` command?", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed, ephemeral=True) + + except TypeError or AttributeError: + embed = discord.Embed( + title="No Role Set", + description=f"It seems you haven't set a muted role yet. Please go do that with `/setmute` before running this command.", + color=BOT_COLOR + ) + embed.set_footer(text=datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')+" UTC") + await interaction.response.send_message(embed=embed, ephemeral=True) + + +async def setup(bot): + await bot.add_cog(Mute(bot)) \ No newline at end of file -- cgit v1.2.3-70-g09d2