我正在寻找的是制作一个帮助命令,该命令将为特定角色提供信息。基本上是这样的:
/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
。为什么会这样,可以修复吗?
任何答案将不胜感激!
答案 0 :(得分:2)
是的,您可以使用 Groups
和 Subcommands
来执行此操作,但是我强烈建议反对这样做,因为那样您就必须创建一个新的帮助命令每次创建命令时,所有命令都完全相同 (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