- Implemented the initial version of the web interface. refactor: Begin Telegram bot refactoring - Started restructuring the bot’s code for better maintainability. chore: Migrate to Flask project structure - Reorganized the application to follow Flask's project structure. cleanup: Extensive code cleanup - Removed redundant code and improved readability. Signed-off-by: UdoChudo <stream@udochudo.ru>
42 lines
2.1 KiB
Python
42 lines
2.1 KiB
Python
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 |