Как настроить бота, чтобы он ожидал ответа пользователя перед отправкой следующего вопроса?

Как можно улучшить функцию quiz_questions и check_answer для реализации викторины в Telegram через бота?
  • 15 декабря 2023 г. 13:57
Ответы на вопрос 2
Для того чтобы бот ожидал ответа пользователя перед отправкой следующего вопроса, можно использовать состояния (states) в боте. 

Вот пример реализации функции quiz_questions с использованием состояний:

```python
from telegram.ext import ConversationHandler

# Определяем состояния
QUESTION, ANSWER = range(2)

def start_quiz(update, context):
    # Инициализируем первый вопрос
    context.user_data['question_index'] = 0
    context.bot.send_message(chat_id=update.effective_chat.id, text="Добро пожаловать в викторину! Готовы начать?")
    return QUESTION

def quiz_questions(update, context):
    questions = ['Вопрос 1', 'Вопрос 2', 'Вопрос 3']  # Здесь хранятся вопросы
    answers = ['Ответ на вопрос 1', 'Ответ на вопрос 2', 'Ответ на вопрос 3']  # Здесь хранятся ответы
    user_answer = update.message.text
    correct_answer = answers[context.user_data['question_index']]

    if user_answer == correct_answer:
        context.bot.send_message(chat_id=update.effective_chat.id, text="Правильно!")
    else:
        context.bot.send_message(chat_id=update.effective_chat.id, text="Неправильно!")

    # Переходим к следующему вопросу или завершаем викторину
    context.user_data['question_index'] += 1

    if context.user_data['question_index'] < len(questions):
        context.bot.send_message(chat_id=update.effective_chat.id, text=questions[context.user_data['question_index']])
        return ANSWER
    else:
        context.bot.send_message(chat_id=update.effective_chat.id, text="Викторина завершена!")
        return ConversationHandler.END

def main():
    updater = Updater(token='your_token', use_context=True)
    dispatcher = updater.dispatcher

    conversation_handler = ConversationHandler(
        entry_points=[CommandHandler('start', start_quiz)],
        states={
            QUESTION: [MessageHandler(Filters.text, quiz_questions)],
            ANSWER: [MessageHandler(Filters.text, quiz_questions)]
        },
        fallbacks=[],
    )

    dispatcher.add_handler(conversation_handler)
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()
```

В этом примере мы определяем два состояния - QUESTION (ожидание ответа пользователя на вопрос) и ANSWER (ожидание ответа пользователя на предыдущий вопрос). После отправки вопроса ботом, мы переходим в состояние QUESTION, где бот ожидает ответа пользователя. Затем, после получения ответа, мы вызываем функцию quiz_questions снова, но уже в состоянии ANSWER, чтобы проверить ответ и перейти к следующему вопросу.

Чтобы улучшить функцию check_answer, вы можете добавить более подробное сообщение об ошибке, например, сообщение с правильным ответом, если пользователь ответил неправильно. Вы также можете добавить возможность отслеживать количество правильных/неправильных ответов пользователя и выводить результаты в конце викторины.
как я понял ты пытаешься сделать бота для телеграмм. я делал бота и я добавлял код взял со своего бота. думаю принцип понятен будет. возможно я не знаю но есть способ проще написать.
Похожие вопросы