Telezab/utilities/notification_manager.py

41 lines
2.1 KiB
Python

from utilities.rabbitmq import send_to_queue
from models import Users, Regions, Subscriptions
from utilities.database 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={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={chat_id}) [{formatted_message}]")
try:
send_to_queue({'chat_id': chat_id, 'username': username, 'message': message})
self.logger.debug(f"Сообщение поставлено в очередь для {chat_id} (@{username})")
except Exception as e:
self.logger.error(f"Ошибка при отправке сообщения для {chat_id} (@{username}): {e}")
undelivered = True
else:
self.logger.warning(f"Пользователь {username} (chat_id={chat_id}) заблокирован или не найден. Уведомление не отправлено.")
return undelivered