from typing import TypedDict from pathlib import Path import os from server.Server import Server class RunConfig(TypedDict): host: str port: int debug: bool def env_bool(name:str, default:bool=False) -> bool: value = os.environ.get(name) if value is None: return default return value.lower() in {'1', 'true', 'yes', 'on'} def build_server_from_env(default_snake_type:str) -> Server: data_path = str(Path(__file__).resolve().parent.parent) game_state_backend = os.environ.get('GAME_STATE_BACKEND', 'memory') game_state_redis_url = os.environ.get('GAME_STATE_REDIS_URL', 'redis://localhost:6379/0') game_state_ttl_sec = int(os.environ.get('GAME_STATE_TTL_SEC', '900')) metrics_backend = os.environ.get('METRICS_BACKEND', None) if metrics_backend is None: metrics_backend = ('redis' if game_state_backend.strip().lower() == 'redis' else 'memory') metrics_redis_url = os.environ.get('METRICS_REDIS_URL', game_state_redis_url) metrics_ttl_sec_raw = os.environ.get('METRICS_TTL_SEC', None) if metrics_ttl_sec_raw is None: metrics_ttl_sec = (game_state_ttl_sec if metrics_backend.strip().lower() == 'redis' else None) else: metrics_ttl_sec = int(metrics_ttl_sec_raw) gameplay_db_enabled = env_bool('GAMEPLAY_DB_ENABLED', True) gameplay_db_path = os.environ.get( 'GAMEPLAY_DB_PATH', os.path.join(data_path, 'data', 'database', 'gameplay.sqlite3'), ) gameplay_db_busy_timeout_ms = int(os.environ.get('GAMEPLAY_DB_BUSY_TIMEOUT_MS', '5000')) server = Server( data_path=data_path, snake_type=os.environ.get('SNAKE', default_snake_type), storage_type=os.environ.get('STORAGE', 'LocalStorage'), debug=env_bool('DEBUG_SERVER'), check_tls_security=False, game_state_backend=game_state_backend, game_state_redis_url=game_state_redis_url, game_state_ttl_sec=game_state_ttl_sec, game_state_local_cache=env_bool('GAME_STATE_LOCAL_CACHE', default=True), metrics_backend=metrics_backend, metrics_redis_url=metrics_redis_url, metrics_ttl_sec=metrics_ttl_sec, gameplay_db_enabled=gameplay_db_enabled, gameplay_db_path=gameplay_db_path, gameplay_db_busy_timeout_ms=gameplay_db_busy_timeout_ms, ) if env_bool('STORE_GAME_HISTORY'): server.enable_store_game_state() return server def build_run_config() -> RunConfig: return { 'host': os.environ.get('HOST', '0.0.0.0'), 'port': int(os.environ.get('PORT', '8000')), 'debug': env_bool('DEBUG'), }