from pydantic import Field, field_validator from pydantic_settings import BaseSettings, SettingsConfigDict from typing import Union class Config(BaseSettings): model_config = SettingsConfigDict( extra="ignore", env_prefix="GROUP_HORSE_RACING_", ) TEST_MODE: bool = False TESTERS: set[int] = Field(default_factory=set) TEST_GROUPS: set[int] = Field(default_factory=set) ALLOWED_GROUPS: set[int] = Field(default_factory=set) PARTICIPANT_REWARD: int = 50 CHAMPION_REWARD: int = 200 MIN_BET: int = 10 MIN_ODDS: float = 1.2 RACE_DISTANCE: int = 100 RACE_TICK_INTERVAL: int = 5 MESSAGE_RECALL: dict[str, int] = Field( default_factory=lambda: { "race_update": 30, "registration": 180, "bet_confirm": 180, "cancel_confirm": 60, "error": 60, "race_result": 0, "leaderboard": 0, "help": 0, "odds_display": 0, } ) RACE_DB_FILE: str = "data/group_horse_racing/race.db" @field_validator("TESTERS", "TEST_GROUPS", "ALLOWED_GROUPS", mode="before") @classmethod def parse_id_sets(cls, v): """Parse ID sets from various formats.""" if isinstance(v, set): return v if isinstance(v, str): # Handle JSON string format like "[1424473282]" import json try: parsed = json.loads(v) if isinstance(parsed, list): return set(int(x) for x in parsed) except (json.JSONDecodeError, ValueError, TypeError): pass # Handle comma-separated format try: return set(int(x.strip()) for x in v.split(",") if x.strip()) except ValueError: pass if isinstance(v, (list, tuple)): return set(int(x) for x in v) return v if isinstance(v, set) else set()