如何在命令名中使用空格?

时间:2018-06-23 08:44:20

标签: python discord discord.py

当python bot中的命令之间存在空格时,如何使bot运行。我知道我们可以使用子命令或on_message来做到这一点,但是还有其他选择可以仅对选定的命令执行此操作,而不是对所有命令进行操作。

以下代码不起作用。

@bot.command(pass_context=True)
async def mobile phones(ctx):
    msg = "Pong. {0.author.mention}".format(ctx.message)
    await bot.say(msg)

所以我尝试使用别名,但仍然无法正常工作。

@bot.command(pass_context=True, aliases=['mobile phones'])
async def phones(ctx):
    msg = "Pong. {0.author.mention}".format(ctx.message)
    await bot.say(msg)

2 个答案:

答案 0 :(得分:1)

严格地说,你不能。由于discord.py的命令名称以空格结尾,如views.py中所定义。但是,有一些选项:重新编写discord.py视图如何处理消息(我不推荐这样做),使用on_messagemessage.content.startswith或使用组。

由于on_message非常易于使用,因此,我将向您展示如何“破解” group语法以允许命令名称带有空格。

class chain_command:
    def __init__(self, name, **kwargs):
        names = name.split()
        self.last = names[-1]
        self.names = iter(names[:-1])
        self.kwargs = kwargs

    @staticmethod
    async def null():
        return

    def __call__(self, func):
        from functools import reduce
        return reduce(lambda x, y: x.group(y)(self.null), self.names, bot.group(next(self.names))(self.null)).command(self.last, **self.kwargs)(func)

@chain_command("mobile phones", pass_context=True)
async def mobile_phones(ctx):
    msg = "Pong. {0.author.mention}".format(ctx.message)
    await bot.say(msg)

不一致:

me: <prefix>mobile phones
bot: Pong. @me

答案 1 :(得分:0)

这是一种不太复杂的方法,但您可以将 args 作为命令名称本身传递!因此,在您的示例 mobile phones 中,您可以在其上使用 arg。

@client.command
async def mobile(ctx, phones = None)
  if phones != "phones":
    return
  await ctx.send("Yay it works")