import telebot from telebot.types import Message, InlineKeyboardMarkup, InlineKeyboardButton from app import Subscriptions, db from app.bot.constants import UserStates from app.bot.keyboards.main_menu import get_main_menu from app.bot.keyboards.settings_menu import get_settings_menu from app.bot.utils.auth import auth from app.bot.utils.tg_audit import log_user_event def register_handlers(bot, app, state_manager): @bot.message_handler(commands=['notification_mode']) @bot.message_handler(func=lambda message: message.text == 'Режим уведомлений') def handle_notification_mode_button(message: Message): username = f"{message.from_user.username}" if message.from_user.username else "N/A" chat_id = message.chat.id with app.app_context(): if not auth(chat_id, app): bot.send_message(chat_id, "❌ Вы не авторизованы для использования этого бота.") telebot.logger.warning(f"Неавторизованный пользователь {chat_id} @{username}") state_manager.set_state(chat_id, UserStates.REGISTRATION) return # Отправляем клавиатуру выбора режима уведомлений markup = InlineKeyboardMarkup() markup.add(InlineKeyboardButton(text="⛔️ Критические события", callback_data="notification_mode_disaster")) markup.add(InlineKeyboardButton(text="⚠️ Все события", callback_data="notification_mode_all")) bot.send_message(chat_id, 'Выберите уровень событий мониторинга, уведомление о которых хотите получать:\n' '1.⛔️Критические события (приоритет "DISASTER") - события, являющиеся потенциальными авариями и требующие оперативного решения.\n' 'В Zabbix обязательно имеют тег "CALL" для оперативного привлечения инженеров к устранению.\n\n' '2.⚠️Все события (По умолчанию) - критические события, а также события Zabbix высокого ("HIGH") приоритета, ' 'имеющие потенциально значительное влияние на сервис и требующее устранение в плановом порядке.', reply_markup=markup, parse_mode="HTML") def register_callback_notification(bot, app, state_manager): @bot.callback_query_handler(func=lambda call: call.data.startswith("notification_mode_")) def handle_notification_switch_callback(call): chat_id = call.message.chat.id message_id = call.message.message_id mode = call.data.split("_")[2] username = f"@{call.from_user.username}" if call.from_user.username else "N/A" bot.delete_message(chat_id, message_id) # Обновляем режим уведомлений disaster_only = True if mode == "disaster" else False with app.app_context(): if not auth(chat_id, app): bot.send_message(chat_id, "❌ Вы не авторизованы для использования этого бота.") telebot.logger.warning(f"Неавторизованный пользователь {chat_id} @{username}") state_manager.set_state(chat_id, UserStates.REGISTRATION) return try: all_subscriptions = Subscriptions.query.filter_by(chat_id=chat_id).all() for subscription in all_subscriptions: subscription.disaster_only = disaster_only db.session.commit() mode_text_emoji = "⛔️ Критические события" if disaster_only else "⚠️ Все события" mode_text = "Критические события" if disaster_only else "Все события" bot.send_message(chat_id, f"🔄 Режим уведомлений успешно изменён на:\n {mode_text_emoji}",reply_markup=get_settings_menu()) log_user_event(chat_id, app, username, f"Режим уведомлений изменился на: {mode_text}") state_manager.set_state(chat_id, UserStates.SETTINGS_MENU) except Exception as e: telebot.logger.error(e) bot.send_message(chat_id, f"❌ Произошла ошибка при изменении режима уведомлений.", reply_markup=get_main_menu())