如何向 Telegram 机器人添加“后退”按钮?

问题描述 投票:0回答:1

我不知道如何实现一个返回上一个菜单的“后退”按钮。我尝试过使用堆栈来跟踪以前的状态,但它效率低下并且并不总是有效。有没有办法实现这样的功能?因此,假设 “Back-2” 按钮将带我返回带有 “源通道设置” 按钮的菜单,而 “Back-1” 按钮将带我返回 “Bot设置”。如果有任何想法,我将不胜感激。

@dp.message(Command('start'))
async def bot_settings(message: Message):
    keyboard = ReplyKeyboardMarkup(keyboard=[
        [KeyboardButton(text="Bot Settings")],
    ])
    await message.answer("Choose an action:", reply_markup=keyboard)


@dp.message(lambda message: message.text == "Bot Settings")
async def bot_settings_menu(message: Message):
    keyboard = ReplyKeyboardMarkup(keyboard=[
        [KeyboardButton(text="Source Channel Settings")],
        [KeyboardButton(text="Back-1")]
    ])
    await message.answer(text="Choose an action:", reply_markup=keyboard)


@dp.message(lambda message: message.text == "Source Channels Setup")
async def configure_source_channels(message: Message):
    keyboard = ReplyKeyboardMarkup(keyboard=[
        [KeyboardButton(text="Add channel", request_chat=KeyboardButtonRequestChat(
            request_id=1,
            user_is_bot=False,
            chat_is_channel=True,
            chat_is_forum=False
        ))],
        [KeyboardButton(text="Channel list")],
        [KeyboardButton(text="Back-2")]
    ])
    await message.answer(text="Choose an action:", reply_markup=keyboard)
python telegram-bot aiogram
1个回答
0
投票
from aiogram import types

# Define states
MAIN_MENU = 'main_menu'
BOT_SETTINGS = 'bot_settings'
SOURCE_CHANNEL_SETTINGS = 'source_channel_settings'

# State storage
user_states = {}

def get_user_state(user_id):
    return user_states.get(user_id, MAIN_MENU)

def update_user_state(user_id, state):
    user_states[user_id] = state

# Entry point to bot settings, sets the user's state to BOT_SETTINGS
@dpp.message(Command('start'))
async def bot_settings(message: Message):
    update_user_state(message.from_user.id, BOT_SETTINGS)
    keyboard = ReplyKeyboardMarkup(keyboard=[
        [KeyboardButton(text="Bot Settings")],
        [KeyboardButton(text="Back")],
    ])
    await message.answer("Choose an action:", reply_markup=keyboard)

# Handles the Bot Settings menu
@dpp.message(lambda message: message.text == "Bot Settings")
async def bot_settings_menu(message: Message):
    update_user_state(message.from_user.id, SOURCE_CHANNEL_SETTINGS)
    keyboard = ReplyKeyboardMarkup(keyboard=[
        [KeyboardButton(text="Source Channel Settings")],
        [KeyboardButton(text="Back")],
    ])
    await message.answer("Choose an action:", reply_markup=keyboard)

# Handles the Source Channels Setup menu
@dpp.message(lambda message: message.text == "Source Channels Setup")
async def configure_source_channels(message: Message):
    # Your source channel configuration code goes here
    pass

# A generic back button handler
@dpp.message(lambda message: message.text == "Back")
async def handle_back(message: Message):
    user_id = message.from_user.id
    current_state = get_user_state(user_id)

    if current_state == SOURCE_CHANNEL_SETTINGS:
        # Go back to BOT_SETTINGS
        await bot_settings(message)
    elif current_state == BOT_SETTINGS:
        # Go back to MAIN_MENU or whatever the initial state is
        await start(message)
    else:
        # Default action or error message
        await message.answer("Not sure where to go back from here.")

# Your 'start' handler or main menu function
async def start(message: Message):
    # Code to handle the main menu
    pass
© www.soinside.com 2019 - 2024. All rights reserved.