73 lines
3.3 KiB
Python
73 lines
3.3 KiB
Python
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
|
||
)
|