Почему не обрабатываются сообщения пользователя?

Рейтинг: 0Ответов: 0Опубликовано: 09.05.2023

Пишу бота для техподдержки. Бот не обрабатывает сообщения текстовые, никак не реагирует. Отправляешь /start, он отвечает, а дальше ему без разницы что происходит. Никаких ошибок и ничего такого. Накосячил с FSM скорее всего, но не могу понять где, помогите, пожалуйста.

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 message.reply('Привет! Я готов отвечать на вопросы.')


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):
    channel_id = 'ID'  
    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())

Ответы

Ответов пока нет.