Initial commit for RedAirsoft VK to TG and MAX poster
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
from datetime import datetime
|
||||
from typing import Any, Optional
|
||||
from aiogram import Bot
|
||||
from loguru import logger
|
||||
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))
|
||||
Reference in New Issue
Block a user