diff --git a/backend/app.py b/backend/app.py index b857724..a65a618 100644 --- a/backend/app.py +++ b/backend/app.py @@ -1939,3 +1939,117 @@ def hardcore_leaderboard_points_combined(): return jsonify(rows[:100]) # --- end Hardcore stats aggregator ------------------------------------------- + + +@app.get("/server-status") +@app.get("/api/server-status") +def public_server_status(): + import json + import os + import urllib.parse + import urllib.request + + prometheus_url = os.environ.get("PROMETHEUS_URL", "http://5.0.0.20:9090").rstrip("/") + + def prom_value(query): + url = prometheus_url + "/api/v1/query?" + urllib.parse.urlencode({"query": query}) + try: + with urllib.request.urlopen(url, timeout=2.5) as resp: + data = json.loads(resp.read().decode("utf-8")) + except Exception: + return 0 + + if data.get("status") != "success": + return 0 + + total = 0.0 + for result in data.get("data", {}).get("result", []): + value = result.get("value", [None, "0"])[1] + try: + total += float(value) + except (TypeError, ValueError): + pass + + return int(total) + + def q(metric, labels): + label_text = ",".join(f'{k}="{v}"' for k, v in labels.items()) + return f'sum({metric}{{{label_text}}}) or vector(0)' + + def newserv(region, service, ship, version): + return prom_value(q("pso_newserv_clients_connected", { + "region": region, + "service": service, + "ship": ship, + "version": version, + })) + + def adhoc(region, game): + return prom_value(q("psppeeps_adhoc_connected_clients_by_product", { + "region": region, + "service": f"{region}-psppeeps-adhoc", + "ship": "psp", + "game": game, + })) + + us = { + "alis_v2": newserv("us", "us-newserv-live", "live", "v2"), + "alis_v3": newserv("us", "us-newserv-live", "live", "v3"), + "alis_bb": newserv("us", "us-newserv-live", "live", "v4"), + "abion_hcbb": newserv("us", "us-newserv-hardcore", "hardcore", "v4"), + "adhoc_psp1": adhoc("us", "psp1"), + "adhoc_psp2i": adhoc("us", "psp2i"), + } + + eu = { + "palma_v2": newserv("eu", "eu-newserv-live", "live", "v2"), + "palma_v3": newserv("eu", "eu-newserv-live", "live", "v3"), + "palma_bb": newserv("eu", "eu-newserv-live", "live", "v4"), + "aiedo_hcbb": newserv("eu", "eu-newserv-hardcore", "hardcore", "v4"), + "adhoc_psp1": adhoc("eu", "psp1"), + "adhoc_psp2i": adhoc("eu", "psp2i"), + } + + us_total = sum(us.values()) + eu_total = sum(eu.values()) + + return jsonify({ + "servers": [ + { + "label": "US Server", + "players": us_total, + "ships": [ + {"label": "Alis", "rows": [ + {"label": "V2", "players": us["alis_v2"]}, + {"label": "V3", "players": us["alis_v3"]}, + {"label": "BB", "players": us["alis_bb"]}, + ]}, + {"label": "Abion", "rows": [ + {"label": "HC/BB", "players": us["abion_hcbb"]}, + ]}, + {"label": "AdHoc-US", "rows": [ + {"label": "PSP1", "players": us["adhoc_psp1"]}, + {"label": "PSP2i", "players": us["adhoc_psp2i"]}, + ]}, + ], + }, + { + "label": "EU Server", + "players": eu_total, + "ships": [ + {"label": "Palma", "rows": [ + {"label": "V2", "players": eu["palma_v2"]}, + {"label": "V3", "players": eu["palma_v3"]}, + {"label": "BB", "players": eu["palma_bb"]}, + ]}, + {"label": "Aiedo", "rows": [ + {"label": "HC/BB", "players": eu["aiedo_hcbb"]}, + ]}, + {"label": "AdHoc-EU", "rows": [ + {"label": "PSP1", "players": eu["adhoc_psp1"]}, + {"label": "PSP2i", "players": eu["adhoc_psp2i"]}, + ]}, + ], + }, + ], + }) diff --git a/site/home-leaderboard.js b/site/home-leaderboard.js index c5c5e3f..324d74c 100644 --- a/site/home-leaderboard.js +++ b/site/home-leaderboard.js @@ -65,7 +65,7 @@ return; } - const top = rows.slice(0, 5); + const top = rows.slice(0, 10); if (!top.length) { list.innerHTML = `