major-domo-v2/utils/autocomplete.py
Cal Corum 1d6fef51ab Consolidate season config variables to single source (v2.21.0)
Remove redundant sba_current_season and pd_current_season config values.
All code now uses sba_season and pd_season, which properly read from
environment variables. Fixes /team command defaulting to Season 12.

- Remove duplicate *_current_season constants from config.py
- Update 100+ references across commands, services, and utils
- sba_season defaults to 13, pd_season defaults to 10
- Environment variables SBA_SEASON/PD_SEASON now work correctly

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 16:12:16 -06:00

173 lines
5.4 KiB
Python

"""
Autocomplete Utilities
Shared autocomplete functions for Discord slash commands.
"""
from typing import List, Optional
import discord
from discord import app_commands
from config import get_config
from services.player_service import player_service
from services.team_service import team_service
from utils.team_utils import get_user_major_league_team
async def player_autocomplete(
interaction: discord.Interaction,
current: str
) -> List[app_commands.Choice[str]]:
"""
Autocomplete for player names with team context prioritization.
Prioritizes players from the user's team first, then shows other players.
Args:
interaction: Discord interaction object
current: Current input from user
Returns:
List of player name choices (user's team players first)
"""
if len(current) < 2:
return []
try:
# Get user's team for prioritization
user_team = await get_user_major_league_team(interaction.user.id)
# Search for players using the search endpoint
players = await player_service.search_players(current, limit=50, season=get_config().sba_season)
# Separate players by team (user's team vs others)
user_team_players = []
other_players = []
for player in players:
# Check if player belongs to user's team (any roster section)
is_users_player = False
if user_team and hasattr(player, 'team') and player.team:
# Check if player is from user's major league team or has same base team
if (player.team.id == user_team.id or
(hasattr(player, 'team_id') and player.team_id == user_team.id)):
is_users_player = True
if is_users_player:
user_team_players.append(player)
else:
other_players.append(player)
# Format choices with team context
choices = []
# Add user's team players first (prioritized)
for player in user_team_players[:15]: # Limit user team players
team_info = f"{player.primary_position}"
if hasattr(player, 'team') and player.team:
team_info += f" - {player.team.abbrev}"
choice_name = f"{player.name} ({team_info})"
choices.append(app_commands.Choice(name=choice_name, value=player.name))
# Add other players (remaining slots)
remaining_slots = 25 - len(choices)
for player in other_players[:remaining_slots]:
team_info = f"{player.primary_position}"
if hasattr(player, 'team') and player.team:
team_info += f" - {player.team.abbrev}"
choice_name = f"{player.name} ({team_info})"
choices.append(app_commands.Choice(name=choice_name, value=player.name))
return choices
except Exception:
# Silently fail on autocomplete errors to avoid disrupting user experience
return []
async def team_autocomplete(
interaction: discord.Interaction,
current: str
) -> List[app_commands.Choice[str]]:
"""
Autocomplete for team abbreviations.
Args:
interaction: Discord interaction object
current: Current input from user
Returns:
List of team abbreviation choices
"""
if len(current) < 1:
return []
try:
# Get all teams for current season
teams = await team_service.get_teams_by_season(get_config().sba_season)
# Filter teams by current input and limit to 25
matching_teams = [
team for team in teams
if current.lower() in team.abbrev.lower() or current.lower() in team.sname.lower()
][:25]
choices = []
for team in matching_teams:
choice_name = f"{team.abbrev} - {team.sname}"
choices.append(app_commands.Choice(name=choice_name, value=team.abbrev))
return choices
except Exception:
# Silently fail on autocomplete errors
return []
async def major_league_team_autocomplete(
interaction: discord.Interaction,
current: str
) -> List[app_commands.Choice[str]]:
"""
Autocomplete for Major League team abbreviations only.
Used for trade commands where only ML team owners should be able to initiate trades.
Args:
interaction: Discord interaction object
current: Current input from user
Returns:
List of Major League team abbreviation choices
"""
if len(current) < 1:
return []
try:
# Get all teams for current season
all_teams = await team_service.get_teams_by_season(get_config().sba_season)
# Filter to only Major League teams using the model's helper method
from models.team import RosterType
ml_teams = [
team for team in all_teams
if team.roster_type() == RosterType.MAJOR_LEAGUE
]
# Filter teams by current input and limit to 25
matching_teams = [
team for team in ml_teams
if current.lower() in team.abbrev.lower() or current.lower() in team.sname.lower()
][:25]
choices = []
for team in matching_teams:
choice_name = f"{team.abbrev} - {team.sname}"
choices.append(app_commands.Choice(name=choice_name, value=team.abbrev))
return choices
except Exception:
# Silently fail on autocomplete errors
return []