import asyncio 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(Config.WATCHER_BASE_DELAY, Config.WATCHER_BASE_DELAY + 100) await asyncio.sleep(delay) except asyncio.CancelledError: break except Exception as e: logger.error(f"Ошибка в watcher_loop: {e}") await asyncio.sleep(60) @staticmethod def _get_target_day() -> 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(): logger.info(f"Проверяем расписание для {group} на {day.strftime('%d.%m.%Y')}") await self._check_group_schedule(group, chat_id, day.day) async def _check_group_schedule(self, group: str, chat_id: int, day: int): """Проверка расписания для конкретной группы""" clip_png, url, data_day, data_mouth = await self.schedule_service.get_schedule(group, 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() # Логика проверки изменений и отправки сообщений # ... (ваша существующая логика)