Кнопка 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())