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