from __future__ import annotations from loguru import logger import asyncio from datetime import datetime from typing import Any, Optional from aiogram import Bot try: from .config import settings except (ImportError, ValueError): from config import settings class AdminNotifier: def __init__(self, bot: Bot) -> None: self.bot = bot self.admin_ids = settings.admin_id_list async def send_to_all(self, text: str) -> None: if not self.admin_ids: return for admin_id in self.admin_ids: try: await self.bot.send_message( chat_id=admin_id, text=text, parse_mode="HTML", disable_web_page_preview=True, ) except Exception as exc: logger.warning("Failed to send report to admin {}: {}", admin_id, exc) async def notify_cycle_result( self, group_name: str, vk_url: str, found_posts: list[dict[str, Any]], error: Optional[str] = None, ) -> None: if not self.admin_ids: return # If 0 posts found and no error, check settings if not found_posts and not error: if not settings.report_empty_runs: return now_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S") if error: text = ( f"⚠️ [VK Poster Alert] Ошибка при проверке группы\n\n" f"🏷 Группа: {group_name} (VK)\n" f"⏱ Время: {now_str}\n" f"❌ Ошибка: {error}" ) await self.send_to_all(text) return if not found_posts: text = ( f"ℹ️ [VK Poster] Проверка завершена\n\n" f"🏷 Группа: {group_name} (VK)\n" f"⏱ Время: {now_str}\n" f"📥 Новых постов не обнаружено." ) await self.send_to_all(text) return # We have published posts lines = [ f"🚀 [VK Poster] Опубликованы новые посты!\n", f"🏷 Группа: {group_name} (VK)", f"⏱ Время: {now_str}", f"📊 Количество: {len(found_posts)}\n", "Список публикаций:", ] for idx, p in enumerate(found_posts, 1): post_id = p.get("vk_post_id") vk_post_url = p.get("vk_post_url") tg_url = p.get("tg_url") max_url = p.get("max_url") tg_status = p.get("tg_status") max_status = p.get("max_status") tg_err = p.get("tg_error") max_err = p.get("max_error") lines.append(f"\n{idx}. Пост #{post_id}") lines.append(f"• Оригинал в VK") if tg_status == "published": tg_link = f"Ссылка" if tg_url else "Опубликовано" lines.append(f"• Telegram: ✅ {tg_link}") elif tg_err: lines.append(f"• Telegram: ❌ Ошибка: {tg_err[:100]}") if max_status == "published": max_link = f"Ссылка" if max_url else "Опубликовано" lines.append(f"• MAX: ✅ {max_link}") elif max_err: lines.append(f"• MAX: ❌ Ошибка: {max_err[:100]}") await self.send_to_all("\n".join(lines))