Add 7.41e patch notes with a hand-authored reading sidebar.

Ship Climperor Web 0.6.13: latest-patch summary panel, icon/innate fallbacks, and layout/scroll fixes; keep shared ability badges in git.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
voson
2026-07-31 10:06:09 +08:00
co-authored by Cursor
parent a257f96d94
commit 30218790ce
18 changed files with 2169 additions and 63 deletions
+10 -1
View File
@@ -20,6 +20,7 @@ from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
import argparse
import urllib.error
from datetime import datetime, timezone
from shared.grid import hero_table
@@ -169,7 +170,15 @@ def main() -> None:
id_to_key = {int(h["id"]): h["key"] for h in heroes}
print(f"fetching {OPENDOTA_HERO_STATS} ...", flush=True)
raw = http_json(OPENDOTA_HERO_STATS)
# Fail-fast on 429: do not burn the shared 5/10/20/40s retry budget.
try:
raw = http_json(OPENDOTA_HERO_STATS, retries=0)
except urllib.error.HTTPError as e:
if e.code == 429:
raise SystemExit(
"OpenDota rate-limited (HTTP 429); keeping previous cache"
) from e
raise
if not isinstance(raw, list):
raise SystemExit(f"unexpected heroStats payload type: {type(raw).__name__}")
if not raw: