mirror of
https://github.com/Rapptz/discord.py.git
synced 2025-07-23 03:16:48 +00:00
[commands] Change behaviour of consume rest to be more useful.
You can get back the old behaviour by passing in `rest_is_raw` to the command attributes.
This commit is contained in:
parent
18c71ab57c
commit
41d8dc63f4
@ -98,6 +98,13 @@ class Command:
|
|||||||
hidden : bool
|
hidden : bool
|
||||||
If ``True``, the default help command does not show this in the
|
If ``True``, the default help command does not show this in the
|
||||||
help output.
|
help output.
|
||||||
|
rest_is_raw : bool
|
||||||
|
If ``False`` and a keyword-only argument is provided then the keyword
|
||||||
|
only argument is stripped and handled as if it was a regular argument
|
||||||
|
that handles :exc:`MissingRequiredArgument` and default values in a
|
||||||
|
regular matter rather than passing the rest completely raw. If ``True``
|
||||||
|
then the keyword-only argument will pass in the rest of the arguments
|
||||||
|
in a completely raw matter. Defaults to ``False``.
|
||||||
"""
|
"""
|
||||||
def __init__(self, name, callback, **kwargs):
|
def __init__(self, name, callback, **kwargs):
|
||||||
self.name = name
|
self.name = name
|
||||||
@ -105,6 +112,7 @@ class Command:
|
|||||||
self.enabled = kwargs.get('enabled', True)
|
self.enabled = kwargs.get('enabled', True)
|
||||||
self.help = kwargs.get('help')
|
self.help = kwargs.get('help')
|
||||||
self.brief = kwargs.get('brief')
|
self.brief = kwargs.get('brief')
|
||||||
|
self.rest_is_raw = kwargs.get('rest_is_raw', False)
|
||||||
self.aliases = kwargs.get('aliases', [])
|
self.aliases = kwargs.get('aliases', [])
|
||||||
self.pass_context = kwargs.get('pass_context', False)
|
self.pass_context = kwargs.get('pass_context', False)
|
||||||
self.description = inspect.cleandoc(kwargs.get('description', ''))
|
self.description = inspect.cleandoc(kwargs.get('description', ''))
|
||||||
@ -174,15 +182,15 @@ class Command:
|
|||||||
if message.channel.is_private:
|
if message.channel.is_private:
|
||||||
raise NoPrivateMessage()
|
raise NoPrivateMessage()
|
||||||
|
|
||||||
role = discord.utils.get(message.server.roles, name=argument.strip())
|
role = discord.utils.get(message.server.roles, name=argument)
|
||||||
if role is None:
|
if role is None:
|
||||||
raise BadArgument('Role not found')
|
raise BadArgument('Role not found')
|
||||||
return role
|
return role
|
||||||
elif converter is discord.Game:
|
elif converter is discord.Game:
|
||||||
return discord.Game(name=argument.strip())
|
return discord.Game(name=argument)
|
||||||
elif converter is discord.Invite:
|
elif converter is discord.Invite:
|
||||||
try:
|
try:
|
||||||
return bot.get_invite(argument.strip())
|
return bot.get_invite(argument)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise BadArgument('Invite is invalid') from e
|
raise BadArgument('Invite is invalid') from e
|
||||||
|
|
||||||
@ -201,6 +209,7 @@ class Command:
|
|||||||
def transform(self, ctx, param):
|
def transform(self, ctx, param):
|
||||||
required = param.default is param.empty
|
required = param.default is param.empty
|
||||||
converter = self._get_converter(param)
|
converter = self._get_converter(param)
|
||||||
|
consume_rest_is_special = param.kind == param.KEYWORD_ONLY and not self.rest_is_raw
|
||||||
view = ctx.view
|
view = ctx.view
|
||||||
view.skip_ws()
|
view.skip_ws()
|
||||||
|
|
||||||
@ -211,7 +220,10 @@ class Command:
|
|||||||
raise MissingRequiredArgument('{0.name} is a required argument that is missing.'.format(param))
|
raise MissingRequiredArgument('{0.name} is a required argument that is missing.'.format(param))
|
||||||
return param.default
|
return param.default
|
||||||
|
|
||||||
argument = quoted_word(view)
|
if consume_rest_is_special:
|
||||||
|
argument = view.read_rest().strip()
|
||||||
|
else:
|
||||||
|
argument = quoted_word(view)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return self.do_conversion(ctx.bot, ctx.message, converter, argument)
|
return self.do_conversion(ctx.bot, ctx.message, converter, argument)
|
||||||
@ -268,9 +280,12 @@ class Command:
|
|||||||
args.append(self.transform(ctx, param))
|
args.append(self.transform(ctx, param))
|
||||||
elif param.kind == param.KEYWORD_ONLY:
|
elif param.kind == param.KEYWORD_ONLY:
|
||||||
# kwarg only param denotes "consume rest" semantics
|
# kwarg only param denotes "consume rest" semantics
|
||||||
converter = self._get_converter(param)
|
if self.rest_is_raw:
|
||||||
argument = view.read_rest()
|
converter = self._get_converter(param)
|
||||||
kwargs[name] = self.do_conversion(ctx.bot, ctx.message, converter, argument)
|
argument = view.read_rest()
|
||||||
|
kwargs[name] = self.do_conversion(ctx.bot, ctx.message, converter, argument)
|
||||||
|
else:
|
||||||
|
kwargs[name] = self.transform(ctx, param)
|
||||||
break
|
break
|
||||||
elif param.kind == param.VAR_POSITIONAL:
|
elif param.kind == param.VAR_POSITIONAL:
|
||||||
while not view.eof:
|
while not view.eof:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user