diff options
Diffstat (limited to '')
| -rw-r--r-- | bot/exts/recruitment/talentpool/_cog.py | 19 | ||||
| -rw-r--r-- | bot/exts/recruitment/talentpool/_review.py | 51 | 
2 files changed, 47 insertions, 23 deletions
| diff --git a/bot/exts/recruitment/talentpool/_cog.py b/bot/exts/recruitment/talentpool/_cog.py index fbe79382d..72604be51 100644 --- a/bot/exts/recruitment/talentpool/_cog.py +++ b/bot/exts/recruitment/talentpool/_cog.py @@ -1,14 +1,16 @@  import logging  import textwrap  from collections import ChainMap +from io import StringIO  from typing import Union +import discord  from discord import Color, Embed, Member, User  from discord.ext.commands import Cog, Context, group, has_any_role  from bot.api import ResponseCodeError  from bot.bot import Bot -from bot.constants import Channels, Guild, MODERATION_ROLES, STAFF_ROLES, Webhooks +from bot.constants import Channels, Emojis, Guild, MODERATION_ROLES, STAFF_ROLES, Webhooks  from bot.converters import FetchedMember  from bot.exts.moderation.watchchannels._watchchannel import WatchChannel  from bot.exts.recruitment.talentpool._review import Reviewer @@ -330,7 +332,18 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):          """Mark a user's nomination as reviewed and cancel the review task."""          if not await self.reviewer.mark_reviewed(ctx, user_id):              return -        await ctx.send(f"✅ The user with ID `{user_id}` was marked as reviewed.") +        await ctx.send(f"{Emojis.check_mark} The user with ID `{user_id}` was marked as reviewed.") + +    @nomination_group.command(aliases=('gr',)) +    @has_any_role(*MODERATION_ROLES) +    async def get_review(self, ctx: Context, user_id: int) -> None: +        """Get the user's review as a markdown file.""" +        review = (await self.reviewer.make_review(user_id))[0] +        if review: +            file = discord.File(StringIO(review), f"{user_id}_review.md") +            await ctx.send(file=file) +        else: +            await ctx.send(f"There doesn't appear to be an active nomination for {user_id}")      @nomination_group.command(aliases=('review',))      @has_any_role(*MODERATION_ROLES) @@ -340,7 +353,7 @@ class TalentPool(WatchChannel, Cog, name="Talentpool"):              return          await self.reviewer.post_review(user_id, update_database=False) -        await ctx.message.add_reaction("✅") +        await ctx.message.add_reaction(Emojis.check_mark)      @Cog.listener()      async def on_member_ban(self, guild: Guild, user: Union[User, Member]) -> None: diff --git a/bot/exts/recruitment/talentpool/_review.py b/bot/exts/recruitment/talentpool/_review.py index fb3461238..11aa3b62b 100644 --- a/bot/exts/recruitment/talentpool/_review.py +++ b/bot/exts/recruitment/talentpool/_review.py @@ -66,26 +66,40 @@ class Reviewer:              self._review_scheduler.schedule_at(review_at, user_id, self.post_review(user_id, update_database=True))      async def post_review(self, user_id: int, update_database: bool) -> None: -        """Format a generic review of a user and post it to the nomination voting channel.""" +        """Format the review of a user and post it to the nomination voting channel.""" +        review, seen_emoji = await self.make_review(user_id) +        if not review: +            return + +        guild = self.bot.get_guild(Guild.id) +        channel = guild.get_channel(Channels.nomination_voting) +          log.trace(f"Posting the review of {user_id}") +        message = (await self._bulk_send(channel, review))[-1] +        if seen_emoji: +            for reaction in (seen_emoji, "\N{THUMBS UP SIGN}", "\N{THUMBS DOWN SIGN}"): +                await message.add_reaction(reaction) + +        if update_database: +            nomination = self._pool.watched_users[user_id] +            await self.bot.api_client.patch(f"{self._pool.api_endpoint}/{nomination['id']}", json={"reviewed": True}) + +    async def make_review(self, user_id: int) -> typing.Tuple[str, Optional[Emoji]]: +        """Format a generic review of a user and return it with the seen emoji.""" +        log.trace(f"Formatting the review of {user_id}")          nomination = self._pool.watched_users[user_id]          if not nomination:              log.trace(f"There doesn't appear to be an active nomination for {user_id}") -            return +            return "", None          guild = self.bot.get_guild(Guild.id) -        channel = guild.get_channel(Channels.nomination_voting)          member = guild.get_member(user_id) -        if update_database: -            await self.bot.api_client.patch(f"{self._pool.api_endpoint}/{nomination['id']}", json={"reviewed": True}) -          if not member: -            await channel.send( -                f"I tried to review the user with ID `{user_id}`, but they don't appear to be on the server 😔" -            ) -            return +            return ( +                f"I tried to review the user with ID `{user_id}`, but they don't appear to be on the server :pensive:" +            ), None          opening = f"<@&{Roles.moderators}> <@&{Roles.admins}>\n{member.mention} ({member}) for Helper!" @@ -100,14 +114,11 @@ class Reviewer:          vote_request = (              "*Refer to their nomination and infraction histories for further details*.\n"              f"*Please react {seen_emoji} if you've seen this post." -            " Then react 👍 for approval, or 👎 for disapproval*." +            " Then react :+1: for approval, or :-1: for disapproval*."          ) -        review = "\n\n".join(part for part in (opening, current_nominations, review_body, vote_request)) - -        message = (await self._bulk_send(channel, review))[-1] -        for reaction in (seen_emoji, "👍", "👎"): -            await message.add_reaction(reaction) +        review = "\n\n".join((opening, current_nominations, review_body, vote_request)) +        return review, seen_emoji      async def _construct_review_body(self, member: Member) -> str:          """Formats the body of the nomination, with details of activity, infractions, and previous nominations.""" @@ -256,10 +267,10 @@ class Reviewer:      @staticmethod      def _random_ducky(guild: Guild) -> Union[Emoji, str]: -        """Picks a random ducky emoji to be used to mark the vote as seen. If no duckies found returns 👀.""" +        """Picks a random ducky emoji to be used to mark the vote as seen. If no duckies found returns :eyes:."""          duckies = [emoji for emoji in guild.emojis if emoji.name.startswith("ducky")]          if not duckies: -            return "👀" +            return ":eyes:"          return random.choice(duckies)      @staticmethod @@ -289,12 +300,12 @@ class Reviewer:          await self._pool.fetch_user_cache()          if user_id not in self._pool.watched_users:              log.trace(f"Can't find a nominated user with id {user_id}") -            await ctx.send(f"❌ Can't find a currently nominated user with id `{user_id}`") +            await ctx.send(f":x: Can't find a currently nominated user with id `{user_id}`")              return False          nomination = self._pool.watched_users[user_id]          if nomination["reviewed"]: -            await ctx.send("❌ This nomination was already reviewed, but here's a cookie 🍪") +            await ctx.send(":x: This nomination was already reviewed, but here's a cookie :cookie:")              return False          await self.bot.api_client.patch(f"{self._pool.api_endpoint}/{nomination['id']}", json={"reviewed": True}) | 
