aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Johannes Christ <[email protected]>2021-10-04 07:29:39 +0200
committerGravatar GitHub <[email protected]>2021-10-04 07:29:39 +0200
commit8d4d742e5d37d338f5d793aa829ac263e29c314d (patch)
tree064d7c7e309ed6bdc9790efb41abe4b65dd700a7
parentMerge pull request #1851 from python-discord/fix-hasattr-check (diff)
parentMerge branch 'main' into allow-helpers-to-edit-their-own-nomination-reason (diff)
Merge pull request #1841 from python-discord/allow-helpers-to-edit-their-own-nomination-reason
Allow helpers to edit their own nomination reason
-rw-r--r--bot/exts/recruitment/talentpool/_cog.py75
1 files changed, 66 insertions, 9 deletions
diff --git a/bot/exts/recruitment/talentpool/_cog.py b/bot/exts/recruitment/talentpool/_cog.py
index 38d7cfca1..f9c836bbd 100644
--- a/bot/exts/recruitment/talentpool/_cog.py
+++ b/bot/exts/recruitment/talentpool/_cog.py
@@ -6,13 +6,13 @@ from typing import Optional, Union
import discord
from async_rediscache import RedisCache
-from discord import Color, Embed, Member, PartialMessage, RawReactionActionEvent
-from discord.ext.commands import Cog, Context, group, has_any_role
+from discord import Color, Embed, Member, PartialMessage, RawReactionActionEvent, User
+from discord.ext.commands import BadArgument, Cog, Context, group, has_any_role
from bot.api import ResponseCodeError
from bot.bot import Bot
from bot.constants import Channels, Emojis, Guild, MODERATION_ROLES, Roles, STAFF_ROLES
-from bot.converters import MemberOrUser
+from bot.converters import MemberOrUser, UnambiguousMemberOrUser
from bot.exts.recruitment.talentpool._review import Reviewer
from bot.pagination import LinePaginator
from bot.utils import scheduling, time
@@ -76,7 +76,7 @@ class TalentPool(Cog, name="Talentpool"):
return True
@group(name='talentpool', aliases=('tp', 'talent', 'nomination', 'n'), invoke_without_command=True)
- @has_any_role(*MODERATION_ROLES)
+ @has_any_role(*STAFF_ROLES)
async def nomination_group(self, ctx: Context) -> None:
"""Highlights the activity of helper nominees by relaying their messages to the talent pool channel."""
await ctx.send_help(ctx.command)
@@ -343,18 +343,75 @@ class TalentPool(Cog, name="Talentpool"):
await ctx.send(":x: The specified user does not have an active nomination")
@nomination_group.group(name='edit', aliases=('e',), invoke_without_command=True)
- @has_any_role(*MODERATION_ROLES)
+ @has_any_role(*STAFF_ROLES)
async def nomination_edit_group(self, ctx: Context) -> None:
"""Commands to edit nominations."""
await ctx.send_help(ctx.command)
@nomination_edit_group.command(name='reason')
- @has_any_role(*MODERATION_ROLES)
- async def edit_reason_command(self, ctx: Context, nomination_id: int, actor: MemberOrUser, *, reason: str) -> None:
- """Edits the reason of a specific nominator in a specific active nomination."""
+ @has_any_role(*STAFF_ROLES)
+ async def edit_reason_command(
+ self,
+ ctx: Context,
+ nominee_or_nomination_id: Union[UnambiguousMemberOrUser, int],
+ nominator: Optional[UnambiguousMemberOrUser] = None,
+ *,
+ reason: str
+ ) -> None:
+ """
+ Edit the nomination reason of a specific nominator for a given nomination.
+
+ If nominee_or_nomination_id resolves to a member or user, edit the currently active nomination for that person.
+ Otherwise, if it's an int, look up that nomination ID to edit.
+
+ If no nominator is specified, assume the invoker is editing their own nomination reason.
+ Otherwise, edit the reason from that specific nominator.
+
+ Raise a permission error if a non-mod staff member invokes this command on a
+ specific nomination ID, or with an nominator other than themselves.
+ """
+ # If not specified, assume the invoker is editing their own nomination reason.
+ nominator = nominator or ctx.author
+
+ if not any(role.id in MODERATION_ROLES for role in ctx.author.roles):
+ if ctx.channel.id != Channels.nominations:
+ await ctx.send(f":x: Nomination edits must be run in the <#{Channels.nominations}> channel")
+ return
+
+ if nominator != ctx.author or isinstance(nominee_or_nomination_id, int):
+ # Invoker has specified another nominator, or a specific nomination id
+ raise BadArgument(
+ "Only moderators can edit specific nomination IDs, "
+ "or the reason of a nominator other than themselves."
+ )
+
+ await self._edit_nomination_reason(
+ ctx,
+ target=nominee_or_nomination_id,
+ actor=nominator,
+ reason=reason
+ )
+
+ async def _edit_nomination_reason(
+ self,
+ ctx: Context,
+ *,
+ target: Union[int, Member, User],
+ actor: MemberOrUser,
+ reason: str,
+ ) -> None:
+ """Edit a nomination reason in the database after validating the input."""
if len(reason) > REASON_MAX_CHARS:
- await ctx.send(f":x: Maxiumum allowed characters for the reason is {REASON_MAX_CHARS}.")
+ await ctx.send(f":x: Maximum allowed characters for the reason is {REASON_MAX_CHARS}.")
return
+ if isinstance(target, int):
+ nomination_id = target
+ else:
+ if nomination := self.cache.get(target.id):
+ nomination_id = nomination["id"]
+ else:
+ await ctx.send("No active nomination found for that member.")
+ return
try:
nomination = await self.bot.api_client.get(f"bot/nominations/{nomination_id}")