Задать вопрос
@sashaless

Как перейти в другое состояние с функцией register_next_step_handler?

Здравствуйте! Столкнулся с такой проблемой:

Есть бот (в конце прикрепил код), который является обычной анкетой заполнения характеристик человека (Имя, возраст, пол). Для удобства решил добавить во все клавиатуры кнопку "Выход" и встал вопрос: как сделать так, чтобы на "Выход" бот переходил в другое состояние, а не задавал следующий вопрос?

Кажется, что нужно реализовать ещё один декоратор (@bot.message_handler(content_types=['text'])), но бот просто не перейдёт в него, потому что работает по инструкции bot.register_next_step_handler(..., ...)

Буду рад, если получится решить такую проблему, спасибо!

Код:

import telebot
from telebot import types

API_TOKEN = 'TOKEN'

bot = telebot.TeleBot(API_TOKEN)

user_dict = {}

keyboard_main = telebot.types.ReplyKeyboardMarkup()
keyboard_main.row('Exit')


class User:
    def __init__(self, name):
        self.name = name
        self.age = None
        self.sex = None


# Handle '/start' and '/help'
@bot.message_handler(commands=['help', 'start'])
def send_welcome(message):
    msg = bot.send_message(message.chat.id, """\
Hi there, I am Example bot.
What's your name?
""", reply_markup=keyboard_main)
    bot.register_next_step_handler(msg, process_name_step)


def process_name_step(message):
    try:
        chat_id = message.chat.id
        name = message.text
        user = User(name)
        user_dict[chat_id] = user
        msg = bot.send_message(message.chat.id, 'How old are you?', reply_markup=keyboard_main)
        bot.register_next_step_handler(msg, process_age_step)
    except Exception as e:
        bot.reply_to(message, 'oooops')


def process_age_step(message):
    try:
        chat_id = message.chat.id
        age = message.text
        if not age.isdigit():
            msg = bot.send_message(message.chat.id, 'Age should be a number. How old are you?',
                                   reply_markup=keyboard_main)
            bot.register_next_step_handler(msg, process_age_step)
            return
        user = user_dict[chat_id]
        user.age = age
        markup = types.ReplyKeyboardMarkup(one_time_keyboard=True)
        markup.add('Male', 'Female', 'Exit')
        msg = bot.send_message(message.chat.id, 'What is your gender', reply_markup=markup)
        bot.register_next_step_handler(msg, process_sex_step)
    except Exception as e:
        bot.reply_to(message, 'oooops')


def process_sex_step(message):
    try:
        chat_id = message.chat.id
        sex = message.text
        user = user_dict[chat_id]
        if (sex == u'Male') or (sex == u'Female'):
            user.sex = sex
        else:
            raise Exception("Unknown sex")
        bot.send_message(chat_id, 'Nice to meet you ' + user.name + '\n Age:' + str(user.age) + '\n Sex:' + user.sex,
                         reply_markup=keyboard_main)
    except Exception as e:
        bot.reply_to(message, 'oooops')


bot.enable_save_next_step_handlers(delay=2)
bot.load_next_step_handlers()

bot.polling()
  • Вопрос задан
  • 169 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Kvason
Веб-разработчик
Делай машину состояний, такой словарик с ключами - чат айди и значениями тру или фолс и во всех хендлерах проверяй если тру то делай если нет то не делай
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы