137 lines
4.4 KiB
Python
137 lines
4.4 KiB
Python
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 <role> 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 <role> 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)
|