как я могу также проверить, имеет ли участник определенную роль в операторе if? нужно, чтобы elif выполнялся только в том случае, если у вас есть определенная роль?

#python #discord.py

Вопрос:

Я создаю функцию автоматического удаления сообщений в своем боте discord и сел на мель, когда добрался до команды удалить слова из списка цензоров. потому что слово, которое я хочу удалить из списка, находится в списке, который бот удаляет msg. Я хочу обойти это, добавив дополнительное событие if внутри моего сообщения об удалении сообщения, которое проверяет, имеет ли пользователь роль администратора или роль Мод. мой желаемый результат заключается в том, что если у них действительно есть роль, она вернется, и msg delete никогда не будет выполняться

        if any(word in message.content for word in censorlist):
        if message.author == client.user:
            
            return
        
        elif
            
            return

        else:

            await message.delete()
    await client.process_commands(message)```
 

Ответ №1:

Есть в основном 2 способа, которыми вы можете получить роль discord.utils.get , и они есть guild.get_role . В любом случае, вот примеры для обоих

get_role (Требуется идентификатор)

 # Somewhere above all the if statements
admin_role = message.guild.get_role(id_here)
mod_role = message.guild.get_role(id_here)
# And then in your elif
elif mod_role in message.author.roles or admin_role in message.author.roles:
 

Это получает роли с помощью идентификатора и проверяет, есть ли у участника роли

utils.get (требуется имя)

 # Somewhere above all the if statements
admin_role = discord.utils.get(message.guild.roles, name="Admin")
mod_role = 
# And then in your elif
elif mod_role in message.author.roles or admin_role in message.author.roles:
 

Это получает роли по имени и проверяет, есть ли у участника эта роль

Или это тоже можно сделать в одной строке (выглядит плохо)

 elif discord.utils.get(message.author.roles, name="Mod") or discord.utils.get(messages.author.roles, name="Admin"):
 

Это использует тот факт, что utils.get не возвращает ничего, если вещь не найдена. Таким образом, он ищет роли участника для роли с именем Admin/Mod, если она не найдена, то у участника нет роли

Какой-нибудь еще более короткий путь, который не рекомендуется

 elif any(role.id in [mod_role_id, admin_role_id] for role in message.author.roles):
 

Это сравнивает роль идентификатора каждой роли, которую имеет участник, с идентификаторами ролей модов и администраторов