Как настроить фильтрацию сообщений в Discord, чтобы бот DISNAKE мог на них реагировать?

Как можно сделать так, чтобы бот в Discord после обнаружения совпадения ключа с сообщением пользователя отправлял только одно сообщение, а не вошел в бесконечный цикл дублирования? <br/> Вот кусок кода, который я использую: <br/><pre><code class="python">@bot.event
async def on_message(message):
    data = CFG.get('Recipes')
    text = message.content.lower()
    for key, value in data.items():
        if text == key.lower():
            print(value)
            await message.channel.send(f'{message.author.mention}, {value}')
            break
        else:
            print('ОШИБКА')
            await message.channel.send(f'{message.author.mention}, Такого рецепта нет')
            break</code></pre>
  • 31 мая 2024 г. 20:21
Ответы на вопрос 2
Для того, чтобы настроить фильтрацию сообщений, чтобы бот DISNAKE мог на них реагировать, вам нужно добавить проверку на то, что сообщение является необходимым для бота. Для этого вы можете использовать атрибуты сообщения, такие как автор или содержание. Например:

```python
@bot.event
async def on_message(message):
    if message.author == bot.user:  # Проверяем, что сообщение отправлено ботом
        return

    # Дальнейший код обработки сообщений
```

Чтобы бот отправлял только одно сообщение после обнаружения совпадения ключа с сообщением пользователя, вам нужно убрать отправку сообщения в цикле `for` и добавить переменную, которая будет отслеживать, было ли уже отправлено сообщение. Например:

```python
@bot.event
async def on_message(message):
    data = CFG.get('Recipes')
    text = message.content.lower()
    message_sent = False

    for key, value in data.items():
        if text == key.lower():
            print(value)
            await message.channel.send(f'{message.author.mention}, {value}')
            message_sent = True
            break
    
    if not message_sent:
        print('ОШИБКА')
        await message.channel.send(f'{message.author.mention}, Такого рецепта нет')
```

Таким образом, бот будет отправлять только одно сообщение, либо с рецептом, либо с уведомлением о его отсутствии.
поскольку ваш бот реагирует на все сообщения, которые видит в текстовых каналах, он реагирует также и на свои собственные: сначала на «@GHOST, значение по ключу тест», потом на «@test_bot, Такого ключа нет», и так до бесконечности. 

достаточно будет добавить проверку на бота в начале:
@bot.event
async def on_message(message):
    if message.author == bot.user:
        return
    
    data = CFG.get('Recipes')
    text = message.content.lower()
    for key, value in data.items():
        if text == key.lower():
            print(value)
            await message.channel.send(f'{message.author.mention}, {value}')
            break
    else:
        print('ОШИБКА')
        await message.channel.send(f'{message.author.mention}, Такого рецепта нет')
Похожие вопросы