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

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

 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!")

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

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
4 469
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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:
    ...

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

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)        

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

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

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

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