it's version 0.7.2 Я используя нейронку создал новый парсер для гугл таблиц. Тем самым востановив работу программы
This commit is contained in:
+61
-56
@@ -1,12 +1,12 @@
|
||||
import asyncio
|
||||
from datetime import datetime, timedelta
|
||||
from random import randint
|
||||
from aiogram import Bot, types
|
||||
from models.state import BotState
|
||||
from config import Config
|
||||
from services.schedule_service import ScheduleService
|
||||
from logging import getLogger
|
||||
|
||||
from aiogram import Bot, types
|
||||
|
||||
from config import Config
|
||||
from logging import getLogger
|
||||
from models.state import BotState
|
||||
from services.schedule_service import ScheduleService
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
@@ -40,21 +40,24 @@ class WatcherService:
|
||||
pass
|
||||
logger.info("Watcher остановлен")
|
||||
|
||||
@staticmethod
|
||||
def _next_delay() -> int:
|
||||
return Config.WATCHER_INTERVAL_SEC + randint(
|
||||
Config.WATCHER_RANDOM_DELAY_MIN,
|
||||
Config.WATCHER_RANDOM_DELAY_MAX,
|
||||
)
|
||||
|
||||
async def _watcher_loop(self):
|
||||
"""Основной цикл слежки"""
|
||||
"""Основной цикл слежки за появлением PDF на Google Drive."""
|
||||
while self.state.watcher_work:
|
||||
try:
|
||||
find = await self._check_all_groups()
|
||||
if find:
|
||||
# ничего не нашли → ждём
|
||||
delay = randint(
|
||||
Config.WATCHER_BASE_DELAY, Config.WATCHER_BASE_DELAY + 30
|
||||
)
|
||||
logger.info(f"Следующая проверка через {delay}")
|
||||
nothing_found = await self._check_all_groups()
|
||||
if nothing_found:
|
||||
delay = self._next_delay()
|
||||
logger.info(f"PDF/расписание не найдено, следующая проверка через {delay} с")
|
||||
await asyncio.sleep(delay)
|
||||
else:
|
||||
# нашли → останавливаемся
|
||||
logger.info("Расписание найдено, останавливаем watcher")
|
||||
logger.info("Расписание найдено и отправлено, останавливаем watcher")
|
||||
self.state.watcher_work = False
|
||||
break
|
||||
except asyncio.CancelledError:
|
||||
@@ -63,61 +66,63 @@ class WatcherService:
|
||||
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) -> bool:
|
||||
"""
|
||||
Возвращает True, если НИ в одной группе не найдено расписание.
|
||||
Возвращает False, если хотя бы в одной группе найдено расписание.
|
||||
Возвращает True, если расписание ещё недоступно ни для одной группы.
|
||||
Возвращает False, если хотя бы одной группе отправили расписание.
|
||||
"""
|
||||
day = self._get_target_day()
|
||||
found_any = False
|
||||
target = self.schedule_service._resolve_target_date(0)
|
||||
logger.info(
|
||||
f"Проверяем Google Drive на расписание за {target.strftime('%d.%m.%Y')}"
|
||||
)
|
||||
|
||||
if not await self.schedule_service.is_published_for(0):
|
||||
return True
|
||||
|
||||
found_any = False
|
||||
for group, chat_id in Config.GROUP_CHATS.items():
|
||||
logger.info(
|
||||
f"Проверяем расписание для {group} на {day.strftime('%d.%m.%Y')}"
|
||||
f"Проверяем расписание для {group} на {target.strftime('%d.%m.%Y')}"
|
||||
)
|
||||
found = await self._check_group_schedule(group, chat_id, day.day)
|
||||
if found:
|
||||
if await self._check_group_schedule(group, chat_id):
|
||||
found_any = True
|
||||
|
||||
return not found_any # <-- вот так правильно
|
||||
return not found_any
|
||||
|
||||
async def _check_group_schedule(self, group: str, chat_id: int, day: int) -> bool:
|
||||
async def _check_group_schedule(self, group: str, chat_id: int) -> bool:
|
||||
text, url, data_day, data_month = await self.schedule_service.get_schedule(
|
||||
group, day
|
||||
group, 0
|
||||
)
|
||||
if text and "не найдено" not in text.lower():
|
||||
if not self.schedule_service.is_schedule_missing(text):
|
||||
msg = await self.bot.send_message(
|
||||
chat_id,
|
||||
f"Авто-расписание для {group} на {data_day:02d}.{data_month:02d}\n\n{text}",
|
||||
parse_mode="Markdown",
|
||||
(
|
||||
f"🔔 Авто-расписание для {group} "
|
||||
f"на {data_day:02d}.{data_month:02d}\n\n{text}"
|
||||
),
|
||||
parse_mode="HTML",
|
||||
)
|
||||
await self.bot.pin_chat_message(
|
||||
chat_id, msg.message_id, disable_notification=False
|
||||
try:
|
||||
await self.bot.pin_chat_message(
|
||||
chat_id, msg.message_id, disable_notification=False
|
||||
)
|
||||
except Exception as e:
|
||||
logger.warning(f"Не удалось закрепить сообщение в {chat_id}: {e}")
|
||||
return True
|
||||
|
||||
png, url, data_day, data_month = await self.schedule_service.get_pschedule(
|
||||
group, 0
|
||||
)
|
||||
if png:
|
||||
await self.bot.send_photo(
|
||||
chat_id,
|
||||
types.BufferedInputFile(png, filename=f"{group}.png"),
|
||||
caption=(
|
||||
f"🔔 АВАРИЙНЫЙ РЕЖИМ\n\n"
|
||||
f"Авто-расписание для {group} "
|
||||
f"на {data_day:02d}.{data_month:02d}"
|
||||
),
|
||||
)
|
||||
return True
|
||||
else:
|
||||
png, url, data_day, data_month = await self.schedule_service.get_pschedule(
|
||||
group, day
|
||||
)
|
||||
if png:
|
||||
await self.bot.send_photo(
|
||||
chat_id,
|
||||
types.BufferedInputFile(png, filename=f"{group}.png"),
|
||||
caption=f"АВАРИЙНЫЙ РЕЖИМ\n\nАвто-расписание для {group} на {data_day:02d}.{data_month:02d}\n\nНайдено с ошибкой",
|
||||
)
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
# clip_hash = hashlib.md5(clip_png).hexdigest()
|
||||
|
||||
# Логика проверки изменений и отправки сообщений
|
||||
# ... (ваша существующая логика)
|
||||
|
||||
Reference in New Issue
Block a user