如何使用带空格的命令名称?

Posted

技术标签:

【中文标题】如何使用带空格的命令名称?【英文标题】:How to use command name with spaces? 【发布时间】:2018-12-02 14:43:22 【问题描述】:

当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)

【问题讨论】:

我不确定这是否可行。我很确定在考虑命令之前,解析以确定您尝试调用哪个命令会拆分输入。您可以做的只是在您的on_message 事件中添加一个if message.content.startswith('!mobile phones')。可能你甚至可以从那里调用命令,但我不确定它是如何工作的。 【参考方案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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我知道这已经过时了,但是如果您有一个命令组、子命令组,然后是一个斜杠命令,那么当您在 discord 中输入命令时,您可以在命令中包含空格。

【讨论】:

以上是关于如何使用带空格的命令名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sqoop 导入支持带空格的列名?

如何输入带空格的字符串

带空格的 C++ system() 命令路径

Django URL 基于带空格的字符域?

如何使用带空格的 VueJS 数据键

如何在 Python 3.10 中的匹配情况下获取带空格的字符串