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())