From e614f6b4cdc6280def19acfc0092fc5b95af48e1 Mon Sep 17 00:00:00 2001 From: Rapptz Date: Wed, 13 Sep 2017 17:17:04 -0400 Subject: [commands] Add CategoryChannelConverter --- discord/ext/commands/converter.py | 43 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'discord/ext/commands') diff --git a/discord/ext/commands/converter.py b/discord/ext/commands/converter.py index 5e767c90..47ce8cc8 100644 --- a/discord/ext/commands/converter.py +++ b/discord/ext/commands/converter.py @@ -35,7 +35,8 @@ from .view import StringView __all__ = [ 'Converter', 'MemberConverter', 'UserConverter', 'TextChannelConverter', 'InviteConverter', 'RoleConverter', 'GameConverter', 'ColourConverter', 'VoiceChannelConverter', - 'EmojiConverter', 'IDConverter', 'clean_content' ] + 'EmojiConverter','CategoryChannelConverter', 'IDConverter', + 'clean_content' ] def _get_from_guilds(bot, getter, argument): result = None @@ -242,6 +243,46 @@ class VoiceChannelConverter(IDConverter): return result +class CategoryChannelConverter(IDConverter): + """Converts to a :class:`CategoryChannel`. + + All lookups are via the local guild. If in a DM context, then the lookup + is done by the global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name + """ + @asyncio.coroutine + def convert(self, ctx, argument): + bot = ctx.bot + + match = self._get_id_match(argument) or re.match(r'<#([0-9]+)>$', argument) + result = None + guild = ctx.guild + + if match is None: + # not a mention + if guild: + result = discord.utils.get(guild.categories, name=argument) + else: + def check(c): + return isinstance(c, discord.CategoryChannel) and c.name == argument + result = discord.utils.find(check, bot.get_all_channels()) + else: + channel_id = int(match.group(1)) + if guild: + result = guild.get_channel(channel_id) + else: + result = _get_from_guilds(bot, 'get_channel', channel_id) + + if not isinstance(result, discord.CategoryChannel): + raise BadArgument('Channel "{}" not found.'.format(argument)) + + return result + class ColourConverter(Converter): """Converts to a :class:`Colour`. -- cgit v1.2.3