Access denied.

'; return; } $days = isset($_GET['days']) && ctype_digit((string)$_GET['days']) ? max(1, min(30, (int)$_GET['days'])) : PushProtection::WINDOW_DAYS; $hours = isset($_GET['hours']) && ctype_digit((string)$_GET['hours']) ? max(1, min(168, (int)$_GET['hours'])): PushProtection::HOURS_ALLOWED; $only = isset($_GET['only']) && in_array($_GET['only'], ['all','over','flagged'], true) ? $_GET['only'] : 'all'; $data = PushProtection::dashboard(['days' => $days, 'hours' => $hours, 'only' => $only]); $rows = $data['rows']; function pp_num($n) { return number_format((int)$n); } ?>

Push Protection Dashboard

Per-player 7-day resource balance (received from other players) versus an automatic limit derived from the player's hourly production (h of production per window). WW villages and artefact villages are flagged as supply exceptions. Set a manual override to exempt a player (WW / trusted) or give a custom cap. Nothing is blocked automatically — this is visibility & control for a human moderator.

Window: last days  |  limit = h × hourly production  |  player shown
No inter-player transfers recorded in this window yet.
The 7-day balance fills in as merchant deliveries between different players are processed after this feature is deployed.
Player Villages / Pop Prod/h Received (7d) Limit Usage Override
# / from unlimited' : pp_num($r['eff_limit']); ?>
%
note: