fifa17-recon: reconcile authoritative tools with running backend (B)
- Add 8 files present in docker/fifa17-python/tools but missing from the top-level tree: fut_accounts.py + 7 test_*.py contracts (all committed in the server's docker tree; byte-identical to the running image). - Preserve newer responder work already matching the running container: utas_server.py (offlineSeason), lsx_responder_v2.py (OPENFUT_BIND), blaze_responder_v3b.py, autopatch.py, pow_server.py, fut_store.py, test_fut_contract.py, fifa17-hook-m1.sh. - Add 30 newer ghidra_queries (draft purchase/state, SBC 9-26, runtime registries). Local tree is now a strict superset of B with all shared files byte-identical.
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Launcher-to-server active-account selection for the single-player stack."""
|
||||
import json
|
||||
import os
|
||||
|
||||
from fut_account import ACCOUNT
|
||||
from fut_store import STORE, profile_path_for
|
||||
|
||||
|
||||
def _existing_identity(persona_id):
|
||||
path = profile_path_for(persona_id)
|
||||
try:
|
||||
with open(path) as f:
|
||||
profile = json.load(f)
|
||||
except (OSError, ValueError):
|
||||
return {}
|
||||
if not isinstance(profile, dict):
|
||||
return {}
|
||||
return {
|
||||
"club_name": profile.get("clubName"),
|
||||
"club_abbr": profile.get("clubAbbr"),
|
||||
"established": profile.get("established"),
|
||||
"pow_level": profile.get("powLevel"),
|
||||
"pow_exp": profile.get("powExp"),
|
||||
"pow_exp_max": profile.get("powExpMax"),
|
||||
"pow_funds": profile.get("powFunds"),
|
||||
"pow_funds_cap": profile.get("powFundsCap"),
|
||||
}
|
||||
|
||||
|
||||
def activate(payload):
|
||||
"""Select/create one persistent profile and publish it to all responders."""
|
||||
if not isinstance(payload, dict):
|
||||
raise ValueError("account payload must be an object")
|
||||
try:
|
||||
persona_id = int(payload.get("personaId"))
|
||||
except (TypeError, ValueError):
|
||||
raise ValueError("personaId must be a positive integer") from None
|
||||
persona_name = payload.get("personaName")
|
||||
if persona_id <= 0 or not isinstance(persona_name, str) or not persona_name.strip():
|
||||
raise ValueError("personaId must be positive and personaName must not be empty")
|
||||
|
||||
values = _existing_identity(persona_id)
|
||||
values.update(persona_id=persona_id, persona_name=persona_name.strip())
|
||||
for wire, field in (("clubName", "club_name"), ("clubAbbr", "club_abbr"),
|
||||
("established", "established"), ("squadName", "squad_name"),
|
||||
("level", "pow_level"), ("experience", "pow_exp"),
|
||||
("experienceMax", "pow_exp_max"), ("accountFunds", "pow_funds"),
|
||||
("accountFundsCap", "pow_funds_cap")):
|
||||
if payload.get(wire) not in (None, ""):
|
||||
values[field] = payload[wire]
|
||||
|
||||
ACCOUNT.replace(values)
|
||||
ACCOUNT.set_online_profile()
|
||||
ACCOUNT.save()
|
||||
profile = STORE.select_account(persona_id)
|
||||
STORE.ensure_security_question()
|
||||
return {
|
||||
"personaId": ACCOUNT.persona_id,
|
||||
"personaName": ACCOUNT.persona_name,
|
||||
"clubName": ACCOUNT.club_name,
|
||||
"clubAbbr": ACCOUNT.club_abbr,
|
||||
"level": ACCOUNT.pow_level,
|
||||
"experience": ACCOUNT.pow_exp,
|
||||
"experienceMax": ACCOUNT.pow_exp_max,
|
||||
"accountFunds": ACCOUNT.pow_funds,
|
||||
"accountFundsCap": ACCOUNT.pow_funds_cap,
|
||||
"profilePath": os.path.relpath(STORE.path, os.path.dirname(ACCOUNT.path)),
|
||||
"coins": profile.get("coins", 0),
|
||||
"unopenedPacks": len(profile.get("unopenedPackIds", [])),
|
||||
}
|
||||
Reference in New Issue
Block a user