Как я могу сделать так, чтобы только определенная роль могла использовать команду с discord.py ?

#discord.py-rewrite

#discord.py-переписать

Вопрос:

Я пытаюсь создать команду, которая работает только с определенной ролью. Я не уверен на 100%, как это сделать, и я не могу найти решение где-либо еще. Мой код останавливается, потому что я еще не очень хорошо знаком с кодированием, но вот оно:

 @bot.command()
async def sign(ctx, member: discordMember):
 if ctx.author.server_roles
 

Отсюда я полностью потерян и понятия не имею, что делать.

Ответ №1:

Самый эффективный способ сделать так, чтобы команда могла использоваться только с определенной ролью, — это .has_role() декоратор. Вы можете поместить туда строку с именем роли (с учетом регистра) или идентификатором роли (рекомендуется), более подробную информацию можно найти в документации Вот пример:

 @bot.command()
@commands.has_role("Administrator")
async def foo(ctx)
   await ctx.send("bar")
 

Если вы хотите сделать так, чтобы пользователь мог использовать эту команду только тогда, когда у него есть какая-либо роль, тогда .has_any_role() это был бы правильный путь, он также принимает строки или целые числа. Вы можете найти более подробную информацию об этом здесь. Вот краткий пример того, как это будет работать:

 @bot.command()
@commands.has_any_role("Administrators", "Moderators", 492212595072434186)
async def foo(ctx):
    await ctx.send("bar")
 

Счастливого кодирования!

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

1. Спасибо за помощь! Еще одна вещь, как я могу создать сообщение об ошибке, если у них нет роли?

Ответ №2:

Обычно, когда кто-то пытается выполнить такую команду с .has_role помощью декоратора, discord.ext.командует.Возникает пропущенная роль, поэтому обработка ее будет выглядеть примерно так :

 @bot.command()
@commands.has_any_role("Administrators", "Moderators", 492212595072434186)
async def foo(ctx):
    try:
       await ctx.send("bar")
    except commands.MissingRole:
       await ctx.send("lol")
 

Конечно, если у вас много команд, я бы рекомендовал использовать глобальный обработчик ошибок.