Как заставить бота слушать разговор в фоновом режиме, но отвечать, только если его имя указано в предложении - PullRequest
1 голос
/ 10 января 2020

Я разрабатываю чат-бот для Telegram с именем "Джокер". Это прекрасно работает в частной беседе. Целая тренировка настроена, чтобы ответить на несколько вопросов. Но когда он помещен в группу, он отвечает на все сообщения, отправленные группе, создавая беспорядок в чате. Было бы хорошо, если бы мой бот мог слышать разговоры группы на заднем плане и вмешиваться, только если его имя "Джокер" указано в одном предложении. Обычно он отвечал на вопросы до тех пор, пока в предложении содержалось слово «Джокер». По этой причине я пытаюсь реализовать эту функцию, но она не работает должным образом.

Текущая реакция

  • Гиллан: Доброе утро, ребята!
  • Мици Дюпри: Доброе утро, Гиллан!

... Джокер печатает

  • Гиллан: Доброе утро, Джокер!

... Джокер печатает

  • Гиллан: Джокер?

... Джокер печатает

Communication.py

def respond(self, message):
    """
    Receive message from user and returns corresponding answer.
    """
    if re.search("joker", message, re.IGNORECASE):
        joker_in_message = True
    else:
        joker_in_message = False

    message_without_joker = re.sub(r'\bjoker\b', '', message, flags=re.IGNORECASE)
    #remove duplicate spaces
    message_without_joker = re.sub(r'\s{2,}', ' ', message_without_joker)

    if joker_in_message and len(message) > 50 and self.watson_usage:
        top_answer = get_analysis(message_without_joker)
        return f"Hmm, you're talking about {top_answer}"
    if joker_in_message and len(message.strip()) == len("joker"):
        return "Something wrong is not right, text me what "\
               "you told my creators!" \
               "Type /info to learn more."
    elif joker_in_message:
        return self.comm.get_response(self.clean(message_without_joker))

Приложение. py

def text_message(self, bot, update):
    self.send_type_action(bot, update)  
    if not self.check_for_emotion(update):
        message = update.effective_message.text
        answer = self.comm.respond(message)
        if answer:
            update.effective_message.reply_text(answer)
    return 0  
...