команды ‘Help’, которые автоматически генерируют справку для подкоманды commands.group с использованием этой функции

#python #discord #discord.py #discord.py-rewrite

#python #Discord #discord.py

Вопрос:

Я пытался создать команды справки, но я не знаю, как я могу создать команды справки для группы команд, в которой основная команда разделена группами, я пытался сделать help modmail channel modmail — это группа, а канал — это вспомогательные команды, он просто говорит, что команда не существует Это функция:

Пожалуйста, обратите внимание, что я не спрашиваю, как использовать commands.group, я спрашиваю о том, как я могу использовать свою функцию для создания справки для подкоманд в commands.group()

     async def cmdhelp(self, ctx, command):
        params = []
        for key, value in command.params.items():
            if key not in ("self", "ctx"):
                params.append(f"[{key}]" if "NoneType" in str(value) else f"<{key}>")
        params = " ".join(params)
        alias = ", ".join(command.aliases)
        commandhelp = command.help
        commanddesc = command.description
        if not command.help:
            commandhelp = "`None`"
        if not command.description:
            commanddesc = "`None`"
        if not command.aliases:
            alias = "`None`"
        embed = discord.Embed(title=f"Help for {command}",
                              colour=0x59FFE7,
                              description=f"**Description:**n{commandhelp}n**Usage:**n`{command} {params}`n**Aliases:**n`{alias}`n**Permission:**n`{commanddesc}`")
        await ctx.send(embed=embed)

    @commands.group(invoke_without_command=True)
    async def help(self, ctx, *,cmd=None):
        if cmd is None:
           # lets say this is a embed with a help category list
        else:
            if (command := get(self.bot.commands, name=cmd)):
                await self.cmdhelp(ctx, command)

            else:
                await ctx.send("That command does not exist.")
  

Примеры:
Пример команды help, которую я пытаюсь создать
Если вы видите, это работает с обычной командой, которая help modmail но как я могу создать для подкоманды modmail group? которая является help modmail channel

Ответ №1:

Во-первых, это неправильный способ использования подкоманд. Вот как их использовать:

 client.remove_command("help")

@client.group()
async def main_cmd(ctx):
    print("main command")

@main_cmd.command()
async def sub_cmd(ctx):
    print("subcommand")
  

Сообщение main_cmd в discord будет просто напечатано "main command" , но сообщение main_cmd sub_cmd в discord будет напечатано "main command" , а затем "subcommand" .

Если вы не хотите, чтобы исходная команда выполнялась при вызове подкоманды, используйте ctx.invoked_subcommand :

 client.remove_command("help")

@client.group()
async def main_cmd(ctx):
    if ctx.invoked_subcommand != None:
        return
    print("main command")

@main_cmd.command()
async def sub_cmd(ctx):
    print("subcommand")
  

РЕДАКТИРОВАТЬ (после редактирования вопроса):
Чтобы создать «команды» (на самом деле это не будет командой) для каждой команды в боте, используйте bot.commands :

 client.remove_command("help")

@client.command(description = "THIS IS THE MESSAGE THAT WILL APPEAR IN THE SPECIFIC HELP COMMAND")
async def a_command(ctx):
    pass #look at the decorator

@client.command()
async def help(ctx, cmd = None):
    if cmd == None:
        await ctx.send("DEFAULT HELP")
    elif cmd in (cmds := {command.name: command for command in client.commands}):
        await ctx.send("cmd: "   cmds[cmd].description)
    else:
        await ctx.send("command not found")
  

Это создает «подкоманды» для каждой команды в боте.

Комментарии:

1. Эй, извините, но я не просил об этом, если вы видите, что мой код не отображается как command.group() потому что это не главная проблема, основная проблема в том, как я могу создавать команды справки с помощью функции, которую я просто пишу для своих подкоманд, я уже знаю, как правильно создавать подкоманды: / Я отредактировал свой пост, если вы не понимаете

2. (В моем примере) вместо того, чтобы вставлять @main_cmd.command() , вставляйте @main_cmd.group() . Затем вы можете использовать декоратор @sub_cmd.command() для создания подкоманд подкоманды.

3. Я не понял, о чем ты говоришь, я уже знаю об этом, чувак, я просто хочу, чтобы он сгенерировал команду справки с помощью async def cmdhelp(self, ctx, cmd) поэтому мне не нужно создавать новую группу команд для команды справки, пожалуйста, внимательно прочитайте вопрос.

4. Что значит «внимательно прочитайте» вы отредактировали вопрос после того, как я ответил. Я отредактирую свою, чтобы делать то, что вы хотите.

5. Если вы видите в моем вопросе, я уже создал конкретные справочные cmds с моей функцией, и я не редактировал вопрос на что-то другое, я только уточняю, что мне нужно, если вы видите изменения, я пытаюсь объяснить проблемы, не пытаясь изменить вопрос, проблема в том, что функция (специальная справка) не работает для подкоманды, например: .help modmail channel но вы ответили, как правильно создать подкоманду или группу команд :/ Я оценил это, но это не главный вопрос ;-;