93 lines
No EOL
3.1 KiB
Python
93 lines
No EOL
3.1 KiB
Python
import json
|
|
import os
|
|
|
|
PIR_PATH = os.path.join(os.path.dirname(__file__), "player_identity_registry.json")
|
|
|
|
|
|
class PlayerIdentityRegistry:
|
|
def __init__(self):
|
|
if os.path.exists(PIR_PATH):
|
|
with open(PIR_PATH, "r", encoding="utf-8") as f:
|
|
self.data = json.load(f)
|
|
else:
|
|
self.data = {
|
|
"uuid_to_canonical": {},
|
|
"canonical": {}
|
|
}
|
|
|
|
def save(self):
|
|
with open(PIR_PATH, "w", encoding="utf-8") as f:
|
|
json.dump(self.data, f, indent=2)
|
|
|
|
# ---------------------------------------------------------
|
|
# Resolve UUID → canonical ID (and create if needed)
|
|
# ---------------------------------------------------------
|
|
def resolve(self, uuid, season=None):
|
|
uuid = str(uuid)
|
|
|
|
# Known UUID
|
|
if uuid in self.data["uuid_to_canonical"]:
|
|
cid = self.data["uuid_to_canonical"][uuid]
|
|
entry = self.data["canonical"][cid]
|
|
if season is not None:
|
|
entry["last_season"] = season
|
|
return cid
|
|
|
|
# New UUID → new canonical ID
|
|
cid = f"player_{len(self.data['canonical']) + 1}"
|
|
self.data["uuid_to_canonical"][uuid] = cid
|
|
self.data["canonical"][cid] = {
|
|
"uuids": [uuid],
|
|
"names": [],
|
|
"team_history": [],
|
|
"first_season": season,
|
|
"last_season": season,
|
|
}
|
|
self.save()
|
|
return cid
|
|
|
|
# ---------------------------------------------------------
|
|
# Track name changes
|
|
# ---------------------------------------------------------
|
|
def update_name(self, canonical_id, name):
|
|
entry = self.data["canonical"].get(canonical_id)
|
|
if not entry:
|
|
return
|
|
|
|
if name and name not in entry["names"]:
|
|
entry["names"].append(name)
|
|
self.save()
|
|
|
|
# ---------------------------------------------------------
|
|
# Track team history
|
|
# ---------------------------------------------------------
|
|
def update_team(self, canonical_id, team):
|
|
entry = self.data["canonical"].get(canonical_id)
|
|
if not entry:
|
|
return
|
|
|
|
if team and (not entry["team_history"] or entry["team_history"][-1] != team):
|
|
entry["team_history"].append(team)
|
|
self.save()
|
|
|
|
# ---------------------------------------------------------
|
|
# Backwards compatibility: old method name
|
|
# ---------------------------------------------------------
|
|
def add_name(self, canonical_id, name):
|
|
"""Legacy alias for update_name()."""
|
|
self.update_name(canonical_id, name)
|
|
|
|
def add_team(self, canonical_id, team):
|
|
"""Legacy alias for update_team()."""
|
|
self.update_team(canonical_id, team)
|
|
|
|
|
|
|
|
# ---------------------------------------------------------
|
|
# Rookie detection
|
|
# ---------------------------------------------------------
|
|
def get_first_season(self, canonical_id):
|
|
entry = self.data["canonical"].get(canonical_id)
|
|
if not entry:
|
|
return None
|
|
return entry.get("first_season") |