discord.py Я хочу, чтобы бот реагировал на привет, привет и т. Д

#python #python-3.x #discord #discord.py #discord.py-rewrite

#python #python-3.x #Discord #discord.py #discord.py-переписать

Вопрос:

Я знаю, как заставить его реагировать на привет, привет и т. Д. Проблема в том, что он будет реагировать, даже если «привет» находится внутри слова, например, «chill», как я могу помешать ему реагировать на сообщения типа «chill». Я пытался использовать пробелы, но они просто в конечном итоге нарушают его еще больше

 @bot.listen() #react to messages
async def on_message(message):
if message.guild is not None:
    content = message.content
    reaction = "👋"
    if 'hi' in content.lower():
        try:
            await asyncio.sleep(1)
            await message.add_reaction(f"<{reaction}>")
            print(f'added reaction {reaction} {content}')
        except Exception as e:
            print(f'error adding reaction {reaction} {content}')
 

введите описание изображения здесь

Ответ №1:

Это происходит потому, что if 'hi' in content.lower() вы смотрите, найдена ли строка hi внутри строки message.content . Лучшим способом решения этой проблемы было бы использование регулярных выражений (регулярных выражений).

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

 import re

def findCoincidences(w):
    return re.compile(r'b({0})b'.format(w)).search
 

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

 # ...
if findCoincidences('hi')(content.lower()):
        try:
            await asyncio.sleep(1)
            await message.add_reaction(f"<{reaction}>")
            print(f'added reaction {reaction} {content}')
        except Exception as e:
            print(f'error adding reaction {reaction} {content}')
 

По сути, эта новая findCoincidences() функция вернет нам re.Match объект, если он найдет слово «привет» в содержимом сообщения, поэтому оно войдет в try инструкции.