Как можно сделать так, чтобы бот в 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>
Для того, чтобы настроить фильтрацию сообщений, чтобы бот 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}, Такого рецепта нет')