From 5f9ff8bd0dab0e619ac1bbf41f317e8a2e65aa03 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, 15 Nov 2025 14:29:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B8=D1=81=D0=BC=D1=87=D0=B8=D1=81=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- get_data.py | 91 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 31 deletions(-) diff --git a/get_data.py b/get_data.py index d31ad0c..e0646f6 100644 --- a/get_data.py +++ b/get_data.py @@ -876,23 +876,24 @@ def build_pretty_status_message(): ) src_lines = [] for k in keys: - d = latest_data.get(k) or {} - ts = d.get("ts", "—") - dat = d.get("data") - if isinstance(dat, dict) and "status" in dat: - st = str(dat["status"]).lower() - else: - st = str(dat).lower() + if "excel" not in k.lower(): + d = latest_data.get(k) or {} + ts = d.get("ts", "—") + dat = d.get("data") + if isinstance(dat, dict) and "status" in dat: + st = str(dat["status"]).lower() + else: + st = str(dat).lower() - # Эмодзи-кружки для статусов - if any(x in st for x in ["ok", "success", "live", "online"]): - emoji = "🟢" - elif any(x in st for x in ["error", "fail", "no-status", "none", "timeout"]): - emoji = "🔴" - else: - emoji = "🟡" + # Эмодзи-кружки для статусов + if any(x in st for x in ["ok", "success", "live", "online"]): + emoji = "🟢" + elif any(x in st for x in ["error", "fail", "no-status", "none", "timeout"]): + emoji = "🔴" + else: + emoji = "🟡" - src_lines.append(f"{emoji} {k}: {st} ({ts})") + src_lines.append(f"{emoji} {k}: {st} ({ts})") if src_lines: lines.append("📡 Sources:") @@ -1231,8 +1232,9 @@ def excel_worker(): # logger.info("[excel] Все вкладки Excel обновлены") - else:pass - # logger.warning("[excel] get_excel() вернул не словарь") + else: + pass + # logger.warning("[excel] get_excel() вернул не словарь") except Exception as e: logger.warning(f"[excel] ошибка при чтении Excel: {e}") @@ -1531,12 +1533,16 @@ async def status(request: Request): sorted_keys = [k for k in sort_order if k in latest_data] + sorted( [k for k in latest_data if k not in sort_order] ) + # убираем excel_* из списка ключей + sorted_keys = [k for k in sorted_keys if "excel" not in k.lower()] + cached_game_id = get_cached_game_id() or GAME_ID note = "" if cached_game_id and GAME_ID and str(cached_game_id) != str(GAME_ID): note = ( f' (предзагружены данные прошлой игры)' ) + data = { "league": LEAGUE, "team": TEAM, @@ -1547,7 +1553,9 @@ async def status(request: Request): "name": TEAM, "status": STATUS, "ts": ( - GAME_START_DT.strftime("%Y-%m-%d %H:%M") if GAME_START_DT else "N/A" + GAME_START_DT.strftime("%Y-%m-%d %H:%M") + if GAME_START_DT + else "N/A" ), "link": LEAGUE, "color": color_for_status(STATUS), @@ -1577,13 +1585,13 @@ async def status(request: Request): else latest_data[item]["data"] ), } - for item in sorted_keys # ← используем отсортированный порядок + for item in sorted_keys ], } + accept = request.headers.get("accept", "") if "text/html" in accept: status_raw = str(STATUS).lower() - # print(status_raw) if status_raw in ["live", "online"]: gs_class = "live" gs_text = "🟢 LIVE" @@ -1592,13 +1600,11 @@ async def status(request: Request): gs_text = "🟢 GAME TODAY (soon)" elif status_raw in ["finished_wait"]: gs_class = "upcoming" - # покажем, что он ДОЖИДАЕТСЯ оффлайна off_at = OFFLINE_SWITCH_AT if off_at: human = datetime.fromtimestamp(off_at).strftime("%H:%M:%S") gs_text = f"🟡 Game finished, cooling down → OFFLINE at {human}" else: - human = "N/A" gs_text = "🟡 Game finished, cooling down" elif status_raw in ["finished_today", "finished"]: gs_class = "finished" @@ -1634,6 +1640,7 @@ async def status(request: Request): }} tr:nth-child(even) {{ background-color: #1a1a1a; }} .ok {{ color: #00ff7f; font-weight: bold; }} + .warn {{ color: #ffff66; font-weight: bold; }} .fail {{ color: #ff4d4d; font-weight: bold; }} .live {{ color: #00ff7f; font-weight: bold; }} .finished {{ color: #ff4d4d; font-weight: bold; }} @@ -1660,6 +1667,7 @@ async def status(request: Request): NameStatusTimestampLink """ + # ВАЖНО: цикл только добавляет строки, return будет ПОСЛЕ цикла for s in data["statuses"]: status_text = str(s["status"]).strip().lower() @@ -1679,6 +1687,7 @@ async def status(request: Request): color_class = "fail" else: color_class = "unknown" + html += f""" {s["name"]} @@ -1688,12 +1697,14 @@ async def status(request: Request): """ + # закрываем таблицу и страницу УЖЕ ПОСЛЕ цикла html += """ """ return HTMLResponse(content=html, media_type="text/html") + # JSON для API (красиво отформатированный) formatted = json.dumps(data, indent=4, ensure_ascii=False) response = Response(content=formatted, media_type="application/json") @@ -3130,8 +3141,8 @@ def resolve_period(ls: dict, game: dict) -> str: if period_num <= 4: return f"Q{period_num}" return f"OT{period_num - 4}".replace("1", "") - - + + @app.get("/games_online") async def games_online(): if not CALENDAR or "items" not in CALENDAR: @@ -3166,8 +3177,12 @@ async def games_online(): ls = resp.get("result") or resp msg = str(ls.get("message") or "").lower() status = str(ls.get("status") or "").lower() - if msg == "not found" or status == "404": pass - elif ls.get("message") != "Not found" and str(ls.get("gameStatus")).lower() == "online": + if msg == "not found" or status == "404": + pass + elif ( + ls.get("message") != "Not found" + and str(ls.get("gameStatus")).lower() == "online" + ): game["score1"] = ls.get("scoreA", game.get("score1", "")) game["score2"] = ls.get("scoreB", game.get("score2", "")) game["period"] = resolve_period(ls, game) @@ -3180,8 +3195,12 @@ async def games_online(): todays_games.append( { "gameStatus": game["gameStatus"], - "score1": game["score1"] if any((s or 0) > 0 for s in scores) else "", - "score2": game["score2"] if any((s or 0) > 0 for s in scores) else "", + "score1": ( + game["score1"] if any((s or 0) > 0 for s in scores) else "" + ), + "score2": ( + game["score2"] if any((s or 0) > 0 for s in scores) else "" + ), "period": game["period"] if "period" in game else "", "defaultZoneTime": game["defaultZoneTime"], "team1": item["team1"]["name"], @@ -3190,9 +3209,19 @@ async def games_online(): "team1_logo_xls": game["team1_logo_xls"], "team2_xls": game["team2_xls"], "team2_logo_xls": game["team2_logo_xls"], - "mask1": "#FFFFFF00" if any((s or 0) > 0 for s in scores) else "#FFFFFF", - "mask2": "#FFFFFF00" if (game["period"] if "period" in game else "") == "" else "#FFFFFF", - "mask3": "#FFFFFF00" if (game["period"] if "period" in game else "") != "" else "#FFFFFF", + "mask1": ( + "#FFFFFF00" if any((s or 0) > 0 for s in scores) else "#FFFFFF" + ), + "mask2": ( + "#FFFFFF00" + if (game["period"] if "period" in game else "") == "" + else "#FFFFFF" + ), + "mask3": ( + "#FFFFFF00" + if (game["period"] if "period" in game else "") != "" + else "#FFFFFF" + ), } ) return todays_games