Есть ли способ запретить боту discord.py упоминать роли?

Я создаю бота для разногласий с помощью discord.py, и у меня есть команда сказать, но вы можете заставить бота упомянуть любую роль. Я уже запретил упоминать @everyone и @here, но не могу понять, как запретить упоминать роли. Вот код

async def say(ctx, *, message=None):
message = message or "You have to type a message"
message_components = message.split()
if "@everyone" in message_components or "@here" in message_components:
    await ctx.send("You can not ping everyone")
    return

await ctx.message.delete()
await ctx.send(message)

У вас есть идея, с чего начать?

AMC 24.12.2020 04:11

Проблема решена? Если да, отметьте любой из ответов как принятый. @temp84323

Jarvis 25.12.2020 14:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 369
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать регулярные выражения. Предполагая, что для действительного имени пользователя/роли разрешены только прописные/строчные буквенно-цифровые символы:

import re
user_regex = r"@[a-zA-Z0-9]+"
message = "I'm tagging @you and @you2 in this message!"
match = re.findall(user_regex, message)
if match:
    await ctx.send("You can not ping everyone")
    return

Конечно, вы можете использовать сложное регулярное выражение для своего имени пользователя, если хотите. Или вы можете определить регулярное выражение для роли в соответствии с вашими требованиями и попытаться соответствующим образом сопоставить.

на самом деле упоминания ролей выглядят не так @role (только everyone и here), а вот так <@&role_id>

Łukasz Kwieciński 24.12.2020 11:00
Ответ принят как подходящий

Вы можете использовать message.role_mentions

mentions = message.role_mentions

my_role = ctx.guild.get_role(some_id)

if my_role in mentions:
    await ctx.send("You can't mention that role")

Если у вас несколько ролей

my_roles = [] # a list of `discord.Role` objects

mentions = message.role_mentions

if any(role in mentions for role in my_roles):
    await ctx.send("You can't mention that role")

Также лучший способ проверить, упоминаются ли @everyone и @here в самом содержании сообщения, вы можете использовать атрибут message.mention_everyone

if message.mention_everyone:
    await ctx.send("You can't mention everyone")

Ссылка

Другие вопросы по теме