async def remind(self, ctx, when: str, *, text: str = "something"): """Reminds you about something.""" if ctx.guild: await ctx.message.delete() current_timestamp = time.time() expiry_timestamp = self.bot.parse_time(when) if current_timestamp + 5 > expiry_timestamp: msg = await ctx.send(f"{ctx.author.mention}: Minimum " "remind interval is 5 seconds.") await asyncio.sleep(5) await msg.delete() return expiry_datetime = datetime.utcfromtimestamp(expiry_timestamp) duration_text = self.bot.get_relative_timestamp( time_to=expiry_datetime, include_to=True, humanized=True) safe_text = await commands.clean_content().convert(ctx, str(text)) added_on = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S (UTC)") add_job("remind", ctx.author.id, { "text": safe_text, "added": added_on }, expiry_timestamp) msg = await ctx.send(f"{ctx.author.mention}: I'll remind you in " f"DMs about `{safe_text}` in {duration_text}.") await asyncio.sleep(5) await msg.delete()
async def timemute(self, ctx, target: discord.Member, duration: str, *, reason: str = ""): """Mutes a user for a specified amount of time, staff only.""" # Hedge-proofing the code if target == ctx.author: return await ctx.send("You can't do mod actions on yourself.") elif self.check_if_target_is_staff(target): return await ctx.send("I can't mute this user as " "they're a member of staff.") expiry_timestamp = self.bot.parse_time(duration) expiry_datetime = datetime.utcfromtimestamp(expiry_timestamp) duration_text = self.bot.get_relative_timestamp( time_to=expiry_datetime, include_to=True, humanized=True) userlog(target.id, ctx.author, f"{reason} (Timed, until " f"{duration_text})", "mutes", target.name) safe_name = await commands.clean_content().convert(ctx, str(target)) dm_message = f"You were muted!" if reason: dm_message += f" The given reason is: \"{reason}\"." dm_message += f"\n\nThis mute will expire {duration_text}." try: await target.send(dm_message) except discord.errors.Forbidden: # Prevents kick issues in cases where user blocked bot # or has DMs disabled pass mute_role = ctx.guild.get_role(config.mute_role) await target.add_roles(mute_role, reason=str(ctx.author)) chan_message = f"🔇 **Timed Mute**: {ctx.author.mention} muted "\ f"{target.mention} for {duration_text} | {safe_name}\n"\ f"🏷 __User ID__: {target.id}\n" if reason: chan_message += f"✏️ __Reason__: \"{reason}\"" else: chan_message += "Please add an explanation below. In the future, "\ "it is recommended to use `.mute <user> [reason]`"\ " as the reason is automatically sent to the user." add_job("unmute", target.id, {"guild": ctx.guild.id}, expiry_timestamp) log_channel = self.bot.get_channel(config.log_channel) await log_channel.send(chan_message) await ctx.send(f"{target.mention} can no longer speak. " f"It will expire {duration_text}.") add_restriction(target.id, config.mute_role)
async def timemute(self, ctx, target: discord.Member, hours: int, *, reason: str = ""): """Mutes a user for a specified amount of hours, staff only.""" # Hedge-proofing the code if target == ctx.author: return await ctx.send("You can't do mod actions on yourself.") elif self.check_if_target_is_staff(target): return await ctx.send("I can't mute this user as " "they're a member of staff.") userlog(target.id, ctx.author, f"{reason} (Timed, for {hours}h)", "mutes", target.name) safe_name = self.bot.escape_message(str(target)) dm_message = f"You were muted!" if reason: dm_message += f" The given reason is: \"{reason}\"." dm_message += f"\n\nThis mute will expire in {hours} hours." try: await target.send(dm_message) except discord.errors.Forbidden: # Prevents kick issues in cases where user blocked bot # or has DMs disabled pass mute_role = ctx.guild.get_role(config.mute_role) await target.add_roles(mute_role, reason=str(ctx.author)) chan_message = f"🔇 **Timed Mute**: {ctx.author.mention} muted "\ f"{target.mention} for {hours} hours | {safe_name}\n"\ f"🏷 __User ID__: {target.id}\n" if reason: chan_message += f"✏️ __Reason__: \"{reason}\"" else: chan_message += "Please add an explanation below. In the future, "\ "it is recommended to use `.mute <user> [reason]`"\ " as the reason is automatically sent to the user." expiry_timestamp = time.time() + (hours * 3600) add_job("unmute", target.id, {"guild": ctx.guild.id}, expiry_timestamp) log_channel = self.bot.get_channel(config.log_channel) await log_channel.send(chan_message) await ctx.send(f"{target.mention} can no longer speak.") add_restriction(target.id, config.mute_role)
async def timeban(self, ctx, target: discord.Member, hours: int, *, reason: str = ""): """Bans a user for a specified amount of hours, staff only.""" # Hedge-proofing the code if target == ctx.author: return await ctx.send("You can't do mod actions on yourself.") elif self.check_if_target_is_staff(target): return await ctx.send("I can't ban this user as " "they're a member of staff.") userlog(target.id, ctx.author, f"{reason} (Timed, for {hours}h)", "bans", target.name) safe_name = self.bot.escape_message(str(target)) dm_message = f"You were banned from {ctx.guild.name}." if reason: dm_message += f" The given reason is: \"{reason}\"." dm_message += f"\n\nThis ban will expire in {hours} hours." try: await target.send(dm_message) except discord.errors.Forbidden: # Prevents ban issues in cases where user blocked bot # or has DMs disabled pass await target.ban(reason=f"{ctx.author}, reason: {reason}", delete_message_days=0) chan_message = f"⛔ **Timed Ban**: {ctx.author.mention} banned "\ f"{target.mention} for {hours} hours | {safe_name}\n"\ f"🏷 __User ID__: {target.id}\n" if reason: chan_message += f"✏️ __Reason__: \"{reason}\"" else: chan_message += "Please add an explanation below. In the future"\ ", it is recommended to use `.ban <user> [reason]`"\ " as the reason is automatically sent to the user." expiry_timestamp = time.time() + (hours * 3600) add_job("unban", target.id, {"guild": ctx.guild.id}, expiry_timestamp) log_channel = self.bot.get_channel(config.log_channel) await log_channel.send(chan_message) await ctx.send(f"{safe_name} is now b& for {hours} hours. 👍")
async def timeban(self, ctx, target: discord.Member, duration: str, *, reason: str = ""): """Bans a user for a specified amount of time, staff only.""" # Hedge-proofing the code if target == ctx.author: return await ctx.send("You can't do mod actions on yourself.") elif self.check_if_target_is_staff(target): return await ctx.send( "I can't ban this user as they're a member of staff.") expiry_timestamp = self.bot.parse_time(duration) expiry_datetime = datetime.utcfromtimestamp(expiry_timestamp) duration_text = self.bot.get_relative_timestamp( time_to=expiry_datetime, include_to=True, humanized=True) userlog( target.id, ctx.author, f"{reason} (Timed, until " f"{duration_text})", "bans", target.name, ) safe_name = await commands.clean_content().convert(ctx, str(target)) dm_message = f"You were banned from {ctx.guild.name}." if reason: dm_message += f' The given reason is: "{reason}".' dm_message += f"\n\nThis ban will expire {duration_text}." try: await target.send(dm_message) except discord.errors.Forbidden: # Prevents ban issues in cases where user blocked bot # or has DMs disabled pass await target.ban(reason=f"{ctx.author}, reason: {reason}", delete_message_days=0) chan_message = (f"⛔ **Timed Ban**: {ctx.author.mention} banned " f"{target.mention} for {duration_text} | {safe_name}\n" f"🏷 __User ID__: {target.id}\n") if reason: chan_message += f'✏️ __Reason__: "{reason}"' else: chan_message += ( "Please add an explanation below. In the future" ", it is recommended to use `.ban <user> [reason]`" " as the reason is automatically sent to the user.") add_job("unban", target.id, {"guild": ctx.guild.id}, expiry_timestamp) log_channel = self.bot.get_channel(config.log_channel) await log_channel.send(chan_message) await ctx.send(f"{safe_name} is now b&. " f"It will expire {duration_text}. 👍")