# Native modules import logging import os from typing import Dict, Any, Optional # Import the AuthHandler class from auth import AuthHandler # Import the SessionManager class from session_manager import SessionManager # Import the Booker class from booker import Booker # Import the SessionNotifier class from session_notifier import SessionNotifier # Load environment variables from dotenv import load_dotenv load_dotenv() # Configuration USERNAME = os.environ.get("CROSSFIT_USERNAME") PASSWORD = os.environ.get("CROSSFIT_PASSWORD") if not all([USERNAME, PASSWORD]): raise ValueError("Missing environment variables: CROSSFIT_USERNAME and/or CROSSFIT_PASSWORD") class CrossFitBooker: """ A simple orchestrator class for the CrossFit booking system. This class is responsible for initializing and coordinating the other components (AuthHandler, SessionManager, and Booker) but does not implement the actual functionality. """ def __init__(self) -> None: """ Initialize the CrossFitBooker with necessary components. """ # Initialize the AuthHandler with credentials from environment variables self.auth_handler = AuthHandler(USERNAME, PASSWORD) # Initialize the SessionManager with the AuthHandler self.session_manager = SessionManager(self.auth_handler) # Initialize the SessionNotifier with credentials from environment variables email_credentials = { "from": os.environ.get("EMAIL_FROM"), "to": os.environ.get("EMAIL_TO"), "password": os.environ.get("EMAIL_PASSWORD") } telegram_credentials = { "token": os.environ.get("TELEGRAM_TOKEN"), "chat_id": os.environ.get("TELEGRAM_CHAT_ID") } # Get notification settings from environment variables enable_email = os.environ.get("ENABLE_EMAIL_NOTIFICATIONS", "true").lower() in ("true", "1", "yes") enable_telegram = os.environ.get("ENABLE_TELEGRAM_NOTIFICATIONS", "true").lower() in ("true", "1", "yes") self.notifier = SessionNotifier( email_credentials, telegram_credentials, enable_email=enable_email, enable_telegram=enable_telegram ) # Initialize the Booker with the AuthHandler and SessionNotifier self.booker = Booker(self.auth_handler, self.notifier) def run(self) -> None: """ Start the booking process. This method initiates the booking process by running the Booker's main execution loop. """ import asyncio asyncio.run(self.booker.run())