Files
myfirstprogram/services/watcher_service.py
T
2025-10-04 17:14:26 +03:00

97 lines
3.3 KiB
Python

import asyncio
import hashlib
from datetime import datetime, timedelta
from random import randint
from aiogram import Bot
from aiogram.types import BufferedInputFile
from models.state import BotState
from config import Config
from services.schedule_service import ScheduleService
from logging import getLogger
logger = getLogger(__name__)
class WatcherService:
def __init__(self, state: BotState, bot: Bot):
self.state = state
self.bot = bot
self.schedule_service = ScheduleService()
async def start(self):
"""Запуск слежки"""
if self.state.watcher_work:
return
self.state.watcher_work = True
self.state.watcher_task = asyncio.create_task(self._watcher_loop())
logger.info("Watcher запущен")
async def stop(self):
"""Остановка слежки"""
if not self.state.watcher_work:
return
self.state.watcher_work = False
if self.state.watcher_task:
self.state.watcher_task.cancel()
try:
await self.state.watcher_task
except asyncio.CancelledError:
pass
logger.info("Watcher остановлен")
async def _watcher_loop(self):
"""Основной цикл слежки"""
while self.state.watcher_work:
try:
await self._check_all_groups()
delay = randint(600, 700)
await asyncio.sleep(delay)
except asyncio.CancelledError:
break
except Exception as e:
logger.error(f"Ошибка в watcher_loop: {e}")
await asyncio.sleep(60)
def _get_target_day(self) -> datetime:
"""Получение целевого дня"""
now = datetime.now()
target = now + timedelta(days=1)
if target.weekday() == 6:
target += timedelta(days=1)
return target
async def _check_all_groups(self):
"""Проверка всех групп на изменения"""
day = self._get_target_day()
for group, chat_id in Config.GROUP_CHATS.items():
await self._check_group_schedule(group, chat_id, day)
async def _check_group_schedule(self, group: str, chat_id: int, day: int):
"""Проверка расписания для конкретной группы"""
logger.info(f"Проверяем расписание для {group} на {day.strftime('%d.%m.%Y')}")
clip_png, url, data_day, data_mouth = await self.schedule_service.get_schedule(group, day.day)
if clip_png:
msg = await self.bot.send_photo(
chat_id,
BufferedInputFile(clip_png, filename=f"{group}.png"),
caption=f"Авто-расписание для {group} на {data_day:02d}.{data_mouth:02d}"
)
await self.bot.pin_chat_message(chat_id, msg.message_id, disable_notification=True)
else:
logger.warning(f"Не удалось получить расписание для {group}, {data_day}, {data_mouth}, {url}")
return
#clip_hash = hashlib.md5(clip_png).hexdigest()
# Логика проверки изменений и отправки сообщений
# ... (ваша существующая логика)