@nottodaygc

Как сделать так чтобы бот ждал ответ?

Начал делать бота-игру в которой бот говорит страну, а пользователь отвечает(не на сообщение, а просто в чате) боту столицы этой страны.

Мой код:
import telebot
from telebot import types
from config import TOKEN
import random


bot = telebot.TeleBot(TOKEN)

country_easy = ["Россия","Франция","Арабские Эмираты"]


@bot.message_handler(commands=['start'])
def start_messages(message):
    bot.send_message(message.chat.id, 'Привет! Я бот-игра в столицы! Для начала игры введи /play')

@bot.message_handler(commands=['play'])
def play_message(message):
    bot.send_message(message.chat.id, 'Выбирай сложность игры!')
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    btn1 = types.KeyboardButton("Easy")
    btn2 = types.KeyboardButton("Medium")
    btn3 = types.KeyboardButton("High")
    markup.add(btn1, btn2,btn3)
    bot.send_message(message.chat.id,
                     text="Нажимай на кнопку для выбора сложности:".format(
                         message.from_user), reply_markup=markup)


@bot.message_handler(content_types=["text"])
def easy(message):
    if (message.text == "Easy"):
        markup = types.ReplyKeyboardRemove()
        bot.send_message(message.chat.id, "Хороший выбор, давай начнем игру!",reply_markup=markup)
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        btn1 = types.KeyboardButton("Запуск")
        markup.add(btn1)
        reply_markup = markup
        msg = bot.send_message(message.chat.id, "Запускай игру!", reply_markup=markup)
        bot.register_next_step_handler(msg, easy_game)

@bot.message_handler(func=lambda message: True)
def easy_game(message):
    usertext = message.text
    bot.send_message(message.chat.id, random.choice(country_easy))
    if usertext == ("Москва","Париж", "Арабские Эмираты"):
        bot.send_message(message.chat.id, "Правильный ответ!")
        bot.send_message(message.chat.id, random.choice(country_easy))
    else:
        bot.send_message(message.chat.id, "Неправильный ответ")


if __name__ == '__main__':
    bot.polling(none_stop=True)


66a2d6cc61dab408487427.png
Проблема в том, что бот не ждет ответа пользователя, а сразу пишет что ответ неправильный!
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@twistfire92
Python backend developer
Во-первых нужно убрать декоратор у функции easy_game. Эта функция вызывается в register_next_step_handler, так что следующее сообщение будет как раз обрабатываться этой функцией.

Во-вторых. В этой же функции сначала отправляется страна, затем отправляется ответ. Должно быть не так.
Страна должна отправляться в функции easy(). Но там у тебя пользователю выводится сообщение с предложением запустить игру. Так что пропускай (пока что) предложение с запуском игры и сразу выводи название страны, потом обрабатывай ответ от пользователя в easy_game.

В-третьих. По текущей логике, ответив "Париж" на вопрос "Россия", выдаст правильный ответ. Ты должен где-то сохранять правильный ответ на поставленый вопрос, чтобы сравнить с вводом пользователя. Для этого в функцию easy_game() можно добавить еще один аргумент right_answer, и передавать в него правильный ответ через дополнительные параметры в register_next_step_handler

В-четвертых. Лучше использовать словарь, где ключом будет вопрос, а значением - ответ.

В-пятых. Столица Эмиратов - Абу-Даби.

Весь код приводить не буду, только некоторые моменты.

countries_easy = {
	"Россия": "Москва",
	"Франция": "Париж",
	"Арабские Эмираты": "Абу-Даби",
	}

...

@bot.message_handler(content_types=["text"])
def easy(message):
	...
	# рандомно выбираем пару ключ-значение из словаря.
	country, capital = random.choice(list(countries_easy.items()))
	msg = bot.send_message(messaga.chat.id, country)
	# Третьим параметром отправляем правильный ответ
	bot.register_next_step_handler(msg, easy_game, capital)


def easy_game(message, right_answer):
    if message.text == capital:
        bot.send_message(message.chat.id, "Правильный ответ!")
    else:
        bot.send_message(message.chat.id, "Неправильный ответ")


В общем, разобравшись в работе register_next_step_handler, можно будет уже полноценную логику собирать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Cucumberchik
по ищи в документаций что то про sessionStorage, где можно хранить значение,
к примеру
//начальная состояние
let storageActive = false
bot.command("get",(ctx)=>{
if(storageActive){
ctx.reply("получил ответ")
storageActive = false;
}else {
ctx.reply("я жду ответа")
storageActive = true;
}

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы