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

Как правильно встроить FSM в телеграм бот на библиотеке telebot?

Как правильно встроить FSM в телеграм бот. В интернете нормальной информации чтоб обьяснили не нашел.

Так вот после /start команды которые должны работать при вызове не работают.

from data_save import *
import telebot
from telebot.handler_backends import StatesGroup, State
from telebot.storage import StateMemoryStorage

storage = StateMemoryStorage()
bot = telebot.TeleBot('фывфв')

class RegStates(StatesGroup):
    StateStart = State()
    StatePay = State()
    StateSubscribed = State()
    StateNoSubscribed = State()
    StateWaiting = State()
    
@bot.message_handler(commands=['start'])
def start(message):
    chat_id = message.chat.id
    user_id = message.from_user.id

    bot.set_state(user_id, RegStates.StateStart, chat_id)
    bot.send_message(chat_id, f'Привет, {message.from_user.first_name}!\n/sup - оформить подписку\n/us - информация о нас')

@bot.message_handler(state = RegStates.StateStart, commands=['sup'])
def sup(message):
    chat_id = message.chat.id
    bot.send_message(chat_id, 'Оформить подписку')
    
@bot.message_handler(state = RegStates.StateStart, commands=['us'])
def us(message):
    chat_id = message.chat.id
    bot.send_message(chat_id, 'Информация о нас')

bot.polling(non_stop= True)
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@dim5x
ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
1. storage - объявили, но не используете, надо:
bot = telebot.TeleBot('TOKEN', state_storage=storage)

2. Состояние не меняете.
3. В интернете логичнее всего смотреть примеры в репе создателей: custom_states.
4. Код:
import telebot
from telebot import types
from telebot.states import State, StatesGroup
from telebot.states.sync.context import StateContext
from telebot.states.sync.middleware import StateMiddleware
from telebot.storage import StateMemoryStorage
from telebot.types import ReplyParameters


storage = StateMemoryStorage()
bot = telebot.TeleBot('TOKEN', state_storage=storage, use_class_middlewares=True)

class MyStates(StatesGroup):
    START = State()
    US = State()
    SUP = State()


@bot.message_handler(commands=["start"])
def start(message: types.Message, state: StateContext):
    state.set(MyStates.START)
    bot.send_message(
        message.chat.id,
        f'Привет, {message.from_user.first_name}!\n/sup - оформить подписку\n/us - информация о нас',
        reply_parameters=ReplyParameters(message_id=message.message_id),
    )

@bot.message_handler(commands=["us"])
def us(message: types.Message, state: StateContext):
    state.set(MyStates.US)
    bot.send_message(
        message.chat.id,
        'Информация о нас',
        reply_parameters=ReplyParameters(message_id=message.message_id),
    )

@bot.message_handler(commands=["sup"])
def sup(message: types.Message, state: StateContext):
    state.set(MyStates.SUP)
    bot.send_message(
        message.chat.id,
        'Оформить подписку',
        reply_parameters=ReplyParameters(message_id=message.message_id),
    )


if __name__ == '__main__':
    print('start')
    bot.setup_middleware(StateMiddleware(bot))
    bot.infinity_polling()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vae_11
@Vae_11 Автор вопроса
import telebot
from telebot import custom_filters, types
from telebot.states import State, StatesGroup
from telebot.states.sync.context import StateContext
from telebot.storage import StateMemoryStorage
from telebot.types import ReplyParameters

storage = StateMemoryStorage()
bot = telebot.TeleBot('TOKENN', state_storage=storage, use_class_middlewares=True)

class states(StatesGroup):
    StateStart = State()
    StatePay = State()
    StateSubscribed = State()
    StateNoSubscribed = State()
    StateWaiting = State()
    
@bot.message_handler(commands=['start'])
def start(message: types.Message, state: StateContext):
    chat_id = message.chat.id
    user_id = message.from_user.id
    
    state.set(states.StateStart)
    bot.send_message(chat_id, f'Привет, {message.from_user.first_name}!\n/sup - оформить подписку\n/us - информация о нас')

@bot.message_handler(state = states.StateStart, commands=['sup'])
def sup(message: types.Message):
    chat_id = message.chat.id
    bot.send_message(chat_id, 'Оформить подписку')


@bot.message_handler(state = states.StateStart, commands=['us'])
def us(message: types.Message):    
    chat_id = message.chat.id
    bot.send_message(chat_id, 'Информация о нас')



bot.add_custom_filter(custom_filters.StateFilter(bot))

# necessary for state parameter in handlers.
from telebot.states.sync.middleware import StateMiddleware

bot.setup_middleware(StateMiddleware(bot))

bot.polling(non_stop= True)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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