GalaxyCogs/shortmute/shortmute.py

120 lines
6.6 KiB
Python
Raw Normal View History

from datetime import datetime
import discord
from pytimeparse2 import disable_dateutil, parse
from discord import ui
from redbot.core import Config, commands, app_commands, modlog
class Shortmute(commands.Cog):
"""Allows staff members to shortmute individuals for up to 30 minutes, using Discord's Timeouts feature."""
def __init__(self, bot) -> None:
self.bot = bot
self.config = Config.get_conf(self, identifier=25781647388294, force_registration=True)
self.config.register_guild(
dm = True
)
@app_commands.command()
@app_commands.rename(target='member')
async def shortmute(self, interaction: discord.Interaction, target: discord.Member, duration: int, reason: str, evidence_link: str = None, evidence_image: discord.AppCommandOptionType.attachment = None):
"""Shortmute someone for up to 30m.
Parameters
-----------
target: discord.Member
The member to shortmute
duration: int
The duration of the shortmute
reason: str
The reason for the shortmute
evidence_link: str = None
An image link to evidence for the shortmute, do not use with evidence_image
evidence_image: discord.AppCommandOptionType.attachment = None
An image file used as evidence for the shortmute, do not use with evidence_link
"""
passed_info = {
"target": target,
"duration": duration,
"reason": reason,
"interaction": interaction
}
if evidence_image and evidence_link:
await interaction.response.send_message(content="You've provided both the `evidence_image` and the `evidence_link` arguments! Please only use one or the other.")
return
elif evidence_link:
evidence = evidence_link
elif evidence_image:
evidence = str(evidence_image)
if duration == 1 or duration == -1:
readable_duration = f"{duration} minute"
passed_info.update({
"readable_duration": readable_duration
})
else:
readable_duration = f"{duration} minutes"
passed_info.update({
"readable_duration": readable_duration
})
if duration > 30:
await interaction.response(content=f"{readable_duration} is longer than the 30 minutes you are allowed to shortmute users for.", ephemeral=True)
return
elif duration < 1:
await interaction.response(content=f"Please shortmute the user for longer than {readable_duration}! The maximum duration is 30 minutes.", ephemeral=True)
return
embed = discord.Embed(title="Are you sure?", description=f"Moderator: {interaction.user.mention}\nTarget: {target.mention}\nDuration: `{readable_duration}`\nReason: `{reason}`", color=await self.bot.get_embed_color(None))
if evidence:
embed.set_image(evidence)
passed_info.update({
"evidence": evidence
})
await interaction.response.send_message(embed=embed, view=self.ShortmuteButtons(timeout=180, passed_info=passed_info), ephemeral=True)
class ShortmuteButtons(ui.View):
def __init__(self, timeout, passed_info: dict):
super().__init__()
self.timeout = timeout
self.passed_info = passed_info
self.config = Config.get_conf(None, cog_name='Shortmute', identifier=25781647388294)
@ui.button(label="Yes", style=discord.ButtonStyle.success)
async def shortmute_button_yes(self, button: ui.Button, interaction: discord.Interaction):
disable_dateutil()
target = self.passed_info['target']
duration = self.passed_info['duration']
readable_duration = self.passed_info['readable_duration']
reason = self.passed_info['reason']
old_interaction = self.passed_info['interaction']
timedelta = parse(f'{duration} minutes')
edit_embed = discord.Embed(title="Shortmute confirmed!", description=f"Moderator: {old_interaction.user.mention}\nTarget: {target.mention}\nDuration: `{readable_duration}`\nReason: `{reason}`", color=await self.bot.get_embed_color(None))
if self.passed_info.get('evidence'):
evidence = self.passed_info['evidence']
edit_embed.set_image(evidence)
old_message = await old_interaction.edit_original_response(embed=edit_embed, view=None)
await target.timeout(until=timedelta, reason=f"User shortmuted for {readable_duration} by {old_interaction.user.name} ({old_interaction.user.id}) for: {reason}")
await interaction.response.send_message(content=f"{target.mention} shortmuted for {readable_duration} by {old_interaction.user.mention} for: `{reason}`")
if await self.config.guild(old_interaction.guild_id).dm() is True:
dm_embed = discord.Embed(title=f"You've been shortmuted in {old_interaction.guild.name}!", description=f"Moderator: {old_interaction.user.mention}\nTarget: {target.mention}\nDuration: `{readable_duration}`\nReason: `{reason}`", color=await self.bot.get_embed_color(None))
if evidence:
dm_embed.set_image(evidence)
try:
await target.send(embed=dm_embed)
except discord.HTTPException as error:
await old_message.edit(content="Could not message the target, user most likely has Direct Messages disabled.")
@ui.button(label="No", style=discord.ButtonStyle.danger)
async def shortmute_button_no(self, button: ui.Button, interaction: discord.Interaction):
message = await self.passed_info['interaction'].edit_original_response(content="Command cancelled.", view=None, embed=None)
await message.delete(delay=3)
@commands.command()
async def shortmute_dm(self, ctx: commands.Context, enabled: bool = None):
"""This command changes if the `/shortmute` slash command Direct Messages its' target."""
old_value = await self.config.guild(ctx.guild.id).dm()
if enabled:
await self.config.guild(ctx.guild.id).dm.set(enabled)
await ctx.send(content=f"Shortmute Direct Message setting changed!\nOld value: `{old_value}`\nNew value: `{enabled}`")
elif old_value is True:
await ctx.send(content="Shortmute Direct Messages are currently enabled!")
elif old_value is False:
await ctx.send(content="Shortmute Direct Messages are currently disabled!")