Я создаю бота для разногласий с помощью 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)
Проблема решена? Если да, отметьте любой из ответов как принятый. @temp84323






Вы можете использовать регулярные выражения. Предполагая, что для действительного имени пользователя/роли разрешены только прописные/строчные буквенно-цифровые символы:
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>
Вы можете использовать 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")
Ссылка
У вас есть идея, с чего начать?