Написание функции для пользовательских подкоманд discord.py

#python #command #bots #discord.py

#python #команда #боты #discord.py

Вопрос:

Итак, я хочу написать функцию для всех подкоманд для моего бота на python, но я не уверен, как они работают в discord.py . Например, у меня здесь есть этот код отключения звука.

 @bot.command()
async def mute(ctx,member : discord.Member, *, reason=None):

    with open("role.json", "r") as f:
        roles = json.load(f)

    muted_role = discord.utils.get(ctx.guild.roles, id=roles[f"{ctx.guild.id}"]["role_id"])
  
    embed = discord.Embed(color=discord.Color(0xFF0000), title=f"{member} has been muted.")
            #sent to DM
    embedC=discord.Embed(title=f"{member} has been muted.",color=discord.Color(0xff0000))
    embedC.add_field(name=f"Member",value=f"{member}",inline=False)
    embedC.add_field(name=f"Moderator",value=f"{ctx.author}",inline=False)
    embedC.add_field(name=f"Reason",value=f"{reason}",inline=False)
    embedC.set_footer(text=f"Mute was successfully invoked. Expiration is indefinite.")
    await member.add_roles(muted_role)
    await ctx.send(embed=embed)
    await member.send(embed=embedC)
 

В приведенном выше коде есть моя mute команда. Я знаю, что это немного не имеет отношения к моему вопросу, но я хочу создать пользовательскую подкоманду для бота. Вы можете удалить встроенную команду help , выполнив бот bot.remove_command("help") , но как мне удалить пользовательскую подкоманду справки? Теперь это приводит ко второй части вопроса, которая также является основным вопросом. Как мне написать функцию для пользовательской подкоманды, чтобы мне не приходилось писать и повторять один и тот же процесс для каждой подкоманды?
Я попытался сделать def subcommand(command, error) , где команда — это команда, необходимая для справки, а ошибка — это сообщение об ошибке, которое я хочу поместить. Поэтому, если моя команда отключения звука завершится неудачей, она попросит пользователя использовать мою подкоманду, и моя подкоманда предоставит им информацию о том, как работает эта команда. Спасибо!

Ответ №1:

Есть встроенная поддержка подкоманд:

 @bot.group()
async def cmd(ctx):
    if ctx.invoked_subcommand is None:
        await ctx.send("Command can't be invoked without a subcommand")


@cmd.command()
async def subcommand1(ctx, *args):
    #...


@cmd.command()
async def subcommand2(ctx, *args):
    #...
 

Для вызова:

 {prefix}cmd subcommand1 arg1 arg2
 

Документы