#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