Чат-бот Telegram Python. Последовательный диалог с Inline кнопками

Всем привет!

Как правильно в библиотеке pyTelegramBotAPI реализовать вывод кнопок типа InlineKeyboardMarkup в зависимости от того на какую кнопку нажал пользователь в предыдущем сообщении? С кнопками типа ReplyKeyboardMarkup вроде проще, там отлично работает bot.register_next_step_handler, где в параметрах можно передать функцию которая будет обрабатывать ответ с предыдущих кнопок. Почему-то с InlineKeyboardMarkup у меня не получается это реализовать и приходится играться с if. Возможно я не то передаю в параметрах.

Написал топорный код, он работает, но я чувствую что он не совсем правильный:


import config
import telebot
import  pandas as pd
from telebot import types  # кнопки
from string import Template
from datetime import datetime
import pymssql


permissions = config.permissions
bot = telebot.TeleBot(config.API_BOT_TOKEN)

user_dict = {}

class User:
    def __init__(self, city):
        self.city = city
        self.district = None
        self.budgetmax = None
        self.rooms = None
        self.phone = None


@bot.message_handler(commands=['start'])
def city_message(message):
    markup = telebot.types.InlineKeyboardMarkup()
    markup.add(telebot.types.InlineKeyboardButton(text='Алматы', callback_data='city_almaty'))
    markup.add(telebot.types.InlineKeyboardButton(text='Нур-Султан', callback_data='city_astana'))
    bot.send_message(message.chat.id, 'В каком городе вы живете?', reply_markup=markup)


@bot.callback_query_handler(func=lambda call: True)
def query(call):
    chat_id = call.from_user.id
    button_text = call.data
    bot.edit_message_reply_markup(call.from_user.id, message_id=call.message.message_id, reply_markup='')

    if 'city' in str(call.data):
        user_dict[chat_id] = User(button_text)
        if call.data == 'city_almaty':
            markup = telebot.types.InlineKeyboardMarkup()
            button1 = (telebot.types.InlineKeyboardButton(text='Алатауский', callback_data='district_Алатауский'))
            button2 = (telebot.types.InlineKeyboardButton(text='Алмалинский', callback_data='district_Алмалинский'))
            button3 = (telebot.types.InlineKeyboardButton(text='Ауэзовский', callback_data='district_Ауэзовский'))
            button4 = (telebot.types.InlineKeyboardButton(text='Бостандыкский', callback_data='district_Бостандыкский'))
            button5 = (telebot.types.InlineKeyboardButton(text='Жетысуский', callback_data='district_Жетысуский'))
            button6 = (telebot.types.InlineKeyboardButton(text='Медеуский', callback_data='district_Медеуский'))
            button7 = (telebot.types.InlineKeyboardButton(text='Наурызбайский', callback_data='district_Наурызбайский'))
            button8 = (telebot.types.InlineKeyboardButton(text='Турксибский', callback_data='district_Турксибский'))
            markup.add(button1, button2, button3, button4, button5, button6, button7, button8)
        if call.data == 'city_astana':
            markup = telebot.types.InlineKeyboardMarkup()
            button1 = (telebot.types.InlineKeyboardButton(text='Алатауский', callback_data='district_Алматинский'))
            button2 = (telebot.types.InlineKeyboardButton(text='Алмалинский', callback_data='district_Сарыаркинский'))
            button3 = (telebot.types.InlineKeyboardButton(text='Ауэзовский', callback_data='district_Есильский'))
            button4 = (telebot.types.InlineKeyboardButton(text='Бостандыкский', callback_data='district_Байконурский'))
            markup.add(button1, button2, button3, button4)
        bot.send_message(call.from_user.id, 'В каком районе Вы живете?', reply_markup=markup)


    if 'district' in str(call.data):
        user = user_dict[chat_id]
        user.district = button_text

        markup = telebot.types.InlineKeyboardMarkup()
        markup.add(telebot.types.InlineKeyboardButton(text='До 10 млн', callback_data='10000000'))
        markup.add(telebot.types.InlineKeyboardButton(text='До 15 млн', callback_data='15000000'))
        markup.add(telebot.types.InlineKeyboardButton(text='До 20 млн', callback_data='20000000'))
        markup.add(telebot.types.InlineKeyboardButton(text='До 30 млн', callback_data='30000000'))
        bot.send_message(call.from_user.id, 'Какой у Вас бюджет?', reply_markup=markup)

    if '00000' in str(call.data):
        user = user_dict[chat_id]
        user.budgetmax = int(call.data)

        markup = telebot.types.InlineKeyboardMarkup()

        button1 = (telebot.types.InlineKeyboardButton(text='1 комнатная', callback_data='rooms_1'))
        button2 = (telebot.types.InlineKeyboardButton(text='2х-комнатная', callback_data='rooms_2'))
        button3 = (telebot.types.InlineKeyboardButton(text='3х-комнатная', callback_data='rooms_3'))
        button4 = (telebot.types.InlineKeyboardButton(text='4х-комнатная и больше', callback_data='rooms_4+'))
        markup.add(button1, button2, button3, button4)
        bot.send_message(call.from_user.id, 'Сколько комнат?', reply_markup=markup)

    def process_phone_step(message):
            chat_id = message.chat.id
            user = user_dict[chat_id]
            user.phone = message.text
            bot.send_message(chat_id, getRegData(user, 'Ваша данные', message.from_user.first_name), parse_mode="Markdown")
            write_to_db_step(chat_id)
    if 'rooms' in str(call.data):
        user = user_dict[chat_id]
        user.rooms = call.data

        msg = bot.send_message(call.from_user.id, 'Укажите Вашь номер телефона в формате 7777777777')
        bot.register_next_step_handler(msg, process_phone_step)


def getRegData(user, title, name):
    t = Template(
        '$title *$name* \nГород: *$city* \nРайон: *$district* \nМакс. бюджет: *$budgetmax* \nКомнат: *$rooms* \nВаш телефон: *$phone* \n\n' +
        'Теперь Вы будете регулярно получать обновления по новостройкам с указанными параметрами\n' +
        'Если Вы хотите изменить параметры, нажмите на ссылку /change')

    return t.substitute({
        'title': title,
        'name': name,
        'city': user.city,
        'district': user.district,
        'budgetmax': user.budgetmax,
        'rooms': user.rooms,
        'phone': user.phone,
    })




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


Ответы (0 шт):