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 import logging logger = logging.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() # Логика проверки изменений и отправки сообщений # ... (ваша существующая логика)