aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bot/exts/recruitment/talentpool/_cog.py89
1 files changed, 56 insertions, 33 deletions
diff --git a/bot/exts/recruitment/talentpool/_cog.py b/bot/exts/recruitment/talentpool/_cog.py
index e5dc447ec..83a9a8191 100644
--- a/bot/exts/recruitment/talentpool/_cog.py
+++ b/bot/exts/recruitment/talentpool/_cog.py
@@ -1,5 +1,6 @@
import asyncio
import textwrap
+from datetime import datetime, timezone
from io import StringIO
from typing import Optional, Union
@@ -14,7 +15,7 @@ from bot.bot import Bot
from bot.constants import Bot as BotConfig, Channels, Emojis, Guild, MODERATION_ROLES, Roles, STAFF_ROLES
from bot.converters import MemberOrUser, UnambiguousMemberOrUser
from bot.exts.recruitment.talentpool._api import Nomination, NominationAPI
-from bot.exts.recruitment.talentpool._review import Reviewer
+from bot.exts.recruitment.talentpool._review import RECENT_ACTIVITY_DAYS, Reviewer
from bot.log import get_logger
from bot.pagination import LinePaginator
from bot.utils import time
@@ -163,70 +164,92 @@ class TalentPool(Cog, name="Talentpool"):
end_reason=f"Automatic removal: User was inactive for more than {DAYS_UNTIL_INACTIVE}"
)
- @nomination_group.command(
- name="nominees",
- aliases=("nominated", "all", "list", "watched"),
- root_aliases=("nominees",)
+ @nomination_group.group(
+ name="list",
+ aliases=("nominated", "nominees"),
+ invoke_without_command=True
)
@has_any_role(*MODERATION_ROLES)
- async def list_command(
+ async def list_group(
self,
ctx: Context,
- oldest_first: bool = False,
) -> None:
"""
- Shows the users that are currently in the talent pool.
+ Shows the users that are currently in the talent pool, ordered by next to be reviewed.
- The optional kwarg `oldest_first` can be used to order the list by oldest nomination.
+ Note that this order will change over time, so should not be relied upon.
"""
- await self.list_nominated_users(ctx, oldest_first=oldest_first)
+ await self.list_nominated_users(ctx, order_by_priority=True)
+
+ @list_group.command(name="oldest")
+ async def list_oldest(self, ctx: Context) -> None:
+ """Shows the users that are currently in the talent pool, ordered by oldest nomination."""
+ await self.list_nominated_users(ctx, oldest_first=True)
+
+ @list_group.command(name='newest')
+ async def list_newest(self, ctx: Context) -> None:
+ """Shows the users that are currently in the talent pool, ordered by newest nomination."""
+ await self.list_nominated_users(ctx, oldest_first=False)
async def list_nominated_users(
self,
ctx: Context,
oldest_first: bool = False,
+ order_by_priority: bool = False
) -> None:
"""
- Gives an overview of the nominated users list.
-
- It specifies the user's mention, name, how long ago they were nominated, and whether their
- review was posted.
+ Lists the currently nominated users.
The optional kwarg `oldest_first` orders the list by oldest entry.
"""
+ now = datetime.now(tz=timezone.utc)
+ embed = Embed(
+ title="Talent Pool active nominations",
+ color=Color.blue()
+ )
nominations = await self.api.get_nominations(active=True)
- if oldest_first:
- nominations = reversed(nominations)
- lines = []
+ if not nominations:
+ embed.description = "There are no active nominations."
+ await ctx.send(embed=embed)
+ return
+
+ if order_by_priority:
+ nominations = await self.reviewer.sort_nominations_to_review(nominations, now)
+ elif oldest_first:
+ nominations.reverse()
+
+ messages_per_user = await self.api.get_activity(
+ [nomination.user_id for nomination in nominations],
+ days=RECENT_ACTIVITY_DAYS
+ )
+ lines: list[str] = []
for nomination in nominations:
- member = await get_or_fetch_member(ctx.guild, nomination.user_id)
line = f"• `{nomination.user_id}`"
+
+ member = await get_or_fetch_member(ctx.guild, nomination.user_id)
if member:
line += f" ({member.name}#{member.discriminator})"
+ else:
+ line += " (not in server)"
+
line += f", added {time.format_relative(nomination.inserted_at)}"
- if not member: # Cross off users who left the server.
- line = f"~~{line}~~"
+
+ is_ready_for_review = await self.reviewer.is_nomination_ready_for_review(
+ nomination,
+ messages_per_user[nomination.user_id],
+ now
+ )
if nomination.reviewed:
line += " *(reviewed)*"
- lines.append(line)
+ elif is_ready_for_review:
+ line += " *(ready for review)*"
- if not lines:
- lines = ("There's nothing here yet.",)
+ lines.append(line)
- embed = Embed(
- title="Talent Pool active nominations",
- color=Color.blue()
- )
await LinePaginator.paginate(lines, ctx, embed, empty=False)
- @nomination_group.command(name='oldest')
- @has_any_role(*MODERATION_ROLES)
- async def oldest_command(self, ctx: Context) -> None:
- """Shows the users that are currently in the talent pool, ordered by oldest nomination."""
- await self.list_nominated_users(ctx, oldest_first=True)
-
@nomination_group.command(
name="forcenominate",
aliases=("fw", "forceadd", "fa", "fn", "forcewatch"),