Кнопка Reply "Назад" в aiogram

Хочу реализовать возврат на один шаг назад при нажатии кнопки "Назад" (НЕ Inline)

Каждый шаг обновляется, но при нажатии кпопки - возвращает только с шага NewWords на шаг ActivitiesDone.

USER_STATE = {}  # Each value is now a list of states

def get_current_user_state(user_id):
    return USER_STATE.get(user_id, [None])[-1]

def update_user_state(user_id, state):
    if user_id not in USER_STATE:
        USER_STATE[user_id] = []
    USER_STATE[user_id].append(state)
    print(f"State updated for user {user_id}: {USER_STATE[user_id]}")

def clear_user_state(user_id):
    USER_STATE.pop(user_id, None)

def go_back(user_id):
    if user_id in USER_STATE and len(USER_STATE[user_id]) > 1:
        USER_STATE[user_id].pop()  # Remove the last state
        last_state = get_current_user_state(user_id)
        print(f"User {user_id} went back to state: {last_state}")  # Logging
        return last_state
    else:
        return 'start'


@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    user_id = message.from_user.id

    if user_id not in shared_resources.user_responses:
        shared_resources.user_responses[user_id] = {}

    user_ids = shared_resources.sheet.col_values(1)

    if str(user_id) not in user_ids:
        shared_resources.sheet.append_row([user_id])
        new_user.register_handlers_new_user(dp)  # Register handlers for new user
        await bot.send_message(user_id, 'Давай почнемо з постановки мети. Яка в тебе мета у вивченні англійської?')
    else:
        # Check the payment and subscription status for returning users
        payment_message_text = new_user.check_payment_status(user_id, date_column_index=4)
        subscription_status = new_user.check_subscription_expiry(user_id)

        if "Оплата успішно пройшла!" in payment_message_text or subscription_status == "active":
            # If payment was successful or subscription is still active, send the main menu
            menu_markup = keyboard.get_main_menu_keyboard()
            update_user_state(user_id, 'SentReport')
            await bot.send_message(user_id, "Вітаю знову! Виберіть опцію з меню або введіть команду.", reply_markup=menu_markup)
        else:
            # Handle cases where the subscription is not active or still being verified
            await bot.send_message(user_id, "Твоя підписка неактивна або ще перевіряється. Будь ласка, оновіть підписку або перевірте статус оплати.")



# Handler for "Відправити звіт" command
@dp.message_handler(lambda message: message.text.lower() == "відправити звіт" )
async def send_report(message: types.Message):
    user_id = message.from_user.id
    update_user_state(user_id, 'TimeSpent')
    print(f"User {user_id} state updated to TimeSpent")
    # Prompt the user immediately after updating the state
    await bot.send_message(
        message.chat.id,
        "Скільки часу сьогодні пішло на вивчення? (цифрою в хвилинах)",
        reply_markup=keyboard.get_back_keyboard())

# Handler for collecting time spent
@dp.message_handler(lambda message: get_current_user_state(message.from_user.id) == 'TimeSpent')
async def time_spent_handler(message: types.Message):
    user_id = message.from_user.id
    update_user_state(user_id, 'ActivitiesDone')
    print(f"User {user_id} state updated to ActivitiesDone")
    await bot.send_message(message.chat.id, "Чим саме займався?", reply_markup=keyboard.get_back_keyboard())

# Handler for collecting activities done
@dp.message_handler(lambda message: get_current_user_state(message.from_user.id) == 'ActivitiesDone')
async def activities_done_handler(message: types.Message):
    user_id = message.from_user.id
    update_user_state(user_id, 'NewWords')
    print(f"User {user_id} state updated to NewWords")
    await bot.send_message(message.chat.id, "Які нові слова вивчив?", reply_markup=keyboard.get_back_keyboard())


@dp.message_handler(lambda message: message.text.lower() == "назад")
async def go_back_handler(message: types.Message):
    user_id = message.from_user.id
    print(f"'Назад' triggered by user {user_id}")
    last_state = go_back(user_id)

    if last_state == 'TimeSpent':
        await bot.send_message(message.chat.id, "Скільки часу сьогодні пішло на вивчення? (цифрою в хвилинах)", reply_markup=keyboard.get_back_keyboard())
    elif last_state == 'ActivitiesDone':
        await bot.send_message(message.chat.id, "Чим саме займався?", reply_markup=keyboard.get_back_keyboard())
    elif last_state == 'NewWords':
        await bot.send_message(message.chat.id, "Які нові слова вивчив?", reply_markup=keyboard.get_back_keyboard())
    elif last_state == 'start':
            await start(message)
    else:
        # If the state is not recognized, send a default message or handle it appropriately
        await bot.send_message(
            message.chat.id,
            "Не вдалося визначити попередній стан, повертаємося до початку.",
            reply_markup=keyboard.get_main_menu_keyboard())

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