It's version 0.8.3 bug fix ТЕПЕРЬ УЖ точно восстановлена система слежения расписания
This commit is contained in:
@@ -35,14 +35,17 @@ class ScheduleService:
|
||||
else:
|
||||
target = target.replace(day=int(day_offset))
|
||||
return target.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
|
||||
def _get_next_day(self, day_offeset: int = 0) -> datetime:
|
||||
return datetime.now() + timedelta(days=day_offeset)
|
||||
|
||||
|
||||
def _next_target_date(self, day_offset: int = 0) -> datetime:
|
||||
return (datetime.now() + timedelta(days=day_offset)).replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
|
||||
|
||||
|
||||
async def _load_pdf_for_date(
|
||||
self, day_offset: int = 1
|
||||
self, day_offset: int = 0
|
||||
) -> Tuple[Optional[bytes], Optional[str], int, int]:
|
||||
target = self._get_next_day(day_offset)
|
||||
target = self._resolve_target_date(day_offset)
|
||||
day, month = target.day, target.month
|
||||
|
||||
drive_file = await self.drive.find_for_date(target)
|
||||
@@ -57,6 +60,25 @@ class ScheduleService:
|
||||
url = f"https://drive.google.com/file/d/{drive_file.file_id}/view"
|
||||
return self._pdf_cache[drive_file.file_id], url, day, month
|
||||
|
||||
async def _load_pdf_for_watcher(
|
||||
self, day_offset: int = 1
|
||||
) -> Tuple[Optional[bytes], Optional[str], int, int]:
|
||||
target = self._next_target_date(day_offset)
|
||||
day, month = target.day, target.month
|
||||
|
||||
drive_file = await self.drive.find_for_date(target)
|
||||
if not drive_file:
|
||||
return None, None, day, month
|
||||
|
||||
if drive_file.file_id not in self._pdf_cache:
|
||||
self._pdf_cache[drive_file.file_id] = await self.drive.download_pdf(
|
||||
drive_file.file_id
|
||||
)
|
||||
|
||||
url = f"https://drive.google.com/file/d/{drive_file.file_id}/view"
|
||||
return self._pdf_cache[drive_file.file_id], url, day, month
|
||||
|
||||
|
||||
@staticmethod
|
||||
def exact_group_regex(group: str) -> re.Pattern:
|
||||
pattern = rf"(^|{BOUNDARY}){re.escape(group)}({BOUNDARY}|$)"
|
||||
@@ -108,7 +130,7 @@ class ScheduleService:
|
||||
return f"📅 Расписание для {day} числа:\n<pre>{body}</pre>"
|
||||
|
||||
async def is_published_for(self, day_offset: int = 0) -> bool:
|
||||
target = self._resolve_target_date(day_offset)
|
||||
target = self._next_target_date(day_offset)
|
||||
return await self.drive.find_for_date(target) is not None
|
||||
|
||||
async def get_schedule(
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import asyncio
|
||||
from random import randint
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from aiogram import Bot, types
|
||||
|
||||
from config import Config
|
||||
from logging import getLogger
|
||||
from models.state import BotState
|
||||
@@ -47,6 +47,20 @@ class WatcherService:
|
||||
Config.WATCHER_RANDOM_DELAY_MAX,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def _get_target_date_with_weekend_handling(days_ahead: int) -> datetime:
|
||||
"""
|
||||
Получить целевую дату с учетом выходных.
|
||||
Если целевая дата - воскресенье, переносится на понедельник.
|
||||
"""
|
||||
target = (datetime.now() + timedelta(days=days_ahead)).replace(
|
||||
hour=0, minute=0, second=0, microsecond=0
|
||||
)
|
||||
# weekday() returns 6 for Sunday
|
||||
if target.weekday() == 6:
|
||||
target += timedelta(days=1)
|
||||
return target
|
||||
|
||||
async def _watcher_loop(self):
|
||||
"""Основной цикл слежки за появлением PDF на Google Drive."""
|
||||
while self.state.watcher_work:
|
||||
@@ -71,12 +85,14 @@ class WatcherService:
|
||||
Возвращает True, если расписание ещё недоступно ни для одной группы.
|
||||
Возвращает False, если хотя бы одной группе отправили расписание.
|
||||
"""
|
||||
target = self.schedule_service._resolve_target_date(0)
|
||||
days_ahead = self.state.watcher_days_ahead
|
||||
target = self._get_target_date_with_weekend_handling(days_ahead)
|
||||
logger.info(
|
||||
f"Проверяем Google Drive на расписание за {target.strftime('%d.%m.%Y')}"
|
||||
f"Проверяем Google Drive на расписание за {target.strftime('%d.%m.%Y')} "
|
||||
f"(дней вперед: {days_ahead})"
|
||||
)
|
||||
|
||||
if not await self.schedule_service.is_published_for(0):
|
||||
if not await self.schedule_service.is_published_for(days_ahead):
|
||||
return True
|
||||
|
||||
found_any = False
|
||||
@@ -84,14 +100,15 @@ class WatcherService:
|
||||
logger.info(
|
||||
f"Проверяем расписание для {group} на {target.strftime('%d.%m.%Y')}"
|
||||
)
|
||||
if await self._check_group_schedule(group, chat_id):
|
||||
if await self._check_group_schedule(group, chat_id, days_ahead):
|
||||
found_any = True
|
||||
|
||||
return not found_any
|
||||
|
||||
async def _check_group_schedule(self, group: str, chat_id: int) -> bool:
|
||||
async def _check_group_schedule(self, group: str, chat_id: int, days_ahead: int) -> bool:
|
||||
target = self._get_target_date_with_weekend_handling(days_ahead)
|
||||
text, url, data_day, data_month = await self.schedule_service.get_schedule(
|
||||
group, 0
|
||||
group, target.day
|
||||
)
|
||||
if not self.schedule_service.is_schedule_missing(text):
|
||||
msg = await self.bot.send_message(
|
||||
|
||||
Reference in New Issue
Block a user