"""Tornado application entry point and route configuration.""" import os import click import tornado.ioloop import tornado.web from db import get_engine, get_session_factory, init_db from handlers.main import MainHandler from handlers.game import GameHandler from handlers.howtoplay import HowToPlayHandler from handlers.about import AboutHandler from handlers.scoreboard import ScoreboardPageHandler from handlers.api import ( CategoriesHandler, NewGameHandler, GameStateHandler, GuessHandler, ScoreboardAPIHandler, ) BASE_DIR = os.path.dirname(os.path.abspath(__file__)) def make_app(session_factory=None, debug=False, prefix="/"): """Create and configure the Tornado application. Args: session_factory: SQLAlchemy session factory. If None, API endpoints that require a database will not work. debug: Enable debug mode (auto-reload, stack traces). prefix: URL prefix for reverse-proxy hosting (e.g. ``/wordsearch/``). Returns: A configured ``tornado.web.Application`` instance. """ return tornado.web.Application( [ (r"/", MainHandler), (r"/game", GameHandler), (r"/howtoplay", HowToPlayHandler), (r"/about", AboutHandler), (r"/scoreboard", ScoreboardPageHandler), (r"/api/categories", CategoriesHandler), (r"/api/scoreboard", ScoreboardAPIHandler), (r"/api/game/new", NewGameHandler), (r"/api/game/([^/]+)", GameStateHandler), (r"/api/game/([^/]+)/guess", GuessHandler), ], template_path=os.path.join(BASE_DIR, "templates"), static_path=os.path.join(BASE_DIR, "static"), session_factory=session_factory, base_url=prefix, debug=debug, ) @click.command() @click.option("--port", default=8888, type=int, help="Port to listen on.") @click.option("--debug", is_flag=True, help="Enable debug mode.") @click.option( "--prefix", default="/", help="URL prefix for reverse-proxy hosting (e.g. /wordsearch/).", ) def main(port, debug, prefix): """Start the web server.""" if not prefix.startswith("/"): prefix = "/" + prefix if not prefix.endswith("/"): prefix = prefix + "/" engine = get_engine() init_db(engine) session_factory = get_session_factory(engine) app = make_app(session_factory=session_factory, debug=debug, prefix=prefix) app.listen(port) print(f"Server started at http://localhost:{port}") tornado.ioloop.IOLoop.current().start() if __name__ == "__main__": main()