Ship item nicknames, Tiny fear override, and ensure-match API.

Add 冰眼/蛇矛 aliases, correct Tiny fears to Hydra's Breath, and fix production match detail POST 405.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
voson
2026-08-01 04:05:48 +08:00
co-authored by Cursor
parent cafd0651b1
commit 820c3fb1f1
17 changed files with 656 additions and 53 deletions
+37
View File
@@ -1,5 +1,7 @@
"""Fetch shop item descriptions and mechanism tags into data/items_meta.json.
Also merges Chinese nicknames from data/item_alias_overrides.json → aliases.
Sources:
- OpenDota items.json (structure, EN ability text)
- Valve itemlist / itemdata (schinese names + descriptions)
@@ -43,6 +45,7 @@ ICON_URL = (
)
OUT = DATA / "items_meta.json"
OVERRIDES = DATA / "item_tag_overrides.json"
ALIAS_OVERRIDES = DATA / "item_alias_overrides.json"
MIN_CREATED_COST = 1400
ALWAYS_CORE = frozenset({"blink", "aghanims_shard", "gem", "dust", "ghost"})
@@ -262,6 +265,38 @@ def apply_overrides(key: str, tags: list[str], overrides: dict[str, dict]) -> li
return merge_tag_overrides(tags, overrides.get(key), TAG_ORDER)
def load_alias_overrides() -> dict[str, list[str]]:
"""key → Chinese nicknames (冰眼 / 蛇矛); empty if file missing."""
if not ALIAS_OVERRIDES.is_file():
return {}
try:
raw = json.loads(ALIAS_OVERRIDES.read_text(encoding="utf-8"))
except (OSError, json.JSONDecodeError):
return {}
out: dict[str, list[str]] = {}
for key, aliases in (raw.get("items") or {}).items():
if not isinstance(aliases, list):
continue
clean = [str(a).strip() for a in aliases if str(a).strip()]
if clean:
out[str(key)] = list(dict.fromkeys(clean))
return out
def apply_alias_overrides(items_out: dict[str, dict], aliases: dict[str, list[str]]) -> None:
for row in items_out.values():
if not isinstance(row, dict):
continue
key = str(row.get("key") or "")
if not key:
continue
nick = aliases.get(key)
if nick:
row["aliases"] = list(nick)
else:
row.pop("aliases", None)
def main() -> None:
ap = argparse.ArgumentParser(description=__doc__)
ap.add_argument("--delay", type=float, default=0.15)
@@ -301,6 +336,7 @@ def main() -> None:
pass
overrides = load_overrides()
alias_overrides = load_alias_overrides()
items_out: dict[str, dict] = {}
pending = []
for iid in sorted(candidates):
@@ -408,6 +444,7 @@ def main() -> None:
}
write_json_atomic(args.out, payload)
apply_alias_overrides(items_out, alias_overrides)
payload = {
"meta": {
"source": "valve+opendota",