from discord import Member from discord.ext import commands from discord.utils import get from discord_slash import SlashContext, cog_ext from discord_slash.utils.manage_commands import create_option from jarvis.db.models import Mute, Setting from jarvis.utils import build_embed from jarvis.utils.field import Field from jarvis.utils.permissions import admin_or_permissions class MuteCog(commands.Cog): def __init__(self, bot): self.bot = bot @cog_ext.cog_slash( name="mute", description="Mute a user", options=[ create_option( name="user", description="User to mute", option_type=6, required=True, ), create_option( name="reason", description="Reason for mute", option_type=3, required=True, ), create_option( name="duration", description="Mute duration", option_type=4, required=False, ), ], ) @admin_or_permissions(mute_members=True) async def _mute( self, ctx: SlashContext, user: Member, reason: str, duration: int = 30 ): if user == ctx.author: await ctx.send("You cannot mute yourself.", hidden=True) return if user == self.bot.user: await ctx.send("I'm afraid I can't let you do that", hidden=True) return if len(reason) > 100: await ctx.send("Reason must be < 100 characters", hidden=True) return mute_setting = Setting.get(guild=ctx.guild.id, setting="mute") if not mute_setting: await ctx.send( "Please configure a mute role " + "with /settings mute first", hidden=True, ) return role = get(ctx.guild.roles, id=mute_setting.value) if role in user.roles: await ctx.send("User already muted", hidden=True) return await user.add_roles(role, reason=reason) if duration < 0 or duration > 300: duration = -1 _ = Mute( user=user.id, reason=reason, admin=ctx.author.id, guild=ctx.guild.id, duration=duration, active=True if duration >= 0 else False, ).save() embed = build_embed( title="User Muted", description=f"{user.mention} has been muted", fields=[Field(name="Reason", value=reason)], ) embed.set_author( name=user.nick if user.nick else user.name, icon_url=user.avatar_url, ) embed.set_thumbnail(url=user.avatar_url) embed.set_footer(text=f"{user.name}#{user.discriminator} | {user.id}") await ctx.send(embed=embed) @cog_ext.cog_slash( name="unmute", description="Unmute a user", options=[ create_option( name="user", description="User to unmute", option_type=6, required=True, ) ], ) @admin_or_permissions(mute_members=True) async def _unmute(self, ctx: SlashContext, user: Member): mute_setting = Setting.objects( guild=ctx.guild.id, setting="mute" ).first() if not mute_setting: await ctx.send( "Please configure a mute role with " + "/settings mute first.", hidden=True, ) return role = get(ctx.guild.roles, id=mute_setting.value) if role in user.roles: await user.remove_roles(role, reason="Unmute") else: await ctx.send("User is not muted.", hidden=True) return _ = Mute.objects(guild=ctx.guild.id, user=user.id).update( set__active=False ) embed = build_embed( title="User Unmwaruted", description=f"{user.mention} has been unmuted", fields=[], ) embed.set_author( name=user.nick if user.nick else user.name, icon_url=user.avatar_url, ) embed.set_thumbnail(url=user.avatar_url) embed.set_footer(text=f"{user.name}#{user.discriminator} | {user.id}") await ctx.send(embed=embed)