Есть ли способ для бота discord реагировать на упоминание конкретного пользователя с помощью Discord.py ?

#python #discord #bots #discord.py

#python #Discord #боты #discord.py

Вопрос:

Я бы хотел, чтобы мой бот мог отвечать на упоминание определенного пользователя (например, один человек упоминает мою личную учетную запись, и бот отвечает, что меня здесь нет)

Есть ли способ сделать это, используя формат, подобный этому?

 @client.event
async def on_message(message):

    if message.author == client.user:
        return

    if message.content.startswith('@user_id'):
        await message.channel.send('Im not here leave a message!') 
 

Ответ №1:

Вам нужно будет использовать определенный формат, в котором боты discord получают упоминания. Формат <@!user_id>.

 @client.event
async def on_message(message):
    if ("<@!put user id here>" in message.content):
        await message.channel.send("Im not here leave a message!")
 

Пример того, как это применялось, и это сработало для меня

 @client.event
async def on_message(message):
    if ("<@!348256959671173120>" in message.content):
        await message.channel.send("Im not here leave a message!")
 

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

1. итак, я переработал свою программу, чтобы следовать этому формату, и все же нада возможно ли, что это устаревший формат или в этом есть что-то еще?

2. Я удалил строку f и фигурные скобки и разместил именно то, что я использовал, чтобы оно работало под ним. Возможно, вы можете попробовать это.

Ответ №2:

Объекты-члены Discord имеют .mentioned_in(message) метод.

 WIZARD_ID = 123456 # <- replace with user ID you want
async def on_message(message):
    wizard_of_oz = message.guild.get_member(WIZARD_ID)
    if wizard_of_oz.mentioned_in(message):
         await message.channel.send("Who dares summon the great Wizard of OZ?!")
 

Если вы также хотите указать, упоминается ли пользователь по роли, вам также необходимо проверить role_mentions в сообщении. Итак, более полный пример выглядит следующим образом:

 def was_mentioned_in(message: discord.Message, member: discord.Member) -> bool:
    """
    Whether or not the member (or a role the member has) was mentioned in a message.
    """
    if member.mentioned_in(message):
        return True
    for role in message.role_mentions:
        if role in member.roles:
            return True
    return False

@client.event
async def on_message(message):
    wizard_of_oz = message.guild.get_member(WIZARD_ID)
    if was_mentioned_in(message, wizard_of_oz):
         await message.channel.send("Who dares summon the great Wizard of OZ?!")