diff options
| author | 2020-12-09 23:03:12 -0500 | |
|---|---|---|
| committer | 2020-12-09 23:03:12 -0500 | |
| commit | a64bc9f5ee454e2f1874aa7f54f74e32c6b045d5 (patch) | |
| tree | e5586663beaea8eff9cd4b3ae6c8d2666312369a | |
| parent | Delete verify.py, integrate `!verify` command into verification.py. (diff) | |
| parent | Merge pull request #1319 from python-discord/swfarnsworth/superstar (diff) | |
Merge branch 'master' into swfarnsworth/developer_command
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/help_channels/_cog.py | 44 | ||||
| -rw-r--r-- | bot/exts/moderation/infraction/superstarify.py | 41 | 
2 files changed, 52 insertions, 33 deletions
| diff --git a/bot/exts/help_channels/_cog.py b/bot/exts/help_channels/_cog.py index e22d4663e..983c5d183 100644 --- a/bot/exts/help_channels/_cog.py +++ b/bot/exts/help_channels/_cog.py @@ -145,22 +145,17 @@ class HelpChannels(commands.Cog):          Make the current in-use help channel dormant.          Make the channel dormant if the user passes the `dormant_check`, -        delete the message that invoked this, -        and reset the send permissions cooldown for the user who started the session. +        delete the message that invoked this.          """          log.trace("close command invoked; checking if the channel is in-use.") -        if ctx.channel.category == self.in_use_category: -            if await self.dormant_check(ctx): -                await _cooldown.remove_cooldown_role(ctx.author) -                # Ignore missing task when cooldown has passed but the channel still isn't dormant. -                if ctx.author.id in self.scheduler: -                    self.scheduler.cancel(ctx.author.id) - -                await self.move_to_dormant(ctx.channel, "command") -                self.scheduler.cancel(ctx.channel.id) -        else: +        if ctx.channel.category != self.in_use_category:              log.debug(f"{ctx.author} invoked command 'dormant' outside an in-use help channel") +            return + +        if await self.dormant_check(ctx): +            await self.move_to_dormant(ctx.channel, "command") +            self.scheduler.cancel(ctx.channel.id)      async def get_available_candidate(self) -> discord.TextChannel:          """ @@ -368,12 +363,13 @@ class HelpChannels(commands.Cog):          """          log.info(f"Moving #{channel} ({channel.id}) to the Dormant category.") -        await _caches.claimants.delete(channel.id)          await self.move_to_bottom_position(              channel=channel,              category_id=constants.Categories.help_dormant,          ) +        await self.unclaim_channel(channel) +          self.bot.stats.incr(f"help.dormant_calls.{caller}")          in_use_time = await _channel.get_in_use_time(channel.id) @@ -397,6 +393,28 @@ class HelpChannels(commands.Cog):          self.channel_queue.put_nowait(channel)          self.report_stats() +    async def unclaim_channel(self, channel: discord.TextChannel) -> None: +        """ +        Mark the channel as unclaimed and remove the cooldown role from the claimant if needed. + +        The role is only removed if they have no claimed channels left once the current one is unclaimed. +        This method also handles canceling the automatic removal of the cooldown role. +        """ +        claimant_id = await _caches.claimants.pop(channel.id) + +        # Ignore missing task when cooldown has passed but the channel still isn't dormant. +        if claimant_id in self.scheduler: +            self.scheduler.cancel(claimant_id) + +        claimant = self.bot.get_guild(constants.Guild.id).get_member(claimant_id) +        if claimant is None: +            log.info(f"{claimant_id} left the guild during their help session; the cooldown role won't be removed") +            return + +        # Remove the cooldown role if the claimant has no other channels left +        if not any(claimant.id == user_id for _, user_id in await _caches.claimants.items()): +            await _cooldown.remove_cooldown_role(claimant) +      async def move_to_in_use(self, channel: discord.TextChannel) -> None:          """Make a channel in-use and schedule it to be made dormant."""          log.info(f"Moving #{channel} ({channel.id}) to the In Use category.") diff --git a/bot/exts/moderation/infraction/superstarify.py b/bot/exts/moderation/infraction/superstarify.py index 96dfb562f..ffc470c54 100644 --- a/bot/exts/moderation/infraction/superstarify.py +++ b/bot/exts/moderation/infraction/superstarify.py @@ -104,14 +104,14 @@ class Superstarify(InfractionScheduler, Cog):              await self.reapply_infraction(infraction, action) -    @command(name="superstarify", aliases=("force_nick", "star")) +    @command(name="superstarify", aliases=("force_nick", "star", "starify"))      async def superstarify(          self,          ctx: Context,          member: Member,          duration: Expiry,          *, -        reason: str = None, +        reason: str = '',      ) -> None:          """          Temporarily force a random superstar name (like Taylor Swift) to be the user's nickname. @@ -128,16 +128,16 @@ class Superstarify(InfractionScheduler, Cog):          Alternatively, an ISO 8601 timestamp can be provided for the duration. -        An optional reason can be provided. If no reason is given, the original name will be shown -        in a generated reason. +        An optional reason can be provided, which would be added to a message stating their old nickname +        and linking to the nickname policy.          """          if await _utils.get_active_infraction(ctx, member, "superstar"):              return          # Post the infraction to the API          old_nick = member.display_name -        reason = reason or f"old nick: {old_nick}" -        infraction = await _utils.post_infraction(ctx, member, "superstar", reason, duration, active=True) +        infraction_reason = f'Old nickname: {old_nick}. {reason}' +        infraction = await _utils.post_infraction(ctx, member, "superstar", infraction_reason, duration, active=True)          id_ = infraction["id"]          forced_nick = self.get_nick(id_, member.id) @@ -152,37 +152,38 @@ class Superstarify(InfractionScheduler, Cog):          old_nick = escape_markdown(old_nick)          forced_nick = escape_markdown(forced_nick) -        superstar_reason = f"Your nickname didn't comply with our [nickname policy]({NICKNAME_POLICY_URL})."          nickname_info = textwrap.dedent(f"""              Old nickname: `{old_nick}`              New nickname: `{forced_nick}`          """).strip() +        user_message = ( +            f"Your previous nickname, **{old_nick}**, " +            f"was so bad that we have decided to change it. " +            f"Your new nickname will be **{forced_nick}**.\n\n" +            "{reason}" +            f"You will be unable to change your nickname until **{expiry_str}**. " +            "If you're confused by this, please read our " +            f"[official nickname policy]({NICKNAME_POLICY_URL})." +        ).format +          successful = await self.apply_infraction(              ctx, infraction, member, action(), -            user_reason=superstar_reason, +            user_reason=user_message(reason=f'**Additional details:** {reason}\n\n' if reason else ''),              additional_info=nickname_info          ) -        # Send an embed with the infraction information to the invoking context if -        # superstar was successful. +        # Send an embed with to the invoking context if superstar was successful.          if successful:              log.trace(f"Sending superstar #{id_} embed.")              embed = Embed( -                title="Congratulations!", +                title="Superstarified!",                  colour=constants.Colours.soft_orange, -                description=( -                    f"Your previous nickname, **{old_nick}**, " -                    f"was so bad that we have decided to change it. " -                    f"Your new nickname will be **{forced_nick}**.\n\n" -                    f"You will be unable to change your nickname until **{expiry_str}**.\n\n" -                    "If you're confused by this, please read our " -                    f"[official nickname policy]({NICKNAME_POLICY_URL})." -                ) +                description=user_message(reason='')              )              await ctx.send(embed=embed) -    @command(name="unsuperstarify", aliases=("release_nick", "unstar")) +    @command(name="unsuperstarify", aliases=("release_nick", "unstar", "unstarify"))      async def unsuperstarify(self, ctx: Context, member: Member) -> None:          """Remove the superstarify infraction and allow the user to change their nickname."""          await self.pardon_infraction(ctx, "superstar", member) | 
