diff --git a/l4d2web/routes/page_routes.py b/l4d2web/routes/page_routes.py index 9fc9f37..903270d 100644 --- a/l4d2web/routes/page_routes.py +++ b/l4d2web/routes/page_routes.py @@ -1,6 +1,7 @@ import json +from datetime import UTC, datetime, timedelta -from flask import Blueprint, Response, redirect, render_template, request +from flask import Blueprint, Response, current_app, redirect, render_template, request from sqlalchemy import func, select, update from l4d2web.auth import current_user, require_admin, require_login @@ -12,6 +13,7 @@ from l4d2web.models import ( Overlay, OverlayWorkshopItem, Server, + ServerLiveState, User, WorkshopItem, ) @@ -154,6 +156,42 @@ def servers_page() -> str: select(BlueprintModel).where(BlueprintModel.user_id == user.id).order_by(BlueprintModel.name) ).all() + stale_seconds = current_app.config.get("LIVE_STATE_STALE_SECONDS", 30) + cutoff = datetime.now(UTC).replace(tzinfo=None) - timedelta(seconds=stale_seconds) + + server_ids = [s.id for s, _bp in rows] + latest_rows: dict[int, ServerLiveState] = {} + if server_ids: + subq = ( + select( + ServerLiveState.server_id, + func.max(ServerLiveState.started_at).label("mx"), + ) + .where(ServerLiveState.server_id.in_(server_ids)) + .group_by(ServerLiveState.server_id) + .subquery() + ) + sls_rows = db.scalars( + select(ServerLiveState).join( + subq, + (ServerLiveState.server_id == subq.c.server_id) + & (ServerLiveState.started_at == subq.c.mx), + ) + ).all() + for r in sls_rows: + latest_rows[r.server_id] = r + + live_state_by_server: dict[int, dict] = {} + for sid, row in latest_rows.items(): + fresh = row.last_seen_at >= cutoff + live_state_by_server[sid] = { + "fresh": fresh, + "players": row.players, + "max_players": row.max_players, + "map": row.map, + "hibernating": row.hibernating, + } + prefill_blueprint_id: int | None = None raw_prefill = request.args.get("blueprint_id") if raw_prefill: @@ -169,6 +207,7 @@ def servers_page() -> str: rows=rows, blueprints=blueprints, prefill_blueprint_id=prefill_blueprint_id, + live_state_by_server=live_state_by_server, ) diff --git a/l4d2web/templates/servers.html b/l4d2web/templates/servers.html index fdc1a8f..ba4974b 100644 --- a/l4d2web/templates/servers.html +++ b/l4d2web/templates/servers.html @@ -13,18 +13,30 @@ {% endif %}
| Name | Port | Blueprint | Desired | Actual | |
|---|---|---|---|---|---|
| Name | Port | Blueprint | Desired | Actual | Live |
| {{ server.name }} | {{ server.port }} | {{ blueprint.name }} | {{ server.desired_state }} | {{ server.actual_state }} | ++ {% if server.actual_state != 'running' %} + — + {% elif ls is none or not ls.fresh %} + ? + {% elif ls.hibernating %} + {{ ls.players }}/{{ ls.max_players }} · idle · {{ ls.map }} + {% else %} + {{ ls.players }}/{{ ls.max_players }} · {{ ls.map }} + {% endif %} + |
| No servers configured. | |||||
| No servers configured. | |||||