56 lines
2.5 KiB
Python
56 lines
2.5 KiB
Python
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 = (
|
||
"⏰ <b>Не забудьте отправить показания счетчиков!</b>\n\n"
|
||
"Уважаемые жильцы, пришло время подать показания приборов учета воды и электричества. "
|
||
"Пожалуйста, передайте данные до 25-го числа включительно.\n\n"
|
||
"<i>Вы можете отключить или включить эти напоминания в своем профиле в любой момент (команда /profile).</i>"
|
||
)
|
||
|
||
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
|