aboutsummaryrefslogtreecommitdiff
path: root/code/cogs/mute.py
diff options
context:
space:
mode:
Diffstat (limited to 'code/cogs/mute.py')
-rw-r--r--code/cogs/mute.py282
1 files changed, 282 insertions, 0 deletions
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