diff --git a/get_data.py b/get_data.py index eed9a66..7e48e7d 100644 --- a/get_data.py +++ b/get_data.py @@ -769,6 +769,47 @@ def status_broadcaster(): time.sleep(1) +def start_prestart_watcher(game_dt: datetime | None): + """ + Следит за временем начала игры. + Как только до матча остаётся <= 1ч10м — включает live-треды. + Работает только для "игра сегодня". + """ + if not game_dt: + return # нечего ждать + + def _runner(): + global STATUS + # за сколько включать live + lead = timedelta(hours=1, minutes=10) + switch_at = game_dt - lead + + while not stop_event.is_set(): + now = datetime.now() + + # если игра уже live/finished — не мешаем + if STATUS in ("live", "finished", "finished_wait", "finished_today"): + break + + # если время подошло — включаем live и выходим + if now >= switch_at: + logger.info( + f"[prestart] it's {now}, game at {game_dt}, enabling LIVE threads (1h10m rule)" + ) + STATUS = "live_soon" + # сначала гасим оффлайн, если он крутится + stop_offline_threads() + # а потом включаем live + start_live_threads(SEASON, GAME_ID) + break + + # иначе спим немного и проверяем снова + time.sleep(30) # можно 15–60 сек + + t = threading.Thread(target=_runner, daemon=True) + t.start() + + @asynccontextmanager async def lifespan(app: FastAPI): global STATUS, GAME_ID, SEASON, GAME_START_DT, GAME_TODAY, GAME_SOON @@ -921,13 +962,18 @@ async def lifespan(app: FastAPI): start_offline_threads(SEASON, GAME_ID) else: # игра сегодня + # в любом случае запускаем сторож, если знаем время игры + start_prestart_watcher(game_dt) + if cal_status is None: STATUS = "today_not_started" start_offline_threads(SEASON, GAME_ID) + elif cal_status == "Scheduled": if game_dt: delta = game_dt - datetime.now() - if delta <= timedelta(hours=1): + # если мы уже МЕНЬШЕ чем за 1:10 до игры — сразу в live + if delta <= timedelta(hours=1, minutes=10): STATUS = "live_soon" start_live_threads(SEASON, GAME_ID) else: @@ -936,16 +982,17 @@ async def lifespan(app: FastAPI): else: STATUS = "today_not_started" start_offline_threads(SEASON, GAME_ID) + elif cal_status == "Online": STATUS = "live" start_live_threads(SEASON, GAME_ID) + elif cal_status in ["Result", "ResultConfirmed"]: STATUS = "finished_today" start_offline_threads(SEASON, GAME_ID) else: STATUS = "today_not_started" start_offline_threads(SEASON, GAME_ID) - yield # -------- shutdown --------