Одинаковая кнопка "назад" во всех сообщениях. Telebot
Всем привет.
В программировании недавно. Пишу бот на python, telebot. Бот представляет собой справочник, где ты видишь сначала меню (клавиатуру) из reply-кнопок, потом по нажатию какой-либо кнопки ты видишь либо ещё меню, либо конечное сообщение с контактными данными. Всё довольно просто, всё работает, но... Вдруг в ТЗ появился пункт: сделай так, чтобы при нажатии на кнопку в клавиатуре сама клавиатура исчезала, отображалось новое сообщение, и в каждом последующем меню или сообщении появилась кнопка "назад", нажимая на которую пользователь бы получал предыдущее меню, иными словами, переходил бы на шаг назад. В теории я понимаю, что это реализуемо через bot.delete_message и воззванию к коллбеку предыдущего сообщения. Но как быть, если клавиатур и сообщений много, всё уже написано. Не добавлять же в 100+ коллбеков вручную кнопку "назад" и во все коллбеки в @bot.callback_query_handler строку bot.delete_message перед bot.send_message. Наверняка есть вариант как-то перехватывать любое сообщение, отправляемое ботом, и добавлять к нему кнопку "назад" и удалять предыдущее сообщение - bot.delete_message. Подчеркну, я новичок. Прочитал от "а" до "я" документацию на телебот, но в силу малого опыта, это не спасло. Прошу помощи и совета. Хотя бы в какую сторону искать.
Ответы (1 шт):
Если я вас верно понял, то вам нужно реализовать что-то подобное:
import telebot
from telebot import types
bot = telebot.TeleBot('TOKEN')
def custom_decorator(func):
def wrapper(call):
func(call)
send_back_button(call.message)
return wrapper
def send_back_button(message):
keyboard = types.InlineKeyboardMarkup()
button = types.InlineKeyboardButton("Back", callback_data="Back")
keyboard.add(button)
bot.edit_message_reply_markup(message.chat.id, message.message_id, reply_markup=keyboard)
@bot.message_handler(commands=['start'])
def start(message):
send_menu(message)
def send_menu(message):
keyboard = types.InlineKeyboardMarkup()
buttons = [
types.InlineKeyboardButton("Option 1", callback_data="Option 1"),
types.InlineKeyboardButton("Option 2", callback_data="Option 2"),
types.InlineKeyboardButton("Option 3", callback_data="Option 3")
]
keyboard.add(*buttons)
bot.delete_message(message.chat.id, message.message_id)
bot.send_message(message.chat.id, "Выберите опцию:", reply_markup=keyboard)
@bot.callback_query_handler(func=lambda call: call.data == "Option 1")
@custom_decorator
def handle_message_1(call):
bot.send_message(call.message.chat.id, "Вы выбрали `Option 1`")
@bot.callback_query_handler(func=lambda call: call.data == "Option 2")
@custom_decorator
def handle_message_2(call):
bot.send_message(call.message.chat.id, "Вы выбрали `Option 2`")
@bot.callback_query_handler(func=lambda call: call.data == "Option 3")
def handle_message_3(call):
bot.send_message(call.message.chat.id, "Вы выбрали `Option 3`")
send_back_button(call.message)
@bot.callback_query_handler(func=lambda call: call.data == "Back")
def handle_message_4(call):
send_menu(call.message)
bot.polling()
Идея в чем: навешиваем на обработчики свой декоратор, который реализует дополнительную логику.
Или смотри на handle_message_3
- просто добавляем каждому обработчику дополнительный вызов функции с нужной логикой.