Какие есть идеи как сделать кнопку "back\назад" в Telegram боте (у меня большая иерархия)

Рейтинг: 0Ответов: 1Опубликовано: 31.07.2023

Я написал бота (на pyTelegramBotAPI\telebot), и хочу добавить кнопку назад которая бы возрощяла на предыдущий "Макет". У меня нет никаких идей =(

Код:

@bot.message_handler(content_types=['text'])
def logic(message):
    if message.text == 'Каталог🛍':
        markup_catalog = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=1)
        sets = types.KeyboardButton('Кейсы📦')
        popular = types.KeyboardButton('Популярное🎁')
        site = types.KeyboardButton('Весь каталог(На сайте🌐)')
        markup_catalog.add(sets, popular, site)
        status_text(message)
        bot.send_message(message.chat.id, 'Выберите 👇', reply_markup=markup_catalog)
    elif message.text == 'Кейсы📦':
        markup_case = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=1)
        Flex_Box = types.KeyboardButton('Flex Box')
        Immuno_Box = types.KeyboardButton('Immuno Box')
        Beauty_Box = types.KeyboardButton('Beauty Box')
        Detox_Box = types.KeyboardButton('Detox Box')
        markup_case.add(Flex_Box, Immuno_Box, Beauty_Box, Detox_Box)
        status_photo(message)
        bot.send_photo(message.chat.id, photo=open('photo_box.jpg', 'rb'), caption='Выберите подходящий вам box 👇', reply_markup=markup_case)

и так далее

P.S. Я новичок это мой 1 бот.

Ответы

▲ 0Принят

Использовать очереди (ну или логичнее стеки). Для каждого пользователя создаём отдельный массив, в элементах которого сохраняем состояние бота. Когда пользователь переходит на ступень выше, добавляем новый элемент в массив. Когда пользователь нажимает "назад", переводим состояние бота в предыдущий элемент массива. Пример работы:

import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor

bot = Bot(token="BOT_TOKEN")
dp = Dispatcher(bot)

user_data = {}

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    user_id = message.from_user.id
    user_data[user_id] = ['a']
    await message.answer("Bot started!")

@dp.message_handler(commands=['up']) 
async def cmd_up(message: types.Message):
    user_id = message.from_user.id
    user_data[user_id].append(chr(ord(user_data[user_id][-1]) + 1))
    await message.answer("UP!")

@dp.message_handler(commands=['down'])
async def cmd_down(message: types.Message):
    user_id = message.from_user.id
    user_data[user_id].pop()
    await message.answer("DOWN!")
    
@dp.message_handler(commands=['view'])
async def cmd_view(message: types.Message):
    user_id = message.from_user.id
    await message.answer(user_data[user_id][-1])

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Я не очень в создании ботов, но вроде вот так это должно работать.