@Frag0S

Конечный автомат, в чем ошибка?

Добрый день, пытаюсь реализовать конечный автомат для отслеживания позиции пользователя. При попытке запуска выдает ошибку name 'STATE_DICT' is not defined, подскажите как исправить

import config
import telebot

bot = telebot.TeleBot(config.token)


@bot.message_handler(commands=['start'])
def start(message):
	key = telebot.types.ReplyKeyboardMarkup(True,False)
	key.row("кнопка1")
	key.row("кнопка2")
	bot.send_message(message.chat.id, "Выберите пункт меню:", reply_markup=key)


@bot.message_handler(func=lambda mess: "кнопка1" == mess.text, content_types=['text'])
def handle_text(message):
	key = telebot.types.ReplyKeyboardMarkup(True, False)
	key.row("кнопка5")
	key.row("назад")
	chat_id = message.chat.id
	STATE_DICT[chat_id] = '1'
	bot.send_message(message.chat.id, "Выбери кнопку", reply_markup=key)

@bot.message_handler(func=lambda mess: "кнопка2" == mess.text, content_types=['text'])
def handle_text(message):
	key = telebot.types.ReplyKeyboardMarkup(True, False)
	key.row("кнопка7")
	key.row("назад")
	bot.send_message(message.chat.id, "Выбери кнопку", reply_markup=key)


@bot.message_handler(unc=lambda mess: "назад" == mess.text, content_types=['text'])
def start_finite_machine(message):
	if STATE_DICT[chat.id] == '1':
		start(message)

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


Делал по примеру Как сделать корректным вывод при нажатии кнопки в телеграм боте на Python?
  • Вопрос задан
  • 773 просмотра
Решения вопроса 1
Ranc58
@Ranc58
Backend python developer
Вы не обяъвили STATE_DICT )

В Вашем случае :
import config
import telebot

bot = telebot.TeleBot(config.token)
STATE_DICT = {}


Во вторых не надо везде хендлить. Для этого вам и нужен конечный автомат - он отслеживает состояние и сам перекидывает на нужную функцию.

Ниже полный пример. Должен работать(не уверен так как писал на память, но логика верная)

import config
import telebot
from telebot import types

bot = telebot.TeleBot(config.token)
STATE_DICT = {}


@bot.message_handler(commands=['start'])
def start(message):
    markup = types.ReplyKeyboardMarkup(
        one_time_keyboard=False,
        resize_keyboard=True
    )
    markup.add('Кнопка1')
    markup.add('Кнопка2')
    question = 'Выбери'
    chat_id = message.chat.id
    STATE_DICT[chat_id] = 'START'
    bot.send_message(chat_id, question, reply_markup=markup)


def start_work(message):
    chat_id = message.chat.id
    markup = types.ReplyKeyboardMarkup(
        one_time_keyboard=False,
        resize_keyboard=True
    )
    if message.text == 'Кнопка1':
        STATE_DICT[chat_id] = 'VAR1'
        markup.add('Кнопка3')
        markup.add('Кнопка4')
        bot.send_message(chat_id, 'Вы выбрали ответ 1', reply_markup=markup)
    else:
        STATE_DICT[chat_id] = 'VAR2'
        markup.add('Кнопка5')
        markup.add('Кнопка6')
        bot.send_message(chat_id, 'Вы выбрали ответ 2', reply_markup=markup)


def var1(message):
    chat_id = message.chat.id
    if message.text == 'Кнопка3':
        bot.send_message(chat_id, 'Конец с кнопкой3')
    else:
        STATE_DICT[chat_id] = 'VAR2'
        bot.send_message(chat_id, 'Конец с кнопкой2')


def var2(message):
    chat_id = message.chat.id
    if message.text == 'Кнопка5':
        bot.send_message(chat_id, 'Конец с кнопкой5')
    else:
        STATE_DICT[chat_id] = 'VAR2'
        bot.send_message(chat_id, 'Конец с кнопкой6')


@bot.message_handler(func=lambda message: True)
def start_finite_machine(message):
    states = {
        'START': start_work,
        'VAR1':  var1,
        'VAR2':  var2,
    }
    chat_id = message.chat.id
    states[STATE_DICT[chat_id]](message)


if __name__ == '__main__':
  bot.polling(none_stop=True)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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