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