From af10493e8122b762b4b58b156689e33d9332e7b3 Mon Sep 17 00:00:00 2001 From: bobloy Date: Mon, 5 Apr 2021 09:26:05 -0400 Subject: [PATCH] Introduce mute method --- flag/flag.py | 51 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/flag/flag.py b/flag/flag.py index e267297..fc5eb5b 100644 --- a/flag/flag.py +++ b/flag/flag.py @@ -1,13 +1,17 @@ +import logging from datetime import date, timedelta -from typing import Literal +from typing import Literal, Optional import discord +from redbot.cogs.mutes import Mutes from redbot.core import Config, checks, commands from redbot.core.bot import Red from redbot.core.commands import Cog from redbot.core.utils import AsyncIter from redbot.core.utils.chat_formatting import pagify +log = logging.getLogger("red.fox_v3.flag") + class Flag(Cog): """ @@ -19,7 +23,7 @@ class Flag(Cog): self.bot = bot self.config = Config.get_conf(self, identifier=9811198108111121, force_registration=True) default_global = {} - default_guild = {"days": 31, "dm": True, "flags": {}} + default_guild = {"days": 31, "dm": True, "flags": {}, "mutethreshold": 0} self.config.register_global(**default_global) self.config.register_guild(**default_guild) @@ -78,6 +82,29 @@ class Flag(Cog): "DM-ing members when they get a flag is now set to **{}**".format(not dm) ) + @checks.admin_or_permissions(manage_guild=True) + @flagset.command(name="mute") + async def flagset_mute(self, ctx: commands.Context, count: int): + """ + Sets the threshold for flags to mute the user. + + Only works when the core mute cog is configured properly. + + Set to zero to disable. + """ + if count < 0: + await ctx.send_help() + return + + await self.config.guild(ctx.guild).mutethreshold.set(count) + + if count: + await ctx.maybe_send_embed( + "Will now attempt to mute people after **{}** flags".format(count) + ) + else: + await ctx.maybe_send_embed("Muting disabled.") + @staticmethod def _flag_template(): return {"reason": "", "expireyear": 0, "expiremonth": 0, "expireday": 0} @@ -91,7 +118,8 @@ class Flag(Cog): await self._check_flags(guild) flag = self._flag_template() - expire_date = date.today() + timedelta(days=await self.config.guild(guild).days()) + mute_days = await self.config.guild(guild).days() + expire_date = date.today() + timedelta(mute_days) flag["reason"] = reason flag["expireyear"] = expire_date.year @@ -106,6 +134,12 @@ class Flag(Cog): if str(member.id) not in flags: flags[str(member.id)] = [] flags[str(member.id)].append(flag) + flag_count = len(flags[str(member.id)]) + + mute_threshold = await self.config.guild(guild).mutethreshold() + if 0 < mute_threshold <= flag_count: + able_to_mute = await self._attempt_mute(ctx, member, mute_days) + log.debug(f"Mute attempt: {able_to_mute}") outembed = await self._list_flags(member) @@ -166,6 +200,17 @@ class Flag(Cog): for page in pagify(out): await ctx.send(page) + async def _attempt_mute(self, ctx, member: discord.Member, days): + mutes: Optional[Mutes] = self.bot.get_cog("Mutes") + if mutes is None: + log.info("Mutes cog not loaded, cannot mute") + return False + + return await mutes.mute(ctx, member, f'{days} days [Flag] Exceeded mute threshold') + # return await mutes.mute_user( + # member.guild, author, member, until, "[Flag] Exceeded mute threshold" + # ) + async def _list_flags(self, member: discord.Member): """Returns a pretty embed of flags on a member""" flags = await self.config.guild(member.guild).flags.get_raw(str(member.id), default=[])