[Mod] Use a better converter for Hackban & Unban (#3524)

closes #3523
This commit is contained in:
DiscordLiz 2020-02-08 07:43:03 -05:00 committed by GitHub
parent 9a278213bd
commit 8e3a76186b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 6 deletions

View File

@ -0,0 +1,2 @@
Allow mentions in hackban and ban commands.
Have the correct lower bound on length of a snowflake for the converter.

View File

@ -1,16 +1,20 @@
import re
from redbot.core.commands import Converter, BadArgument from redbot.core.commands import Converter, BadArgument
from redbot.core.i18n import Translator from redbot.core.i18n import Translator
_ = Translator("Mod", __file__) _ = Translator("Mod", __file__)
_id_regex = re.compile(r"([0-9]{15,21})$")
_mention_regex = re.compile(r"<@!?([0-9]{15,21})>$")
class RawUserIds(Converter): class RawUserIds(Converter):
async def convert(self, ctx, argument): async def convert(self, ctx, argument):
# This is for the hackban command, where we receive IDs that # This is for the hackban and unban commands, where we receive IDs that
# are most likely not in the guild. # are most likely not in the guild.
# As long as it's numeric and long enough, it makes a good candidate # Mentions are supported, but most likely won't ever be in cache.
# to attempt a ban on
if argument.isnumeric() and len(argument) >= 17: if match := _id_regex.match(argument) or _mention_regex.match(argument):
return int(argument) return int(match.group(1))
raise BadArgument(_("{} doesn't look like a valid user ID.").format(argument)) raise BadArgument(_("{} doesn't look like a valid user ID.").format(argument))

View File

@ -581,7 +581,7 @@ class KickBanMixin(MixinMeta):
@commands.guild_only() @commands.guild_only()
@commands.bot_has_permissions(ban_members=True) @commands.bot_has_permissions(ban_members=True)
@checks.admin_or_permissions(ban_members=True) @checks.admin_or_permissions(ban_members=True)
async def unban(self, ctx: commands.Context, user_id: int, *, reason: str = None): async def unban(self, ctx: commands.Context, user_id: RawUserIds, *, reason: str = None):
"""Unban a user from this server. """Unban a user from this server.
Requires specifying the target user's ID. To find this, you may either: Requires specifying the target user's ID. To find this, you may either: