"""Run the Snake game server.""" import asyncio import argparse from pathlib import Path from src.server.game_server import GameServer from src.server.http_server import HTTPServer from src.shared.constants import DEFAULT_HOST, DEFAULT_PORT, DEFAULT_WS_PORT, DEFAULT_UDP_PORT, DEFAULT_HTTP_PORT async def main() -> None: """Run the server with command line arguments.""" parser = argparse.ArgumentParser(description="Run the Snake game server") parser.add_argument( "--host", default=DEFAULT_HOST, help=f"Host address to bind to (default: {DEFAULT_HOST})", ) parser.add_argument( "--port", type=int, default=DEFAULT_PORT, help=f"TCP port number (default: {DEFAULT_PORT})", ) parser.add_argument( "--ws-port", type=int, default=DEFAULT_WS_PORT, help=f"WebSocket port (default: {DEFAULT_WS_PORT}, 0 to disable)", ) parser.add_argument( "--udp-port", type=int, default=DEFAULT_UDP_PORT, help=f"UDP port (default: {DEFAULT_UDP_PORT}, 0 to disable)", ) parser.add_argument( "--http-port", type=int, default=DEFAULT_HTTP_PORT, help=f"HTTP server port (default: {DEFAULT_HTTP_PORT}, 0 to disable)", ) parser.add_argument( "--web-dir", default="web", help="Directory containing web client files (default: web)", ) parser.add_argument( "--name", default="Snake Server", help="Server name for discovery (default: Snake Server)", ) parser.add_argument( "--no-discovery", action="store_true", help="Disable multicast discovery beacon", ) parser.add_argument( "--no-websocket", action="store_true", help="Disable WebSocket server", ) parser.add_argument( "--no-http", action="store_true", help="Disable HTTP server (for production with external web server)", ) args = parser.parse_args() # Determine WebSocket port ws_port = None if args.no_websocket or args.ws_port == 0 else args.ws_port # Determine UDP port (False means disabled, None means use default) udp_port = False if args.udp_port == 0 else args.udp_port # Create game server server = GameServer( host=args.host, port=args.port, server_name=args.name, enable_discovery=not args.no_discovery, ws_port=ws_port, udp_port=udp_port, ) # Start HTTP server if enabled http_server = None if not args.no_http and args.http_port > 0: web_dir = Path(args.web_dir) if web_dir.exists(): # Use same host as game server for HTTP http_server = HTTPServer(web_dir, args.http_port, args.host) await http_server.start() else: print(f"Warning: Web directory '{web_dir}' not found. HTTP server disabled.") # Start game server try: await server.start() finally: if http_server: await http_server.stop() if __name__ == "__main__": asyncio.run(main())