From 3235863f2e759d7eeeaabdfba4edd96de42cd12b Mon Sep 17 00:00:00 2001 From: black-sliver <59490463+black-sliver@users.noreply.github.com> Date: Tue, 10 Mar 2026 18:57:04 +0000 Subject: [PATCH] WebHost: add stats show cli command (#5995) Usage: flask -A "WebHost:get_app()" stats show Currently only shows sum and top10 biggest games packages. --- WebHostLib/__init__.py | 2 ++ WebHostLib/cli/__init__.py | 8 ++++++++ WebHostLib/cli/stats.py | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 WebHostLib/cli/__init__.py create mode 100644 WebHostLib/cli/stats.py diff --git a/WebHostLib/__init__.py b/WebHostLib/__init__.py index f856eea4c5..d10c17bff8 100644 --- a/WebHostLib/__init__.py +++ b/WebHostLib/__init__.py @@ -11,6 +11,7 @@ from pony.flask import Pony from werkzeug.routing import BaseConverter from Utils import title_sorted, get_file_safe_name +from .cli import CLI UPLOAD_FOLDER = os.path.relpath('uploads') LOGS_FOLDER = os.path.relpath('logs') @@ -64,6 +65,7 @@ app.config["ASSET_RIGHTS"] = False cache = Cache() Compress(app) +CLI(app) def to_python(value: str) -> uuid.UUID: diff --git a/WebHostLib/cli/__init__.py b/WebHostLib/cli/__init__.py new file mode 100644 index 0000000000..a210e1475c --- /dev/null +++ b/WebHostLib/cli/__init__.py @@ -0,0 +1,8 @@ +from flask import Flask + + +class CLI: + def __init__(self, app: Flask) -> None: + from .stats import stats_cli + + app.cli.add_command(stats_cli) diff --git a/WebHostLib/cli/stats.py b/WebHostLib/cli/stats.py new file mode 100644 index 0000000000..85edfb4348 --- /dev/null +++ b/WebHostLib/cli/stats.py @@ -0,0 +1,36 @@ +import click +from flask.cli import AppGroup +from pony.orm import raw_sql + +from Utils import format_SI_prefix + +stats_cli = AppGroup("stats") + + +@stats_cli.command("show") +def show() -> None: + from pony.orm import db_session, select + + from WebHostLib.models import GameDataPackage + + total_games_package_count: int = 0 + total_games_package_size: int + top_10_package_sizes: list[tuple[int, str]] = [] + + with db_session: + data_length = raw_sql("LENGTH(data)") + data_length_desc = raw_sql("LENGTH(data) DESC") + data_length_sum = raw_sql("SUM(LENGTH(data))") + total_games_package_count = GameDataPackage.select().count() + total_games_package_size = select(data_length_sum for _ in GameDataPackage).first() # type: ignore + top_10_package_sizes = list( + select((data_length, dp.checksum) for dp in GameDataPackage) # type: ignore + .order_by(lambda _, _2: data_length_desc) + .limit(10) + ) + + click.echo(f"Total number of games packages: {total_games_package_count}") + click.echo(f"Total size of games packages: {format_SI_prefix(total_games_package_size, power=1024)}B") + click.echo(f"Top {len(top_10_package_sizes)} biggest games packages:") + for size, checksum in top_10_package_sizes: + click.echo(f" {checksum}: {size:>8d}")