mirror of
https://github.com/eternnoir/pyTelegramBotAPI.git
synced 2023-08-10 21:12:57 +03:00
9d9e76e724
Fixed "ERROR - TeleBot: "message_handler: Commands filter should be list of strings (commands), unknown type supplied to the 'commands' filter list. Not able to use the supplied type."
107 lines
3.3 KiB
Python
107 lines
3.3 KiB
Python
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<b>"
|
|
f"Name: {data['name']}\n"
|
|
f"Surname: {data['surname']}\n"
|
|
f"Age: {message.text}</b>")
|
|
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)
|