from __future__ import annotations import argparse import os from app import create_app from models import db from sockets import socketio, start_event_monitor from udp_listener import start_udp_listener def _ensure_sqlite_schema(app) -> None: """Very small schema migration helper for SQLite dev deployments.""" uri: str = app.config.get("SQLALCHEMY_DATABASE_URI", "") if not uri.startswith("sqlite:"): return import sqlite3 path = uri.split("///", 1)[-1] try: conn = sqlite3.connect(path) # Global settings table (used for e.g. idle fallback image) conn.execute( "CREATE TABLE IF NOT EXISTS app_settings (" "key VARCHAR(64) PRIMARY KEY, " "value VARCHAR(255) NOT NULL" ")" ) conn.commit() finally: try: conn.close() except Exception: pass def main() -> None: parser = argparse.ArgumentParser(description="SyncPlayer server") parser.add_argument("command", nargs="?", default="run", choices=["run", "init-db"], help="Command") parser.add_argument("--host", default=os.environ.get("HOST", "0.0.0.0")) parser.add_argument("--port", type=int, default=int(os.environ.get("PORT", "5000"))) args = parser.parse_args() app = create_app() with app.app_context(): db.create_all() _ensure_sqlite_schema(app) if args.command == "init-db": with app.app_context(): db.create_all() _ensure_sqlite_schema(app) print("Database initialized") return # Start UDP listener in background start_udp_listener(app) # Monitor trigger expiry (clears in-memory state when end_time passes) start_event_monitor(app) # Prefer gevent on Windows/Python 3.14+. (eventlet is not compatible there) socketio.run(app, host=args.host, port=args.port) if __name__ == "__main__": main()