from utilities.rabbitmq import send_to_queue from app.models import Regions, Subscriptions from app.models import Users from app.extensions.db import db class NotificationManager: def __init__(self, logger): self.logger = logger def get_subscribers(self, region_id, severity): query = db.session.query(Users.chat_id, Users.telegram_id).join(Subscriptions).filter( Subscriptions.region_id == region_id, Subscriptions.active == True ) if severity != 'Disaster': query = query.filter(Subscriptions.disaster_only == False) self.logger.debug(f"Выполнение запроса: {query} для региона {region_id}") results = query.all() self.logger.debug(f"Найдено подписчиков: {len(results)} для региона {region_id}") return results def is_region_active(self, region_id): region = Regions.query.get(region_id) return region and region.active def send_notifications(self, subscribers, message): undelivered = False for chat_id, username in subscribers: user = Users.query.get(chat_id) if user and not user.is_blocked: formatted_message = message.replace('\n', ' ').replace('\r', '') self.logger.info(f"Формирование сообщения для пользователя {username} ({chat_id}) [{formatted_message}]") try: send_to_queue({'chat_id': chat_id, 'username': username, 'message': message}) self.logger.debug(f"Сообщение поставлено в очередь для {username} ({chat_id})") except Exception as e: self.logger.error(f"Ошибка при отправке сообщения для {username} ({chat_id})): {e}") undelivered = True else: self.logger.warning(f"Пользователь {username} ({chat_id}) заблокирован или не найден. Уведомление не отправлено.") return undelivered