Ship Steam login, D1 player sync, and cached「我」dashboard.

Players get a fast TTL-backed homepage (local profile / Cloudflare D1) with dense UI polish; login unlocks /home without blocking on every OpenDota refresh.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
voson
2026-08-01 01:24:30 +08:00
co-authored by Cursor
parent 4a61aeeb26
commit f5b7011c45
65 changed files with 7304 additions and 552 deletions
+119
View File
@@ -0,0 +1,119 @@
"""Probe OpenDota + Steam for a player (no secret echo)."""
from __future__ import annotations
import json
import os
import urllib.error
import urllib.parse
import urllib.request
AID = 143712136
SID = AID + 76561197960265728
UA = "climperor-probe"
def _get(url: str) -> tuple[int, object]:
req = urllib.request.Request(url, headers={"User-Agent": UA})
try:
with urllib.request.urlopen(req, timeout=25) as resp:
return resp.status, json.loads(resp.read().decode())
except urllib.error.HTTPError as e:
body = e.read().decode(errors="replace")[:200]
return e.code, {"error": body}
except Exception as e: # noqa: BLE001
return 0, {"error": str(e)}
def main() -> None:
key = (
os.environ.get("STEAM_API_KEY")
or os.environ.get("KEYZOO_ASSET_SECRET_WEB_API_KEY")
or ""
).strip()
od_key = (os.environ.get("OPENDOTA_API_KEY") or "").strip()
print(f"steam_key={bool(key)} opendota_key={bool(od_key)}")
od = f"https://api.opendota.com/api/players/{AID}"
if od_key:
od += f"?api_key={urllib.parse.quote(od_key)}"
code, data = _get(od)
if isinstance(data, dict) and "error" not in data:
profile = data.get("profile") if isinstance(data.get("profile"), dict) else {}
print(
"opendota player",
code,
"name=",
profile.get("personaname") or data.get("personaname"),
"rank_tier=",
data.get("rank_tier"),
"lb=",
data.get("leaderboard_rank"),
)
else:
print("opendota player", code, data)
od_r = f"https://api.opendota.com/api/players/{AID}/recentMatches"
if od_key:
od_r += f"?api_key={urllib.parse.quote(od_key)}"
code, data = _get(od_r)
if isinstance(data, list):
print("opendota recent", code, "n=", len(data))
if data:
print(" first", data[0].get("match_id"), data[0].get("start_time"))
else:
print("opendota recent", code, data)
if key:
q = urllib.parse.urlencode({"key": key, "steamids": str(SID)})
code, data = _get(
f"https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v2/?{q}"
)
players = (((data or {}).get("response") or {}).get("players")) or []
if players:
p = players[0]
print(
"steam summary",
code,
"name=",
p.get("personaname"),
"loc=",
p.get("loccountrycode"),
)
else:
print("steam summary", code, data)
q = urllib.parse.urlencode(
{
"key": key,
"account_id": AID,
"matches_requested": 10,
}
)
code, data = _get(
"https://api.steampowered.com/IDOTA2Match_570/GetMatchHistory/v1/?" + q
)
if isinstance(data, dict):
result = (data.get("result") or {})
print(
"steam match_history",
code,
"status=",
result.get("status"),
"statusDetail=",
result.get("statusDetail"),
"num=",
result.get("num_results"),
"total=",
result.get("total_results"),
)
matches = result.get("matches") or []
if matches:
m0 = matches[0]
print(" first match_id", m0.get("match_id"), "start", m0.get("start_time"))
else:
print("steam match_history", code, data)
if __name__ == "__main__":
main()