Telezab/app/bot/handlers/notification_switch_mode.py
2025-06-19 23:50:43 +05:00

74 lines
4.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.⛔️<b>Критические события</b> (приоритет "DISASTER") - события, являющиеся потенциальными авариями и требующие оперативного решения.\n'
'В Zabbix обязательно имеют тег "CALL" для оперативного привлечения инженеров к устранению.\n\n'
'2.⚠️<b>Все события (По умолчанию)</b> - критические события, а также события 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())