Objekt-Anzahl stufenweise, Ban-CLI, Live-Abbruch bei privat

- Objekt-Anzahl waechst ab STEP_START zusaetzlich schrittweise (Deckel 100),
  Mindestgroesse leicht gesenkt fuer dichte Felder
- Ban per CLI: ban/unban/bans (namensbasiert), gebannte Namen koennen keinen Score
  eintragen (/api/score -> 403) und werden beim Bannen aus der Rangliste entfernt
- Privat-Modus bricht laufende Spiele ab: Client pollt /api/status und laedt neu,
  sobald Spielen auf dem Pfad nicht mehr erlaubt ist (geheimer Pfad wird nicht verraten)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Guido
2026-08-05 12:09:47 +02:00
parent 53cdfc7346
commit 8dbff16cec
4 changed files with 144 additions and 2 deletions

View File

@@ -10,6 +10,7 @@
import { readLeaderboard, buildBoards, deletePlayer, clearAll, clearToday } from './leaderboardStore.js';
import { getMode, setMode } from './modeStore.js';
import { banPlayer, unbanPlayer, readBans } from './banStore.js';
const [, , cmd, ...rest] = process.argv;
const arg = rest.join(' ').trim();
@@ -51,6 +52,34 @@ switch (cmd) {
break;
}
case 'ban': {
if (!arg) {
console.error('Bitte einen Namen angeben: node server/admin.js ban "Name"');
process.exit(1);
}
const added = banPlayer(arg);
const removed = deletePlayer(arg); // bestehende Eintraege gleich entfernen
if (added) console.log(`🚫 "${arg}" gebannt (kann keinen Score mehr eintragen).`);
else console.log(`"${arg}" war bereits gebannt.`);
if (removed) console.log(` ${removed} bestehende(r) Eintrag/Eintraege entfernt.`);
break;
}
case 'unban': {
if (!arg) {
console.error('Bitte einen Namen angeben: node server/admin.js unban "Name"');
process.exit(1);
}
console.log(unbanPlayer(arg) ? `✅ "${arg}" entsperrt.` : `"${arg}" war nicht gebannt.`);
break;
}
case 'bans': {
const bans = readBans();
console.log(bans.length ? '🚫 Gebannt:\n' + bans.map((b) => ` - ${b}`).join('\n') : 'Keine Bans.');
break;
}
case 'mode': {
const sub = (rest[0] || '').toLowerCase();
if (sub === 'public') {
@@ -78,6 +107,11 @@ Rangliste:
node server/admin.js clear-today nur die heutige Rangliste leeren
node server/admin.js clear-all komplette Rangliste leeren
Bannen (namensbasiert):
node server/admin.js ban "<name>" Spieler sperren (+ Eintraege entfernen)
node server/admin.js unban "<name>" Sperre aufheben
node server/admin.js bans gebannte Namen anzeigen
Betriebsmodus (Spiel oeffentlich / privat):
node server/admin.js mode aktuellen Modus anzeigen
node server/admin.js mode public Spiel oeffentlich unter "/"