74 lines
4.8 KiB
Python
74 lines
4.8 KiB
Python
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())
|
||
|
||
|
||
|