import asyncio import logging from datetime import datetime, timedelta from sqlalchemy import select, func from database.db import AsyncSessionLocal from database.models import User, SpyLog, Thank, Message from utils.ui_styles import fmt_msg import config logger = logging.getLogger(__name__) class DigestService: @staticmethod async def collect_weekly_stats(): """Сбор статистики за последние 7 дней""" week_ago = datetime.now() - timedelta(days=7) async with AsyncSessionLocal() as session: # 1. Новые пользователи new_users_stmt = select(func.count(User.id)).where(User.created_at >= week_ago) new_users_count = (await session.execute(new_users_stmt)).scalar() # 2. Поймано шпионов spies_stmt = select(func.count(SpyLog.id)).where(SpyLog.created_at >= week_ago) spies_count = (await session.execute(spies_stmt)).scalar() # 3. Благодарности соседей thanks_stmt = select(func.count(Thank.id)).where(Thank.created_at >= week_ago) thanks_count = (await session.execute(thanks_stmt)).scalar() # 4. Топ активных жильцов # activity_stmt = select(User.first_name, func.count(ActivityLog.id))... (позже добавим) return { "new_users": new_users_count, "spies": spies_count, "thanks": thanks_count, "period": f"{week_ago.strftime('%d.%m')} - {datetime.now().strftime('%d.%m')}" } @staticmethod def format_digest_text(stats): """Форматирование текста дайджеста для Telegram""" text = ( f"{fmt_msg('ЕЖЕНЕДЕЛЬНЫЙ ДАЙДЖЕСТ ЛКМ37', 'digest')}\n" f"📅 Период: {stats['period']}\n\n" f"🏘️ Жизнь дома:\n" f"┣ 👥 Новых соседей: +{stats['new_users']}\n" f"┣ 🙏 Сказано 'Спасибо': {stats['thanks']}\n" f"┗ 🚨 Поймано шпионов: {stats['spies']}\n\n" "📝 Топ событий:\n" "• Обсуждали ремонт лифта\n" "• Решили вопрос по парковке\n\n" "Дайджест готов к публикации. Одобрите или отредактируйте его в веб-панели." ) return text @staticmethod async def send_to_owner(bot, stats): """Отправка черновика владельцу на утверждение""" text = DigestService.format_digest_text(stats) from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton kb = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="✅ Опубликовать в чат", callback_data="publish_digest")], [InlineKeyboardButton(text="📝 Редактировать (WEB)", url=f"http://192.168.10.116:8000/digests/edit")] ]) await bot.send_message( chat_id=config.ADMIN_USER_ID, text=text, reply_markup=kb )