import telebot # telebot from telebot import custom_filters from telebot.handler_backends import State, StatesGroup #States # States storage from telebot.storage import StateMemoryStorage # Starting from version 4.4.0+, we support storages. # StateRedisStorage -> Redis-based storage. # StatePickleStorage -> Pickle-based storage. # For redis, you will need to install redis. # Pass host, db, password, or anything else, # if you need to change config for redis. # Pickle requires path. Default path is in folder .state-saves. # If you were using older version of pytba for pickle, # you need to migrate from old pickle to new by using # StatePickleStorage().convert_old_to_new() # Now, you can pass storage to bot. state_storage = StateMemoryStorage() # you can init here another storage bot = telebot.TeleBot("TOKEN", state_storage=state_storage) # States group. class MyStates(StatesGroup): # Just name variables differently name = State() # creating instances of State class is enough from now surname = State() age = State() @bot.message_handler(commands=['start']) def start_ex(message): """ Start command. Here we are starting state """ bot.set_state(message.from_user.id, MyStates.name, message.chat.id) bot.send_message(message.chat.id, 'Hi, write me a name') # Any state @bot.message_handler(state="*", commands=['cancel']) def any_state(message): """ Cancel state """ bot.send_message(message.chat.id, "Your state was cancelled.") bot.delete_state(message.from_user.id, message.chat.id) @bot.message_handler(state=MyStates.name) def name_get(message): """ State 1. Will process when user's state is MyStates.name. """ bot.send_message(message.chat.id, 'Now write me a surname') bot.set_state(message.from_user.id, MyStates.surname, message.chat.id) with bot.retrieve_data(message.from_user.id, message.chat.id) as data: data['name'] = message.text @bot.message_handler(state=MyStates.surname) def ask_age(message): """ State 2. Will process when user's state is MyStates.surname. """ bot.send_message(message.chat.id, "What is your age?") bot.set_state(message.from_user.id, MyStates.age, message.chat.id) with bot.retrieve_data(message.from_user.id, message.chat.id) as data: data['surname'] = message.text # result @bot.message_handler(state=MyStates.age, is_digit=True) def ready_for_answer(message): """ State 3. Will process when user's state is MyStates.age. """ with bot.retrieve_data(message.from_user.id, message.chat.id) as data: msg = ("Ready, take a look:\n" f"Name: {data['name']}\n" f"Surname: {data['surname']}\n" f"Age: {message.text}") bot.send_message(message.chat.id, msg, parse_mode="html") bot.delete_state(message.from_user.id, message.chat.id) #incorrect number @bot.message_handler(state=MyStates.age, is_digit=False) def age_incorrect(message): """ Wrong response for MyStates.age """ bot.send_message(message.chat.id, 'Looks like you are submitting a string in the field age. Please enter a number') # register filters bot.add_custom_filter(custom_filters.StateFilter(bot)) bot.add_custom_filter(custom_filters.IsDigitFilter()) bot.infinity_polling(skip_pending=True)