How to use command name with spaces?

老子叫甜甜 提交于 2020-08-10 04:58:29

问题


How to make bot works when there is a space between commands in python bot. I know we can do that using sub-command or on_message but is there any another option to do that for only selected commands not for all commands.

The following code will not work.

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

So I tried using alias but still it won't working.

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

回答1:


Strictly to say, you can't. Since discord.py's command names ends with space, as defined in views.py. There are, however, a few options: re write how discord.py views handle messages (I wouldn't recommend this), use on_message and message.content.startswith, or use groups.

Since on_message is fairly straight forward to use, I will instead show you how you can "hack" the group syntax to allow command name with spaces.

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)

In discord:

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


来源:https://stackoverflow.com/questions/50999489/how-to-use-command-name-with-spaces

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!