Бот отвечает на собственные сообщения

Пишу бота для техподдержки.Когда я отправляю вопрос, бот пересылает его на канал и начинает пересылать его тоже. И так продолжается бесконечно.

Пример(User- пользователь, который отправил боту вопрос, Bot1- бот, который отвечает пользователю, Bot2- бот, который пишет в канал)

P.S. Bot1 и Bot2 - один и тот же бот, написано для облегчения понимания.

  • **Пользователь:** /start

  • **Бот1**: Привет! Я бот технической поддержки. Опишите вашу проблему, и я передам ее операторам.

  • **Пользователь**: *описывает свою проблему*

  • **Бот1**: *отвечает на сообщение* Сообщение было передано операторам. Ожидайте ответа.

  • **Бот2:** Отправляет сообщение на канал

  • **Оператор:** *В комментариях к сообщению отвечает*

  • **Бот2:** Пожалуйста, используйте команду /start для начала общения.

     bot = Bot(token='TOKEN')
     dp = Dispatcher(bot, storage=MemoryStorage())
     nlp = spacy.load('ru_core_news_lg')
     conn = sqlite3.connect('database.db')
     db = conn.cursor()
    
     class States(StatesGroup):
         QUESTION = 'question'
         ANSWER = 'answer'
         FEEDBACK = 'feedback'
    
     @dp.message_handler(commands=['start'])
     async def start_command(message: types.Message, state: FSMContext):
         await state.finish()  
         await state.update_data(question=message.text)  
         await send_to_operators(message.chat.id, state)
    
     @dp.message_handler()
     async def handle_message(message: types.Message, state: FSMContext):
         if message.text.lower() == 'завершить диалог':
             data = await state.get_data()
             question = data.get('question')
             answer = message.text
             save_to_database(question, answer)
    
             await bot.send_message(message.chat.id, "Диалог завершен. Если у вас возникнут еще вопросы, не стесняйтесь обращаться.")
             await state.finish()  
         else:
             await bot.send_message(message.chat.id, "Пожалуйста, используйте команду /start для начала общения.")
    
     def find_answer(question):
         question_doc = nlp(question)
         best_match = None
         best_score = 0.0
         for row in db:
             answer_doc = nlp(row['answer'])
             score = question_doc.similarity(answer_doc)
             if score > best_score:
                 best_match = row['answer']
                 best_score = score
         return best_match
    
     async def send_answer(chat_id, answer):
         keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
         keyboard.add(types.KeyboardButton('Да'), types.KeyboardButton('Нет'))
         await bot.send_message(chat_id, answer, reply_markup=keyboard)
    
     async def send_to_operators(question, state: FSMContext):
         channel_id = 'ID'
         data = await state.get_data()
         question = data.get('question')
         await bot.send_message(channel_id, f"Новый вопрос от пользователя:\n\n{question}")
    
     @dp.channel_post_handler(content_types=[types.ContentType.TEXT])
     async def handle_operator_reply(message: types.Message):
         if message.reply_to_message:
             user_question = message.reply_to_message.text  
             operator_reply = message.text  
             user_id = message.reply_to_message.from_user.id  
             await bot.send_message(user_id, operator_reply)
    
     def save_to_database(question, answer):
         db.execute("INSERT INTO question_answer (question, answer) VALUES (?, ?)", (question, answer))
         conn.commit()
    
     @dp.message_handler(state=States.QUESTION)
     async def handle_question(message: types.Message, state: FSMContext):
         question = message.text
         doc = nlp(question)
         processed_question = ' '.join([token.lemma_ for token in doc])
    
         answer = find_answer(processed_question)
    
         if answer != None:
             await send_answer(message.chat.id, answer)
             await state.update_data(question=question)
             await States.ANSWER.set()
    
         else:
             await send_to_operators(message.text)
             await bot.send_message(message.chat.id, "Ваш вопрос передан операторам. Пожалуйста, ожидайте ответа.")
             data = await state.get_data()
             question = data.get('question')
             answer = message.text
             save_to_database(question, answer)
    
             await state.finish()
     @dp.message_handler(content_types=types.ContentType.TEXT, state=States.ANSWER)
     async def handle_feedback(message: types.Message, state: FSMContext):
         if message.text.lower() == 'да':
             await bot.send_message(message.chat.id, "Спасибо! Всего доброго.")
             await state.finish()  # Завершение состояния
         elif message.text.lower() == 'нет':
             # Отправляем вопрос операторам
             await send_to_operators(message.text)
             await bot.send_message(message.chat.id, "Ваш вопрос передан операторам. Пожалуйста, ожидайте ответа.")
             data = await state.get_data()
             question = data.get('question')
             answer = message.text
             save_to_database(question, answer)
    
             await state.finish() 
         elif message.text.lower() == 'завершить диалог':
             data = await state.get_data()
             question = data.get('question')
             answer = message.text
             save_to_database(question, answer)
    
             await bot.send_message(message.chat.id, "Диалог завершен. Если у вас возникнут еще вопросы, не стесняйтесь обращаться.")
             await state.finish()
         else:
             await bot.send_message(message.chat.id, "Пожалуйста, используйте кнопки для ответа.")
    
     if __name__ == '__main__':
         logging.basicConfig(level=logging.INFO)
         asyncio.run(dp.start_polling())
    

Ответы (0 шт):