From 2fa69cbe1bde01825b9fcab9268534d29905e183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AE=D1=80=D0=B8=D0=B9=20=D0=A7=D0=B5=D1=80=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BA=D0=BE?= Date: Sat, 1 Nov 2025 19:02:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=81=D1=8B=D0=BF=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D1=8B=D0=BF=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B8=20=D0=B8=D0=B3=D1=80=D0=B0=20=D1=81=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=D0=B4=D0=BD=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- get_data.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) 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 --------