aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--discord/ext/commands/converter.py27
1 files changed, 17 insertions, 10 deletions
diff --git a/discord/ext/commands/converter.py b/discord/ext/commands/converter.py
index 7bb0f835..04dae3e9 100644
--- a/discord/ext/commands/converter.py
+++ b/discord/ext/commands/converter.py
@@ -68,12 +68,19 @@ class Converter:
def convert(self):
raise NotImplementedError('Derived classes need to implement this.')
-class MemberConverter(Converter):
+class IDConverter(Converter):
+ def __init__(self, ctx, argument):
+ super().__init__(ctx, argument)
+ self._id_regex = re.compile(r'([0-9]{15,21})$')
+
+ def _get_id_match(self):
+ return self._id_regex.match(self.argument)
+
+class MemberConverter(IDConverter):
def convert(self):
message = self.ctx.message
bot = self.ctx.bot
-
- match = re.match(r'<@!?([0-9]+)>$', self.argument)
+ match = self._get_id_match() or re.match(r'<@!?([0-9]+)>$', self.argument)
server = message.server
result = None
if match is None:
@@ -96,12 +103,12 @@ class MemberConverter(Converter):
UserConverter = MemberConverter
-class ChannelConverter(Converter):
+class ChannelConverter(IDConverter):
def convert(self):
message = self.ctx.message
bot = self.ctx.bot
- match = re.match(r'<#([0-9]+)>$', self.argument)
+ match = self._get_id_match() or re.match(r'<#([0-9]+)>$', self.argument)
result = None
server = message.server
if match is None:
@@ -137,13 +144,13 @@ class ColourConverter(Converter):
raise BadArgument('Colour "{}" is invalid.'.format(arg))
return method()
-class RoleConverter(Converter):
+class RoleConverter(IDConverter):
def convert(self):
server = self.ctx.message.server
if not server:
raise NoPrivateMessage()
- match = re.match(r'<@&([0-9]+)>$', self.argument)
+ match = self._get_id_match() or re.match(r'<@&([0-9]+)>$', self.argument)
params = dict(id=match.group(1)) if match else dict(name=self.argument)
result = discord.utils.get(server.roles, **params)
if result is None:
@@ -163,13 +170,13 @@ class InviteConverter(Converter):
except Exception as e:
raise BadArgument('Invite is invalid or expired') from e
-class EmojiConverter(Converter):
+class EmojiConverter(IDConverter):
@asyncio.coroutine
def convert(self):
message = self.ctx.message
bot = self.ctx.bot
- match = re.match(r'<:([a-zA-Z0-9]+):([0-9]+)>$', self.argument)
+ match = self._get_id_match() or re.match(r'<:[a-zA-Z0-9]+:([0-9]+)>$', self.argument)
result = None
server = message.server
if match is None:
@@ -180,7 +187,7 @@ class EmojiConverter(Converter):
if result is None:
result = discord.utils.get(bot.get_all_emojis(), name=self.argument)
else:
- emoji_id = match.group(2)
+ emoji_id = match.group(1)
# Try to look up emoji by id.
if server: