Как сделать вложенное меню в python-telegram-bot?

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

Мне нужно написать вложенное меню для телеграм-бота. Я использую python-telegram-bot и в настоящее время имею следующий код. По команде /caregories бот получает список родительских категорий из базы данных с помощью метода caregory_service.get_parent_categories() и отображает их в виде кнопок меню. Я хочу добавить в бот следующий функционал: при нажатии на каждую из кнопок категорий открывается подменю со списком подкатегорий и кнопкой возврата к списку родительских категорий. Вы можете получить список подкатегорий, используя метод caregory_service.get_subcategories(). При нажатии на любую из подкатегорий она добавляется в список выбранных и этот список возвращается после нажатия кнопки "ОК" в главном меню. Как я могу реализовать это с помощью python-telegram-bot?

from telegram.ext import AIORateLimiter, Application, CommandHandler, ContextTypes
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from services import CategoryService

TOKEN = 'TOKEN'

async def categories_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    keyboard = []
    category_service = CategoryService()
    categories = await category_service.get_parent_categories() # get all parent categories from database

    categories_buttons = [[InlineKeyboardButton(category.name, callback_data=str(category.id))] for category in categories]
    keyboard.extend(categories_buttons)

    keyboard.extend([
        [InlineKeyboardButton(
            "Cancel 😕",
            callback_data="cancel"
        )],
        [InlineKeyboardButton(
            "Ok 👌",
            callback_data="confirm"
        )]])

    reply_markup = InlineKeyboardMarkup(keyboard)

    await update.message.reply_text(
        "Some text",
        reply_markup=reply_markup
    )


def create_bot() -> Application:
    bot = Application.builder().token(TOKEN).rate_limiter(AIORateLimiter()).build()
    bot.add_handler(CommandHandler("categories", categories_callback))
    return bot


async def start_bot() -> Application:
    bot = create_bot()
    await bot.initialize()
    await bot.updater.start_polling()
    await bot.start()
    return bot

bot = start_bot()

Ответы

Ответов пока нет.