41 lines
2.1 KiB
Python
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 |