""" Configuration module for Discord Rare Monitor Bot. Centralizes environment variable handling and configuration constants. """ import os from typing import Optional class Config: """Configuration class for Discord Rare Monitor Bot.""" # Discord Configuration DISCORD_TOKEN: str = os.getenv('DISCORD_RARE_BOT_TOKEN', '') COMMON_RARE_CHANNEL_ID: int = int(os.getenv('COMMON_RARE_CHANNEL_ID', '1355328792184226014')) GREAT_RARE_CHANNEL_ID: int = int(os.getenv('GREAT_RARE_CHANNEL_ID', '1353676584334131211')) # WebSocket Configuration WEBSOCKET_URL: str = os.getenv('DERETH_TRACKER_WS_URL', 'ws://dereth-tracker:8765/ws/position') # Logging Configuration LOG_LEVEL: str = os.getenv('LOG_LEVEL', 'INFO').upper() # Rare Classification Configuration COMMON_RARE_KEYWORDS: list = ["Crystal", "Jewel", "Pearl", "Elixir", "Kit"] # WebSocket Retry Configuration INITIAL_RETRY_DELAY: int = 5 # seconds MAX_RETRY_DELAY: int = 300 # 5 minutes @classmethod def validate(cls) -> list: """Validate configuration and return list of errors.""" errors = [] if not cls.DISCORD_TOKEN: errors.append("DISCORD_RARE_BOT_TOKEN environment variable is required") if not cls.WEBSOCKET_URL: errors.append("DERETH_TRACKER_WS_URL environment variable is required") try: cls.COMMON_RARE_CHANNEL_ID = int(cls.COMMON_RARE_CHANNEL_ID) except (ValueError, TypeError): errors.append("COMMON_RARE_CHANNEL_ID must be a valid integer") try: cls.GREAT_RARE_CHANNEL_ID = int(cls.GREAT_RARE_CHANNEL_ID) except (ValueError, TypeError): errors.append("GREAT_RARE_CHANNEL_ID must be a valid integer") return errors @classmethod def log_config(cls, logger): """Log current configuration (excluding sensitive data).""" logger.info("🔧 Discord Rare Monitor Configuration:") logger.info(f" WebSocket URL: {cls.WEBSOCKET_URL}") logger.info(f" Common Rare Channel ID: {cls.COMMON_RARE_CHANNEL_ID}") logger.info(f" Great Rare Channel ID: {cls.GREAT_RARE_CHANNEL_ID}") logger.info(f" Log Level: {cls.LOG_LEVEL}") logger.info(f" Common Keywords: {cls.COMMON_RARE_KEYWORDS}") logger.info(f" Discord Token: {'✅ Set' if cls.DISCORD_TOKEN else '❌ Not Set'}") # Global config instance config = Config()