domovoy_bot/services/digest_service.py

73 lines
3.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"🏘️ <b>Жизнь дома:</b>\n"
f"┣ 👥 Новых соседей: +{stats['new_users']}\n"
f"┣ 🙏 Сказано 'Спасибо': {stats['thanks']}\n"
f"┗ 🚨 Поймано шпионов: {stats['spies']}\n\n"
"📝 <b>Топ событий:</b>\n"
"• Обсуждали ремонт лифта\n"
"• Решили вопрос по парковке\n\n"
"<i>Дайджест готов к публикации. Одобрите или отредактируйте его в веб-панели.</i>"
)
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
)