Files
redairsoft_vk_gt_max_sender/src/admin_notifier.py
T

106 lines
3.8 KiB
Python
Raw 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.
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"⚠️ <b>[VK Poster Alert] Ошибка при проверке группы</b>\n\n"
f"🏷 <b>Группа:</b> {group_name} (<a href=\"{vk_url}\">VK</a>)\n"
f"⏱ <b>Время:</b> <code>{now_str}</code>\n"
f"❌ <b>Ошибка:</b> <code>{error}</code>"
)
await self.send_to_all(text)
return
if not found_posts:
text = (
f"ℹ️ <b>[VK Poster] Проверка завершена</b>\n\n"
f"🏷 <b>Группа:</b> {group_name} (<a href=\"{vk_url}\">VK</a>)\n"
f"⏱ <b>Время:</b> <code>{now_str}</code>\n"
f"📥 Новых постов не обнаружено."
)
await self.send_to_all(text)
return
# We have published posts
lines = [
f"🚀 <b>[VK Poster] Опубликованы новые посты!</b>\n",
f"🏷 <b>Группа:</b> {group_name} (<a href=\"{vk_url}\">VK</a>)",
f"⏱ <b>Время:</b> <code>{now_str}</code>",
f"📊 <b>Количество:</b> {len(found_posts)}\n",
"<b>Список публикаций:</b>",
]
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<b>{idx}. Пост #{post_id}</b>")
lines.append(f"• <a href=\"{vk_post_url}\">Оригинал в VK</a>")
if tg_status == "published":
tg_link = f"<a href=\"{tg_url}\">Ссылка</a>" if tg_url else "Опубликовано"
lines.append(f"• Telegram: ✅ {tg_link}")
elif tg_err:
lines.append(f"• Telegram: ❌ Ошибка: <code>{tg_err[:100]}</code>")
if max_status == "published":
max_link = f"<a href=\"{max_url}\">Ссылка</a>" if max_url else "Опубликовано"
lines.append(f"• MAX: ✅ {max_link}")
elif max_err:
lines.append(f"• MAX: ❌ Ошибка: <code>{max_err[:100]}</code>")
await self.send_to_all("\n".join(lines))