diff --git a/app/routers_v2/players.py b/app/routers_v2/players.py index 7ebd1b5..0fa7bb1 100644 --- a/app/routers_v2/players.py +++ b/app/routers_v2/players.py @@ -32,6 +32,7 @@ from ..db_engine import ( ) from ..db_helpers import upsert_players from ..dependencies import oauth2_scheme, valid_token +from ..services.refractor_boost import compute_variant_hash # --------------------------------------------------------------------------- # Persistent browser instance (WP-02) @@ -132,6 +133,19 @@ def normalize_franchise(franchise: str) -> str: return FRANCHISE_NORMALIZE.get(titled, titled) +def resolve_refractor_tier(player_id: int, variant: int) -> int: + """Determine the refractor tier (0-4) from a player's variant hash. + + Pure math — no DB query needed. Returns 0 for base cards or unknown variants. + """ + if variant == 0: + return 0 + for tier in range(1, 5): + if compute_variant_hash(player_id, tier) == variant: + return tier + return 0 + + router = APIRouter(prefix="/api/v2/players", tags=["players"]) @@ -786,6 +800,7 @@ async def get_batter_card( card_data["cardset_name"] = this_player.cardset.name else: card_data["cardset_name"] = this_player.description + card_data["refractor_tier"] = resolve_refractor_tier(player_id, variant) card_data["request"] = request html_response = templates.TemplateResponse("player_card.html", card_data) @@ -823,6 +838,7 @@ async def get_batter_card( card_data["cardset_name"] = this_player.cardset.name else: card_data["cardset_name"] = this_player.description + card_data["refractor_tier"] = resolve_refractor_tier(player_id, variant) card_data["request"] = request html_response = templates.TemplateResponse("player_card.html", card_data) diff --git a/storage/templates/player_card.html b/storage/templates/player_card.html index 9cdf814..478ac25 100644 --- a/storage/templates/player_card.html +++ b/storage/templates/player_card.html @@ -2,9 +2,32 @@ {% include 'style.html' %} + {% include 'tier_style.html' %}
+ {%- set diamond_colors = { + 1: {'color': '#1a6b1a', 'highlight': '#40b040'}, + 2: {'color': '#2070b0', 'highlight': '#50a0e8'}, + 3: {'color': '#a82020', 'highlight': '#e85050'}, + 4: {'color': '#6b2d8e', 'highlight': '#a060d0'}, + } -%} + {% if refractor_tier is defined and refractor_tier > 0 %} + {%- set dc = diamond_colors[refractor_tier] -%} + {%- set filled_bg = 'linear-gradient(135deg, ' ~ dc.highlight ~ ' 0%, ' ~ dc.color ~ ' 50%, ' ~ dc.color ~ ' 100%)' -%} +
+
= 2 %}style="background: {{ filled_bg }}; box-shadow: inset 0 1px 2px rgba(255,255,255,0.45), inset 0 -1px 2px rgba(0,0,0,0.35), inset 1px 0 2px rgba(255,255,255,0.15);"{% endif %}>
+
= 1 %}style="background: {{ filled_bg }}; box-shadow: inset 0 1px 2px rgba(255,255,255,0.45), inset 0 -1px 2px rgba(0,0,0,0.35), inset 1px 0 2px rgba(255,255,255,0.15);"{% endif %}>
+
= 3 %}style="background: {{ filled_bg }}; box-shadow: inset 0 1px 2px rgba(255,255,255,0.45), inset 0 -1px 2px rgba(0,0,0,0.35), inset 1px 0 2px rgba(255,255,255,0.15);"{% endif %}>
+
= 4 %}style="background: {{ filled_bg }}; box-shadow: inset 0 1px 2px rgba(255,255,255,0.45), inset 0 -1px 2px rgba(0,0,0,0.35), inset 1px 0 2px rgba(255,255,255,0.15);"{% endif %}>
+
+ {% if refractor_tier == 4 %} +
+
+
+
+ {% endif %} + {% endif %}