aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2016-12-25 17:30:17 -0500
committerRapptz <[email protected]>2017-01-03 09:52:03 -0500
commit406984af2e35b7f2f6b7cc50997e413ea7534cee (patch)
tree41c5fa4cd7d510c3f52b4b3f5329b00719b3943e
parentFix documentation to work. (diff)
downloaddiscord.py-406984af2e35b7f2f6b7cc50997e413ea7534cee.tar.xz
discord.py-406984af2e35b7f2f6b7cc50997e413ea7534cee.zip
[commands] First pass in making commands ext work again.
-rw-r--r--discord/ext/commands/context.py32
-rw-r--r--discord/ext/commands/converter.py44
-rw-r--r--discord/ext/commands/core.py4
3 files changed, 70 insertions, 10 deletions
diff --git a/discord/ext/commands/context.py b/discord/ext/commands/context.py
index 95996a67..efaa5b43 100644
--- a/discord/ext/commands/context.py
+++ b/discord/ext/commands/context.py
@@ -24,14 +24,18 @@ DEALINGS IN THE SOFTWARE.
"""
import asyncio
+import discord.abc
+import discord.utils
-class Context:
+class Context(discord.abc.MessageChannel):
"""Represents the context in which a command is being invoked under.
This class contains a lot of meta data to help you understand more about
the invocation context. This class is not created manually and is instead
passed around to commands by passing in :attr:`Command.pass_context`.
+ This class implements the :class:`abc.MessageChannel` ABC.
+
Attributes
-----------
message : :class:`discord.Message`
@@ -76,6 +80,7 @@ class Context:
self.invoked_with = attrs.pop('invoked_with', None)
self.invoked_subcommand = attrs.pop('invoked_subcommand', None)
self.subcommand_passed = attrs.pop('subcommand_passed', None)
+ self._state = self.message._state
@asyncio.coroutine
def invoke(self, command, *args, **kwargs):
@@ -112,6 +117,9 @@ class Context:
ret = yield from command.callback(*arguments, **kwargs)
return ret
+ def _get_destination(self):
+ return self.channel.id, getattr(self.guild, 'id', None)
+
@property
def cog(self):
"""Returns the cog associated with this context's command. None if it does not exist."""
@@ -119,3 +127,25 @@ class Context:
if self.command is None:
return None
return self.command.instance
+
+ @discord.utils.cached_property
+ def id(self):
+ # we need this to meet MessageChannel abc
+ # it is purposefully undocumented because it makes no logistic sense
+ # outside of providing the sugar of the main class.
+ return self.channel.id
+
+ @discord.utils.cached_property
+ def guild(self):
+ """Returns the guild associated with this context's command. None if not available."""
+ return self.message.guild
+
+ @discord.utils.cached_property
+ def channel(self):
+ """Returns the channel associated with this context's command. Shorthand for :attr:`Message.channel`."""
+ return self.message.channel
+
+ @discord.utils.cached_property
+ def author(self):
+ """Returns the author associated with this context's command. Shorthand for :attr:`Message.author`"""
+ return self.message.author
diff --git a/discord/ext/commands/converter.py b/discord/ext/commands/converter.py
index eb1023b0..7e54241f 100644
--- a/discord/ext/commands/converter.py
+++ b/discord/ext/commands/converter.py
@@ -32,8 +32,8 @@ import inspect
from .errors import BadArgument, NoPrivateMessage
__all__ = [ 'Converter', 'MemberConverter', 'UserConverter',
- 'ChannelConverter', 'InviteConverter', 'RoleConverter',
- 'GameConverter', 'ColourConverter' ]
+ 'TextChannelConverter', 'InviteConverter', 'RoleConverter',
+ 'GameConverter', 'ColourConverter', 'VoiceChannelConverter' ]
def _get_from_guilds(bot, getter, argument):
result = None
@@ -103,20 +103,50 @@ class MemberConverter(IDConverter):
UserConverter = MemberConverter
-class ChannelConverter(IDConverter):
+class TextChannelConverter(IDConverter):
def convert(self):
- message = self.ctx.message
bot = self.ctx.bot
match = self._get_id_match() or re.match(r'<#([0-9]+)>$', self.argument)
result = None
- guild = message.guild
+ guild = self.ctx.guild
+
+ if match is None:
+ # not a mention
+ if guild:
+ result = discord.utils.get(guild.text_channels, name=self.argument)
+ else:
+ def check(c):
+ return isinstance(c, discord.TextChannel) and c.name == self.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 result is None:
+ raise BadArgument('Channel "{}" not found.'.format(self.argument))
+
+ return result
+
+class VoiceChannelConverter(IDConverter):
+ def convert(self):
+ bot = self.ctx.bot
+
+ match = self._get_id_match() or re.match(r'<#([0-9]+)>$', self.argument)
+ result = None
+ guild = self.ctx.guild
+
if match is None:
# not a mention
if guild:
- result = discord.utils.get(guild.channels, name=self.argument)
+ result = discord.utils.get(guild.voice_channels, name=self.argument)
else:
- result = discord.utils.get(bot.get_all_channels(), name=self.argument)
+ def check(c):
+ return isinstance(c, discord.VoiceChannel) and c.name == self.argument
+ result = discord.utils.find(check, bot.get_all_channels())
else:
channel_id = int(match.group(1))
if guild:
diff --git a/discord/ext/commands/core.py b/discord/ext/commands/core.py
index 8ae3262e..13f476fe 100644
--- a/discord/ext/commands/core.py
+++ b/discord/ext/commands/core.py
@@ -85,7 +85,7 @@ class Command:
The list of aliases the command can be invoked under.
pass_context : bool
A boolean that indicates that the current :class:`Context` should
- be passed as the **first parameter**. Defaults to `False`.
+ be passed as the **first parameter**. Defaults to `True`.
enabled : bool
A boolean that indicates if the command is currently enabled.
If the command is invoked while it is disabled, then
@@ -135,7 +135,7 @@ class Command:
self.brief = kwargs.get('brief')
self.rest_is_raw = kwargs.get('rest_is_raw', False)
self.aliases = kwargs.get('aliases', [])
- self.pass_context = kwargs.get('pass_context', False)
+ self.pass_context = kwargs.get('pass_context', True)
self.description = inspect.cleandoc(kwargs.get('description', ''))
self.hidden = kwargs.get('hidden', False)
signature = inspect.signature(callback)