zxc23/dcss-scoreboard

View on GitHub
loader.py

Summary

Maintainability
A
1 hr
Test Coverage
#!/usr/bin/env python3
"""CLI to run dcss-scoreboard."""

import argparse
import sys
import os
import time

import scoreboard.log_import
import scoreboard.orm
import scoreboard.scoring
import scoreboard.write_website


def error(msg: str) -> None:
    """Print an error and exit."""
    print(msg, file=sys.stderr)
    sys.exit(1)


def read_commandline() -> argparse.Namespace:
    """Parse command line args and validate them."""
    description = "Run DCSS Scoreboard."
    epilog = "Specify DB_USER/DB_PASS environment variables if required."
    parser = argparse.ArgumentParser(description=description, epilog=epilog)
    parser.add_argument(
        "--urlbase",
        default=None,
        help="Override website base URL. Default: file:///CWD",
    )
    parser.add_argument(
        "--database-path",
        default="database.db3",
        help="Database path (for sqlite). Default: database.db3",
    )
    parser.add_argument(
        "--rebuild-player-pages",
        action="store_true",
        help="Re-write all player pages for the website.",
    )
    parser.add_argument(
        "--players",
        nargs="+",
        metavar="PLAYER",
        help="Re-write the specified player pages.",
    )
    parser.add_argument(
        "--extra-player-pages",
        metavar="NUM",
        default=0,
        type=int,
        help="(Re-)Generate pages for an additional NUM players (least recently updated first)",
    )

    args = parser.parse_args()
    return args


def main() -> None:
    """Run CLI."""
    args = read_commandline()

    # XXX SUPER HACK
    # Wait a few seconds so that the postgres container has time to start up.
    time.sleep(5)
    scoreboard.orm.setup_database()

    if os.environ.get('SCOREBOARD_SKIP_IMPORT') == None:
        print("Loading latest games")
        scoreboard.log_import.load_logfiles(api_url=os.environ['SCOREBOARD_GAME_API'])

    if os.environ.get('SCOREBOARD_SKIP_SCORING') == None:
        print("Scoring games")
        players = scoreboard.scoring.score_games()
    else:
        players = None

    if os.environ.get('SCOREBOARD_SKIP_WEBSITE') == None:
        if args.rebuild_player_pages:
            players = None
        if args.players:
            if players:
                players.update(args.players)
            else:
                players = args.players
        scoreboard.write_website.write_website(
            urlbase=args.urlbase,
            players=players,
            extra_player_pages=args.extra_player_pages,
        )


if __name__ == "__main__":
    main()