是否可以为每个命令创建一个帮助命令?不和谐.py

时间:2021-02-13 12:10:57

标签: python python-3.x discord.py

我正在寻找的是制作一个帮助命令,该命令将为特定角色提供信息。基本上是这样的:

/help -> 一般帮助信息 /help mute -> 静音帮助信息 /help ban -> 禁止帮助信息

我尝试制作不同的命令,如下所示:

@commands.command()
async def help(self, ctx):
   await ctx.channel.send('this is a help command')

@commands.command()
async def help_mute(self, ctx):
   await ctx.channel.send('Mute help information')

但两个命令都会显示第一个命令的消息。 -> this is a help command。为什么会这样,可以修复吗? 任何答案将不胜感激!

2 个答案:

答案 0 :(得分:2)

是的,您可以使用 GroupsSubcommands 来执行此操作,但是我强烈建议反对这样做,因为那样您就必须创建一个新的帮助命令每次创建命令时,所有命令都完全相同 (await ctx.send("help_for_this_command"))。

您可以做的一件事是在创建命令时将信息添加到命令的 help kwarg 中:

@commands.command(help="Mute help information")
async def mute(ctx, ...):

这样,默认的 help 会处理这个问题。但是,您无法真正更改文本的外观,因为它只会由 Discord 的默认 help 实现进行格式化,因此您必须忍受它发送的代码块。

如果您不想要那样,那么我推荐的是创建您自己的自定义 Help 命令(不仅仅是一个名为“help”的命令,而是一个继承自HelpCommand 类并在必要时覆盖函数)。然后,您可以使用每个命令的信息创建一个数据库(或 JSON 文件),然后获取该信息。

{
  "mute": "Mute help information",
  "ban": "Ban help information",
  ...
}

并且您的 help 命令的非常简化的版本将围绕以下内容展开:

async def command_callback(self, ctx, *, command=None):
    if command is not None:
        if command in json_file:
            await ctx.send(json_file[command])
        else:
            await ctx.send("This is not a known command.")

这比检查调用了哪个命令的一大串 if/else 语句要很多干净。

如果您想了解默认帮助的实现方式(以获取如何创建帮助的示例),您可以查看 Discord.py GitHub 存储库上的 source。请记住,您只需覆盖要更改的函数 - 如果默认行为满足您的需要,则无需将实现复制粘贴到您的实现中(因为基类的函数将自动调用)。

编辑:

Łukasz Kwieciński 链接了一个有用的 guide,其中包含解释如何创建您自己的 HelpCommand 的非常简单的步骤。这可能也会对您有很大帮助。

答案 1 :(得分:1)

相反,您可以将其作为参数与 help 命令一起传递。这可以通过在 help 命令之后包含一个可选输入来实现,它看起来像 /help ban/help [category]

一个简单的方法是,如果没有传递可选参数,它将只发送没有类别的帮助命令。当用户包含提供的类别时,它会发送有关该类别的帮助。这是您的命令所暗示的。

@commands.command()
async def help(self, ctx, category=None):
   if category == None:
       await ctx.channel.send('this is a help command')
       return
   if category == "ban":
       await ctx.channel.send('this is a ban and this is how to use it....')
       return
    if category == "mute":
       await ctx.channel.send('this is a mute command...')
       return
    else:
       await ctx.channel.send('Please provide a valid category')
       return