Как заставить бота реагировать, если кто-то упоминает бота?

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

 if message.content.startswith('@435379055253127178'):
    text = await client.send_message(message.channel, "**Baking a cake**")
    await client.send_message(message.channel, "**Baking a cake**")
    await client.edit_message(text, "Hi i'm cake bot nice to meet you!")

Однако ответа я не получил.


person Cupcake    schedule 01.05.2018    source источник


Ответы (3)


Упоминания хранятся в атрибуте с именем message.mentions.

if discord.utils.get(message.server.members, '435379055253127178') in message.mentions:
    text = await client.send_message(message.channel, "**Baking a cake**")
    await client.send_message(message.channel, "**Baking a cake**")
    await client.edit_message(text, "Hi i'm cake bot nice to meet you!")

Но если вы хотите вместо этого проверять упоминания вручную, иногда есть! между @ и id, и они заключены в ‹>. Я бы использовал регулярное выражение:

from re import match

if match("<@!?435379055253127178>", message.content) is not None:
    text = await client.send_message(message.channel, "**Baking a cake**")
    await client.send_message(message.channel, "**Baking a cake**")
    await client.edit_message(text, "Hi i'm cake bot nice to meet you!")

Это позволит проверить, есть ли упоминание пользователя в начале сообщения, аналогично тому, что вы пытались сделать. Поскольку .mentions ведет неупорядоченный список всех упомянутых пользователей.

Кстати, если идентификатор - это бот, вам не придется жестко кодировать идентификатор.

if client.user in message.mentions:
    ...
person abccd    schedule 01.05.2018

Самый чистый способ сделать это выглядит следующим образом:

@client.event
async def on_message(message):
    if client.user.mentioned_in(message):
        await message.channel.send("hello!")
person Syllabear    schedule 23.10.2020

Я так делаю, не могу сказать, лучший ли это способ

import discord
from discord.ext import commands

client = commands.Bot(command_prefix=">")

@client.event    
async def on_message(message):
    for x in message.mentions:
        if(x==client.user):
            await message.channel.send(f":sauropod: did someone mention me?")

    await client.process_commands(message)        

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

person Dhanush suvarna    schedule 24.06.2020