Files
snake-python/server/bootstrap.py
T

71 lines
2.4 KiB
Python

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'),
}