Как вернутся на предыдущий шаг в ConversationHandler? Не работает register_next_step_handler (python-telegram-bot)
Делаю телеграм бота на Python с фрейморком python-telegram-bot.
Подскажите, пожалуйста, как задать боту следующий шаг после context.bot.answer_callback_query.
Пробовала сделать так:
• context.bot.register_next_step_handler(msg, on_massage)
Получаю ошибку: AttributeError: 'Bot' object has no attribute 'register_next_step_handler'
• return on_massage(update, context) Бот зависает, никаких ошибок не выводит.
Вот часть кода, где нужно это применить:
def on_massage(update: Update, context: CallbackContext):
query = update.callback_query
query.answer()
if query.data == 'klass':
user_data = context.user_data
category = 'Вид массажа'
massage = 'Классический'
user_data[category] = massage
query.edit_message_text("Выберите дату: ", reply_markup=telegramcalendar.create_calendar())
return STATE_SELECT_DATE
def on_select_date(update: Update, context: CallbackContext):
query = update.callback_query
query.answer()
bot = context.bot
selected, date = telegramcalendar.process_calendar_selection(bot, update)
if not selected:
return ConversationHandler.END
user_data = context.user_data
text_data = date.strftime("%d/%m/%Y")
user_data['Дата'] = text_data
keyboard = [[
InlineKeyboardButton("12:00", callback_data='12'),
InlineKeyboardButton("14:30", callback_data='14'),
InlineKeyboardButton("16:00", callback_data='16')
]]
reply_markup = InlineKeyboardMarkup(keyboard)
query.edit_message_text(text='''Вы выбрали %s
Выберите свободное время: ''' % text_data, reply_markup=reply_markup)
return STATE_SELECT_TIME
def on_time_12(update: Update, context: CallbackContext):
user_data = context.user_data
text_time = '12:00'
user_data['Время'] = text_time
query = update.callback_query
if check(user_data['Дата'], user_data['Время']):
context.bot.answer_callback_query(update.callback_query.id, text='Извините, это время занято, выберите другое!', show_alert=True)
print('Найдено в бд')
else:
query.answer()
query.edit_message_text('''Введите своё *Имя и Фамилию*''', parse_mode='Markdown')
return STATE_SELECT_USER
Помогите, пожалуйста. Буду очень благодарна за помощь!
Ответы (1 шт):
Автор решения: Julieta
→ Ссылка
Нашла решение своей проблемы
def on_time_12(update: Update, context: CallbackContext):
user_data = context.user_data
text_time = '12:00'
user_data['Время'] = text_time
data_time = text_data + text_time
query = update.callback_query
if check(user_data['Дата'], user_data['Время']):
context.bot.answer_callback_query(update.callback_query.id, text='Извините, это время занято, выберите другое!', show_alert=True)
print('Найдено в бд')
message = update.effective_message
message.reply_text("Выберите дату: ", reply_markup=telegramcalendar.create_calendar())
# ИЛИ
# query.answer()
# query.edit_message_text("Выберите дату: ", reply_markup=telegramcalendar.create_calendar())
return STATE_SELECT_DATE
else:
query.answer()
query.edit_message_text('''Введите своё *Имя и Фамилию*''', parse_mode='Markdown')
return STATE_SELECT_TIME
И чтобы mysql не выдавал ошибок при повторной проверке, нужно добавить buffered=True в строку mycursor = mydb.cursor()
ConversationHandler
dp = updater.dispatcher
dp.add_handler(CommandHandler('start', on_main_menu))
dp.add_handler(ConversationHandler(
entry_points=[
CommandHandler('start', on_main_menu),
],
states={
STATE_SELECT_MASSAGE: [
CallbackQueryHandler(on_massage)
],
STATE_SELECT_DATE: [
CallbackQueryHandler(on_select_date)
],
STATE_SELECT_TIME: [
CallbackQueryHandler(on_time_12, pattern='12'),
CallbackQueryHandler(on_time_14, pattern='14'),
CallbackQueryHandler(on_time_16, pattern='16')
]
},
fallbacks=[
],
# allow_reentry=True,
# per_message=True,
))
dp.add_error_handler(on_error)