import os from dotenv import load_dotenv load_dotenv() class Config: """Application configuration loaded from environment variables.""" # Discord configuration DISCORD_TOKEN = os.getenv('DISCORD_TOKEN') CHANNEL_ID = os.getenv('CHANNEL_ID') CHANNEL_IDS = [id.strip() for id in os.getenv('CHANNEL_ID', '').split(',') if id.strip()] COMMAND_PREFIX = os.getenv('COMMAND_PREFIX', '!') STARTUP_ANNOUNCEMENT = os.getenv('STARTUP_ANNOUNCEMENT', '') STARTUP_ANNOUNCEMENT_CHANNEL_ID = os.getenv('STARTUP_ANNOUNCEMENT_CHANNEL_ID', '') # Stock configuration PRIMARY_TICKER = os.getenv('PRIMARY_TICKER', 'PYPL') STOCK_API_PROVIDER = os.getenv('STOCK_API_PROVIDER', 'finnhub') # 'yahoo' or 'finnhub' FINNHUB_API_KEY = os.getenv('FINNHUB_API_KEY') # Earnings calendar configuration EARNINGS_MIN_MARKET_CAP_BILLIONS = float(os.getenv('EARNINGS_MIN_MARKET_CAP_BILLIONS', '10')) EARNINGS_SCHEDULE_DAY = os.getenv('EARNINGS_SCHEDULE_DAY', 'sun') EARNINGS_SCHEDULE_HOUR = int(os.getenv('EARNINGS_SCHEDULE_HOUR', '18')) # Scheduling configuration UPDATE_INTERVAL_HOURS = int(os.getenv('UPDATE_INTERVAL_HOURS', '1')) @classmethod def validate(cls) -> bool: """ Validate that required configuration values are present. Returns: True if configuration is valid, False otherwise """ if not cls.DISCORD_TOKEN: print("ERROR: DISCORD_TOKEN not set in environment") return False if not cls.CHANNEL_ID: print("ERROR: CHANNEL_ID not set in environment") return False if not cls.CHANNEL_IDS: print("ERROR: No valid channel IDs found in CHANNEL_ID") return False try: for channel_id in cls.CHANNEL_IDS: int(channel_id) except ValueError: print("ERROR: CHANNEL_ID must contain numeric Discord channel IDs (comma-separated)") return False if cls.STOCK_API_PROVIDER == 'finnhub' and not cls.FINNHUB_API_KEY: print("ERROR: FINNHUB_API_KEY not set in environment (required when STOCK_API_PROVIDER=finnhub)") return False return True