aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Qwerty-133 <[email protected]>2021-08-29 01:13:35 +0530
committerGravatar Qwerty-133 <[email protected]>2021-08-29 01:13:35 +0530
commit570490f58cbbb166a9a1e4b0276cd6f2552a24f1 (patch)
tree8f09392f94c69bf818c9f772e8d2061f886c8437
parentAdded bot variables tag (#1784) (diff)
Replace UserMentionOrID with UnambiguousUser
-rw-r--r--bot/converters.py30
-rw-r--r--bot/exts/moderation/infraction/management.py4
-rw-r--r--bot/exts/utils/reminders.py4
3 files changed, 26 insertions, 12 deletions
diff --git a/bot/converters.py b/bot/converters.py
index 0118cc48a..c4979972b 100644
--- a/bot/converters.py
+++ b/bot/converters.py
@@ -495,22 +495,36 @@ class HushDurationConverter(Converter):
return duration
-class UserMentionOrID(UserConverter):
+def _is_an_unambiguous_user_argument(argument: str) -> bool:
+ """Check if the provided argument is a user mention, user id, or username."""
+ has_id_or_mention = bool(IDConverter()._get_id_match(argument) or RE_USER_MENTION.match(argument))
+
+ if not has_id_or_mention:
+ if argument[0] == '@':
+ argument = argument[1:]
+
+ # Check to see if the author passed a username (a discriminator exists)
+ if len(argument) > 5 and argument[-5] == '#':
+ return True
+
+ return has_id_or_mention
+
+
+class UnambiguousUser(UserConverter):
"""
- Converts to a `discord.User`, but only if a mention or userID is provided.
+ Converts to a `discord.User`, but only if a mention, userID or a username is provided.
- Unlike the default `UserConverter`, it doesn't allow conversion from a name or name#descrim.
+ Unlike the default `UserConverter`, it doesn't allow conversion from a name.
This is useful in cases where that lookup strategy would lead to ambiguity.
"""
async def convert(self, ctx: Context, argument: str) -> discord.User:
"""Convert the `arg` to a `discord.User`."""
- match = self._get_id_match(argument) or RE_USER_MENTION.match(argument)
-
- if match is not None:
+ if _is_an_unambiguous_user_argument(argument):
return await super().convert(ctx, argument)
else:
- raise BadArgument(f"`{argument}` is not a User mention or a User ID.")
+ raise BadArgument(f"`{argument}` is not a User mention, a User ID or a Username in the format"
+ " `name#discriminator`.")
class Infraction(Converter):
@@ -557,7 +571,7 @@ if t.TYPE_CHECKING:
OffTopicName = str # noqa: F811
ISODateTime = datetime # noqa: F811
HushDurationConverter = int # noqa: F811
- UserMentionOrID = discord.User # noqa: F811
+ UnambiguousUser = discord.User # noqa: F811
Infraction = t.Optional[dict] # noqa: F811
Expiry = t.Union[Duration, ISODateTime]
diff --git a/bot/exts/moderation/infraction/management.py b/bot/exts/moderation/infraction/management.py
index 641ad0410..7f27896d7 100644
--- a/bot/exts/moderation/infraction/management.py
+++ b/bot/exts/moderation/infraction/management.py
@@ -12,7 +12,7 @@ from discord.utils import escape_markdown
from bot import constants
from bot.bot import Bot
-from bot.converters import Expiry, Infraction, MemberOrUser, Snowflake, UserMentionOrID, allowed_strings
+from bot.converters import Expiry, Infraction, MemberOrUser, Snowflake, UnambiguousUser, allowed_strings
from bot.exts.moderation.infraction.infractions import Infractions
from bot.exts.moderation.modlog import ModLog
from bot.pagination import LinePaginator
@@ -201,7 +201,7 @@ class ModManagement(commands.Cog):
# region: Search infractions
@infraction_group.group(name="search", aliases=('s',), invoke_without_command=True)
- async def infraction_search_group(self, ctx: Context, query: t.Union[UserMentionOrID, Snowflake, str]) -> None:
+ async def infraction_search_group(self, ctx: Context, query: t.Union[UnambiguousUser, Snowflake, str]) -> None:
"""Searches for infractions in the database."""
if isinstance(query, int):
await self.search_user(ctx, discord.Object(query))
diff --git a/bot/exts/utils/reminders.py b/bot/exts/utils/reminders.py
index 2bed5157f..41b6cac5c 100644
--- a/bot/exts/utils/reminders.py
+++ b/bot/exts/utils/reminders.py
@@ -15,7 +15,7 @@ from bot.constants import (
Guild, Icons, MODERATION_ROLES, POSITIVE_REPLIES,
Roles, STAFF_PARTNERS_COMMUNITY_ROLES
)
-from bot.converters import Duration, UserMentionOrID
+from bot.converters import Duration, UnambiguousUser
from bot.pagination import LinePaginator
from bot.utils.checks import has_any_role_check, has_no_roles_check
from bot.utils.lock import lock_arg
@@ -30,7 +30,7 @@ WHITELISTED_CHANNELS = Guild.reminder_whitelist
MAXIMUM_REMINDERS = 5
Mentionable = t.Union[discord.Member, discord.Role]
-ReminderMention = t.Union[UserMentionOrID, discord.Role]
+ReminderMention = t.Union[UnambiguousUser, discord.Role]
class Reminders(Cog):