Normalize Player.franchise queries to use Team.sname

- Add FRANCHISE_NORMALIZE dict and helper to constants.py
- Update economy.py to normalize team_choice and use sname
- Update helpers/main.py franchise queries to use sname
- Update selectors.py to normalize franchise on player updates

Part of cross-era player matching fix for AI rosters

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2026-01-07 12:01:00 -06:00
parent 5aa88e4e3d
commit 565afd0183
4 changed files with 60 additions and 14 deletions

View File

@ -682,8 +682,10 @@ class Economy(commands.Cog):
logger.debug(f'pack: {pack}') logger.debug(f'pack: {pack}')
logger.debug(f'pack cardset: {pack["pack_cardset"]}') logger.debug(f'pack cardset: {pack["pack_cardset"]}')
if pack['pack_team'] is None and pack['pack_cardset'] is None: if pack['pack_team'] is None and pack['pack_cardset'] is None:
if pack['pack_type']['name'] in p_data: p_group = pack['pack_type']['name']
p_group = pack['pack_type']['name'] # Add to p_data if this is a new pack type
if p_group not in p_data:
p_data[p_group] = []
elif pack['pack_team'] is not None: elif pack['pack_team'] is not None:
if pack['pack_type']['name'] == 'Standard': if pack['pack_type']['name'] == 'Standard':
@ -1250,14 +1252,14 @@ class Economy(commands.Cog):
anchor_all_stars = await db_get( anchor_all_stars = await db_get(
'players/random', 'players/random',
params=[ params=[
('min_rarity', 3), ('max_rarity', 3), ('franchise', team_choice), ('pos_exclude', 'RP'), ('limit', 1), ('min_rarity', 3), ('max_rarity', 3), ('franchise', normalize_franchise(team_choice)), ('pos_exclude', 'RP'), ('limit', 1),
('in_packs', True) ('in_packs', True)
] ]
) )
anchor_starters = await db_get( anchor_starters = await db_get(
'players/random', 'players/random',
params=[ params=[
('min_rarity', 2), ('max_rarity', 2), ('franchise', team_choice), ('pos_exclude', 'RP'), ('limit', 2), ('min_rarity', 2), ('max_rarity', 2), ('franchise', normalize_franchise(team_choice)), ('pos_exclude', 'RP'), ('limit', 2),
('in_packs', True) ('in_packs', True)
] ]
) )
@ -1476,7 +1478,7 @@ class Economy(commands.Cog):
'is_ai': True 'is_ai': True
}) })
p_query = await db_get('players', params=[('franchise', lname)]) p_query = await db_get('players', params=[('franchise', sname)])
this_pack = await db_post( this_pack = await db_post(
'packs/one', 'packs/one',
@ -1503,7 +1505,7 @@ class Economy(commands.Cog):
total_cards = 0 total_cards = 0
total_teams = 0 total_teams = 0
for team in ai_teams['teams']: for team in ai_teams['teams']:
all_players = await db_get('players', params=[('franchise', team['lname'])]) all_players = await db_get('players', params=[('franchise', team['sname'])])
new_players = [] new_players = []
if all_players: if all_players:

View File

@ -6,7 +6,7 @@ Contains all Select classes for various team, cardset, and pack selections.
import logging import logging
import discord import discord
from typing import Literal, Optional from typing import Literal, Optional
from helpers.constants import ALL_MLB_TEAMS, IMAGES from helpers.constants import ALL_MLB_TEAMS, IMAGES, normalize_franchise
logger = logging.getLogger('discord_app') logger = logging.getLogger('discord_app')
@ -465,7 +465,9 @@ class SelectUpdatePlayerTeam(discord.ui.Select):
from discord_ui.confirmations import Confirm from discord_ui.confirmations import Confirm
from helpers import player_desc, send_to_channel from helpers import player_desc, send_to_channel
if self.values[0] == self.player['franchise'] or self.values[0] == self.player['mlbclub']: # Check if already assigned - compare against both normalized franchise and full mlbclub
normalized_selection = normalize_franchise(self.values[0])
if normalized_selection == self.player['franchise'] or self.values[0] == self.player['mlbclub']:
await interaction.response.send_message( await interaction.response.send_message(
content=f'Thank you for the help, but it looks like somebody beat you to it! ' content=f'Thank you for the help, but it looks like somebody beat you to it! '
f'**{player_desc(self.player)}** is already assigned to the **{self.player["mlbclub"]}**.' f'**{player_desc(self.player)}** is already assigned to the **{self.player["mlbclub"]}**.'
@ -493,7 +495,7 @@ class SelectUpdatePlayerTeam(discord.ui.Select):
await question.delete() await question.delete()
await db_patch('players', object_id=self.player['player_id'], params=[ await db_patch('players', object_id=self.player['player_id'], params=[
('mlbclub', self.values[0]), ('franchise', self.values[0]) ('mlbclub', self.values[0]), ('franchise', normalize_franchise(self.values[0]))
]) ])
await db_post(f'teams/{self.reporting_team["id"]}/money/25') await db_post(f'teams/{self.reporting_team["id"]}/money/25')
await send_to_channel( await send_to_channel(

View File

@ -128,6 +128,48 @@ ALL_MLB_TEAMS = {
'Washington Nationals': ['WSN', 'WAS', 'Nationals'], 'Washington Nationals': ['WSN', 'WAS', 'Nationals'],
} }
# Franchise normalization: Convert city+team names to city-agnostic team names
# This enables cross-era player matching (e.g., 'Oakland Athletics' -> 'Athletics')
FRANCHISE_NORMALIZE = {
'Arizona Diamondbacks': 'Diamondbacks',
'Atlanta Braves': 'Braves',
'Baltimore Orioles': 'Orioles',
'Boston Red Sox': 'Red Sox',
'Chicago Cubs': 'Cubs',
'Chicago White Sox': 'White Sox',
'Cincinnati Reds': 'Reds',
'Cleveland Guardians': 'Guardians',
'Colorado Rockies': 'Rockies',
'Detroit Tigers': 'Tigers',
'Houston Astros': 'Astros',
'Kansas City Royals': 'Royals',
'Los Angeles Angels': 'Angels',
'Los Angeles Dodgers': 'Dodgers',
'Miami Marlins': 'Marlins',
'Milwaukee Brewers': 'Brewers',
'Minnesota Twins': 'Twins',
'New York Mets': 'Mets',
'New York Yankees': 'Yankees',
'Oakland Athletics': 'Athletics',
'Philadelphia Phillies': 'Phillies',
'Pittsburgh Pirates': 'Pirates',
'San Diego Padres': 'Padres',
'San Francisco Giants': 'Giants',
'Seattle Mariners': 'Mariners',
'St Louis Cardinals': 'Cardinals',
'St. Louis Cardinals': 'Cardinals',
'Tampa Bay Rays': 'Rays',
'Texas Rangers': 'Rangers',
'Toronto Blue Jays': 'Blue Jays',
'Washington Nationals': 'Nationals',
}
def normalize_franchise(franchise: str) -> str:
"""Convert city+team name to team-only (e.g., 'Oakland Athletics' -> 'Athletics')"""
return FRANCHISE_NORMALIZE.get(franchise, franchise)
# Image URLs # Image URLs
IMAGES = { IMAGES = {
'logo': f'{PD_IMAGE_BUCKET}/sba-logo.png', 'logo': f'{PD_IMAGE_BUCKET}/sba-logo.png',

View File

@ -723,7 +723,7 @@ async def roll_for_cards(all_packs: list, extra_val=None) -> list:
('limit', counts[key]['count']) ('limit', counts[key]['count'])
] ]
if all_packs[0]['pack_team'] is not None: if all_packs[0]['pack_team'] is not None:
params.extend([('franchise', all_packs[0]['pack_team']['lname']), ('in_packs', True)]) params.extend([('franchise', all_packs[0]['pack_team']['sname']), ('in_packs', True)])
elif all_packs[0]['pack_cardset'] is not None: elif all_packs[0]['pack_cardset'] is not None:
params.append(('cardset_id', all_packs[0]['pack_cardset']['id'])) params.append(('cardset_id', all_packs[0]['pack_cardset']['id']))
else: else:
@ -1458,7 +1458,7 @@ async def paperdex_cardset_embed(team: dict, this_cardset: dict) -> list[discord
async def paperdex_team_embed(team: dict, mlb_team: dict) -> list[discord.Embed]: async def paperdex_team_embed(team: dict, mlb_team: dict) -> list[discord.Embed]:
all_dex = await db_get( all_dex = await db_get(
'paperdex', 'paperdex',
params=[('team_id', team['id']), ('franchise', mlb_team['lname']), ('flat', True)] params=[('team_id', team['id']), ('franchise', mlb_team['sname']), ('flat', True)]
) )
dex_player_list = [x['player'] for x in all_dex['paperdex']] dex_player_list = [x['player'] for x in all_dex['paperdex']]
@ -1469,7 +1469,7 @@ async def paperdex_team_embed(team: dict, mlb_team: dict) -> list[discord.Embed]
for x in c_query['cardsets']: for x in c_query['cardsets']:
set_players = await db_get( set_players = await db_get(
'players', 'players',
params=[('cardset_id', x['id']), ('franchise', mlb_team['lname']), ('flat', True), ('inc_dex', False)] params=[('cardset_id', x['id']), ('franchise', mlb_team['sname']), ('flat', True), ('inc_dex', False)]
) )
if set_players is not None: if set_players is not None:
coll_data[x['id']] = { coll_data[x['id']] = {
@ -1721,7 +1721,7 @@ async def open_choice_pack(this_pack, team: dict, context, cardset_id: Optional[
while len(players) < 4 and rarity_id < 10: while len(players) < 4 and rarity_id < 10:
params = [ params = [
('min_rarity', min_rarity), ('max_rarity', rarity_id), ('limit', 4 - len(players)), ('min_rarity', min_rarity), ('max_rarity', rarity_id), ('limit', 4 - len(players)),
('franchise', this_pack['pack_team']['lname']) ('franchise', this_pack['pack_team']['sname'])
] ]
# Only apply in_packs filter if no specific cardset is provided # Only apply in_packs filter if no specific cardset is provided
if this_pack['pack_team']['abbrev'] not in ['MSS'] and cardset_id is None: if this_pack['pack_team']['abbrev'] not in ['MSS'] and cardset_id is None:
@ -1781,7 +1781,7 @@ async def open_choice_pack(this_pack, team: dict, context, cardset_id: Optional[
if cardset_id is None: if cardset_id is None:
params.append(('in_packs', True)) params.append(('in_packs', True))
if this_pack['pack_team'] is not None: if this_pack['pack_team'] is not None:
params.append(('franchise', this_pack['pack_team']['lname'])) params.append(('franchise', this_pack['pack_team']['sname']))
if cardset_id is not None: if cardset_id is not None:
params.append(('cardset_id', cardset_id)) params.append(('cardset_id', cardset_id))
pl = await db_get('players/random', params=params) pl = await db_get('players/random', params=params)