import logging
import asyncio
from aiogram import Bot
from aiogram.types import FSInputFile
from database.db import AsyncSessionLocal
from database.models import User
from sqlalchemy import select
logger = logging.getLogger('domovoy.meter_reminder')
METER_REMINDER_IMAGE = 'data/service_images/meter_reminder.jpg'
REMINDER_TEXT = (
"⏰ Не забудьте отправить показания счетчиков!\n\n"
"Уважаемые жильцы, пришло время подать показания приборов учета воды и электричества. "
"Пожалуйста, передайте данные до 25-го числа включительно.\n\n"
"Вы можете отключить или включить эти напоминания в своем профиле в любой момент (команда /profile)."
)
async def send_meter_reminders(bot: Bot):
"""Рассылка напоминаний о счетчиках верифицированным жильцам"""
logger.info("🚀 Запуск ежемесячной рассылки напоминаний о счетчиках")
async with AsyncSessionLocal() as session:
stmt = select(User).where(
User.verified == True,
User.is_banned == False,
User.meter_reminders_enabled == True
)
users = (await session.execute(stmt)).scalars().all()
logger.info(f"Найдено {len(users)} пользователей для отправки напоминания")
success_count = 0
fail_count = 0
photo = FSInputFile(METER_REMINDER_IMAGE)
for user in users:
try:
await bot.send_photo(
chat_id=user.user_id,
photo=photo,
caption=REMINDER_TEXT,
parse_mode='HTML'
)
success_count += 1
logger.info(f"✅ Напоминание отправлено пользователю {user.user_id} (кв. {user.apartment})")
except Exception as e:
fail_count += 1
logger.error(f"❌ Ошибка отправки пользователю {user.user_id}: {e}")
# Небольшая задержка, чтобы не превысить лимиты Telegram API
await asyncio.sleep(0.05)
logger.info(f"📊 Рассылка завершена. Успешно: {success_count}, Ошибок: {fail_count}")
return success_count, fail_count