Files
discord-stock-bot/config.py
Michael Simard 3040ab3cc1 Add earnings calendar feature with command and scheduled delivery
Implement comprehensive earnings calendar functionality that displays upcoming earnings for major companies (market cap > $10B). Feature includes both manual command access and automated weekly delivery.

Key additions:
- Finnhub API integration for earnings calendar data with market cap filtering
- Discord embed formatting grouped by day with EPS/revenue estimates
- !earnings command for manual queries (current or next week)
- Weekly scheduled task (Sunday 6PM ET) for automatic delivery
- Configuration options for market cap threshold and schedule timing

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 23:18:00 -06:00

63 lines
2.2 KiB
Python

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