It's my tg bot for schedule. version 0.1
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
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()
|
||||
|
||||
# Логика проверки изменений и отправки сообщений
|
||||
# ... (ваша существующая логика)
|
||||
Reference in New Issue
Block a user