from telebot import TeleBot, logger from telebot.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery from app import Subscriptions from app.bot.constants import UserStates from app.bot.processors.subscribe_processor import process_subscription_button, process_subscribe_all_regions from app.bot.states import UserStateManager from app.bot.utils.auth import auth from app.bot.utils.regions import get_sorted_regions, format_regions_list_marked def register_handlers(bot: TeleBot, app, state_manager: UserStateManager): @bot.message_handler(commands=['subscribe']) @bot.message_handler(func=lambda msg: msg.text == "Подписаться") def handle_subscribe_button(message: Message): with app.app_context(): chat_id = message.chat.id username = f"{message.from_user.username}" if message.from_user.username else "N/A" if not auth(chat_id, app): bot.send_message(chat_id, "Вы не авторизованы для использования этого бота.") logger.warning(f"Неавторизованный пользователь {chat_id} @{username}") state_manager.set_state(chat_id, UserStates.REGISTRATION) return else: state_manager.set_state(chat_id, UserStates.WAITING_INPUT) # Получаем регионы regions = get_sorted_regions() # Получаем список подписанных регионов пользователя subscribed = {s.region_id for s in Subscriptions.query.filter_by(chat_id=chat_id, active=True).all()} # Формируем строку с пометками regions_text = format_regions_list_marked(regions, subscribed) markup = InlineKeyboardMarkup() markup.add(InlineKeyboardButton("Подписаться на все регионы", callback_data="subscribe_all")) markup.add(InlineKeyboardButton(text="Отмена", callback_data="cancel_input")) bot_message = bot.send_message(chat_id, f"Введите номер(а) региона(ов) через запятую для подписки:\n\n{regions_text}", reply_markup=markup) bot.register_next_step_handler(message, process_subscription_button, app, bot, chat_id, state_manager, bot_message.message_id) def register_callback_subscribe(bot: TeleBot, app, state_manager): @bot.callback_query_handler(func=lambda call: call.data == "subscribe_all") def handle_subscribe_all_button(call: CallbackQuery): chat_id = call.message.chat.id username = f"{call.from_user.username}" if call.from_user.username else "N/A" with app.app_context(): if not auth(chat_id, app): bot.send_message(chat_id, "Вы не авторизованы для использования этого бота.") logger.warning(f"Неавторизованный пользователь {chat_id} @{username}") state_manager.set_state(chat_id, UserStates.REGISTRATION) return process_subscribe_all_regions(call, app, bot, chat_id, state_manager)