Run Black formatter across 83 files and fix 1514 ruff violations: - E722: bare except → typed exceptions (17 fixes) - E711/E712/E721: comparison style fixes with noqa for SQLAlchemy (44 fixes) - F841: unused variable assignments (70 fixes) - F541/F401: f-string and import cleanup (1383 auto-fixes) Remaining 925 errors are all F403/F405 (star imports) — structural, requires converting to explicit imports in a separate effort. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
169 lines
5.4 KiB
Python
169 lines
5.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Manual script to distribute packs to all human-controlled teams
|
|
"""
|
|
|
|
import argparse
|
|
import asyncio
|
|
import logging
|
|
import os
|
|
import sys
|
|
from api_calls import db_get, db_post, DB_URL
|
|
|
|
# Set up logging
|
|
logging.basicConfig(
|
|
level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
|
)
|
|
logger = logging.getLogger("manual_pack_dist")
|
|
|
|
|
|
def check_environment():
|
|
"""Check that required environment variables are set"""
|
|
api_token = os.getenv("API_TOKEN")
|
|
database_env = os.getenv("DATABASE", "dev")
|
|
|
|
if not api_token:
|
|
logger.error("ERROR: API_TOKEN environment variable is not set!")
|
|
logger.error("Please set it with: export API_TOKEN='your-token-here'")
|
|
sys.exit(1)
|
|
|
|
logger.info(f"Using database environment: {database_env}")
|
|
logger.info(f"API URL: {DB_URL}")
|
|
logger.info(
|
|
f"API Token: {'*' * (len(api_token) - 4)}{api_token[-4:] if len(api_token) > 4 else '****'}"
|
|
)
|
|
logger.info("")
|
|
|
|
|
|
async def distribute_packs(num_packs: int = 5, exclude_team_abbrev: list[str] = None):
|
|
"""Distribute packs to all human-controlled teams
|
|
|
|
Args:
|
|
num_packs: Number of packs to give to each team (default: 5)
|
|
exclude_team_abbrev: List of team abbreviations to exclude (default: None)
|
|
"""
|
|
if exclude_team_abbrev is None:
|
|
exclude_team_abbrev = []
|
|
|
|
# Convert to uppercase for case-insensitive matching
|
|
exclude_team_abbrev = [abbrev.upper() for abbrev in exclude_team_abbrev]
|
|
|
|
# Step 1: Get current season
|
|
logger.info("Fetching current season...")
|
|
current = await db_get("current")
|
|
if current is None:
|
|
logger.error(
|
|
"Failed to fetch current season from API. Check your API_TOKEN and DATABASE environment variables."
|
|
)
|
|
logger.error(f"API URL: {DB_URL}")
|
|
logger.error(
|
|
"Make sure the API endpoint is accessible and your token is valid."
|
|
)
|
|
raise ValueError("Could not connect to the database API")
|
|
|
|
logger.info(f"Current season: {current['season']}")
|
|
|
|
# Step 2: Get all teams for current season
|
|
logger.info(f"Fetching all teams for season {current['season']}...")
|
|
all_teams = await db_get("teams", params=[("season", current["season"])])
|
|
if all_teams is None:
|
|
logger.error("Failed to fetch teams from API")
|
|
raise ValueError("Could not fetch teams from the database API")
|
|
|
|
logger.info(f"Found {all_teams['count']} total teams")
|
|
|
|
# Step 3: Filter for human-controlled teams only
|
|
qualifying_teams = []
|
|
for team in all_teams["teams"]:
|
|
if not team["is_ai"] and "gauntlet" not in team["abbrev"].lower():
|
|
# Check if team is in exclusion list
|
|
if team["abbrev"].upper() in exclude_team_abbrev:
|
|
logger.info(f" - {team['abbrev']}: {team['sname']} (EXCLUDED)")
|
|
continue
|
|
qualifying_teams.append(team)
|
|
logger.info(f" - {team['abbrev']}: {team['sname']}")
|
|
|
|
logger.info(f"\nFound {len(qualifying_teams)} human-controlled teams")
|
|
if exclude_team_abbrev:
|
|
logger.info(f"Excluded teams: {', '.join(exclude_team_abbrev)}")
|
|
|
|
# Step 4: Distribute packs
|
|
pack_type_id = 1 # Standard packs
|
|
|
|
logger.info(f"\nDistributing {num_packs} standard packs to each team...")
|
|
|
|
for team in qualifying_teams:
|
|
logger.info(
|
|
f"Giving {num_packs} packs to {team['abbrev']} ({team['sname']})..."
|
|
)
|
|
|
|
# Create pack payload
|
|
pack_payload = {
|
|
"packs": [
|
|
{
|
|
"team_id": team["id"],
|
|
"pack_type_id": pack_type_id,
|
|
"pack_cardset_id": None,
|
|
}
|
|
for _ in range(num_packs)
|
|
]
|
|
}
|
|
|
|
try:
|
|
await db_post("packs", payload=pack_payload)
|
|
logger.info(f" ✓ Successfully gave packs to {team['abbrev']}")
|
|
except Exception as e:
|
|
logger.error(f" ✗ Failed to give packs to {team['abbrev']}: {e}")
|
|
|
|
logger.info(
|
|
f"\n🎉 All done! Distributed {num_packs} packs to {len(qualifying_teams)} teams"
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(
|
|
description="Distribute packs to all human-controlled teams",
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
epilog="""
|
|
Examples:
|
|
# Give 5 packs to all teams (default)
|
|
python manual_pack_distribution.py
|
|
|
|
# Give 10 packs to all teams
|
|
python manual_pack_distribution.py --num-packs 10
|
|
|
|
# Give 5 packs, excluding certain teams
|
|
python manual_pack_distribution.py --exclude-team-abbrev NYY BOS
|
|
|
|
# Give 3 packs, excluding one team
|
|
python manual_pack_distribution.py --num-packs 3 --exclude-team-abbrev LAD
|
|
|
|
Environment Variables:
|
|
API_TOKEN - Required: API authentication token
|
|
DATABASE - Optional: 'dev' (default) or 'prod'
|
|
""",
|
|
)
|
|
parser.add_argument(
|
|
"--num-packs",
|
|
type=int,
|
|
default=5,
|
|
help="Number of packs to give to each team (default: 5)",
|
|
)
|
|
parser.add_argument(
|
|
"--exclude-team-abbrev",
|
|
nargs="*",
|
|
default=[],
|
|
help="Team abbreviations to exclude (space-separated, e.g., NYY BOS LAD)",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Check environment before running
|
|
check_environment()
|
|
|
|
asyncio.run(
|
|
distribute_packs(
|
|
num_packs=args.num_packs, exclude_team_abbrev=args.exclude_team_abbrev
|
|
)
|
|
)
|