24/7-Raum

24/7-Referenzraum

Der komplette Fußball-Bot, nur mit der Bibliothek gebaut. Nutze ihn als Grundlage für deinen eigenen.

Das Repository enthält apps/bonk-room, einen Fußball-Bot, der 24 Stunden am Tag läuft. Er wurde nur mit der Bibliothek bonktools gebaut und dient daher als praktisches Beispiel für alles, was die Bibliothek bietet: Sitzung mit Reconnect, Events, Teams, Sperre, Anti-AFK und Partie-Synchronisation.

Was er tut

  • Erstellt und betreibt einen Fußballraum und erstellt ihn neu, wenn er ausfällt.
  • Bildet die Teams automatisch, immer gleich groß.
  • Wählt Kapitäne und lässt den Kapitän die Spieler wählen, indem er die Nummer im Chat tippt.
  • Rotiert den Champion am Ende jeder Partie: Der Sieger bleibt Blau.
  • Behandelt AFK (!afk und Erkennung durch Inaktivität) und wählt niemals jemanden, der AFK ist.
  • Sperrt die Teams: Nur der Bot verschiebt Spieler.
  • Zeigt die Partie denen, die später beitreten, ohne sie neu zu starten.

Die vollständigen Regeln stehen unter Teams, Kapitäne und Auswahl.

So startest du ihn

bash
git clone https://github.com/brenoluizdev/BonkTools-Core-repo.git
cd BonkTools-Core-repo
pnpm install
pnpm --filter @bonktools/core build

cd apps/bonk-room
cp .env.example .env                        # BONK_USERNAME und BONK_PASSWORD ausfüllen
cp bonk-room.example.json bonk-room.json    # Name, Modus und Runden des Raums anpassen
pnpm dev

Der Raumlink erscheint im Log (sala ativa).

Umgebungsvariablen

VariableBeschreibung
BONK_USERNAME, BONK_PASSWORDDas bonk.io-Konto, das den Raum hostet
BONK_GAMEMODEfootball (Standard), classic, arrows, death arrows, grapple oder vtol
BONK_MAXTEAMSIZESpieler pro Team (1 = 1v1, 2 = 2v2...). Grundlage aller Team-Berechnungen.
BONK_ROUNDSRunden pro Partie
BONK_INITIAL_STATEErsatz-IS-Blob (siehe Partien, IS-Blob und Zuschauer)
BONK_BLOB_CACHE_PATHPfad des Blob-Caches pro Karte
NODE_ENVdevelopment (formatierte Logs) oder production (JSON, ideal für PM2)

Raumkonfiguration

bonk-room.json:

json
{
  "room": {
    "id": "my-room",
    "name": "My Bonk Room",
    "password": "",
    "maxPlayers": 6,
    "mode": "b",
    "rounds": 3,
    "hidden": true,
    "map": "<LZ-String-Blob der Karte>"
  },
  "throttle": {
    "maxConcurrentRooms": 1,
    "roomCreationDelayMs": 3000,
    "roomCreationJitterMs": 2000
  },
  "initialStates": { "2": "<IS blob 1v1>", "4": "<IS blob 2v2>" }
}

Code-Struktur

DateiAufgabe
src/index.tsLogger, Konfiguration, BonkSession mit Reconnect
src/example-bot.tsExampleBot: verbindet die Raum-Events mit dem Controller
src/pick/PickController.tsTeams, Kapitäne, Auswahl, Rotation, AFK und Befehle
src/config.tsValidierung (zod) der Konfiguration und Lesen der Umgebung
examples/antiAfk.tsAnti-AFK in ~10 Zeilen nur mit der Bibliothek

Tests

bash
pnpm --filter bonk-room test

Neben den Szenarien für den Team-Ablauf und das AFK gibt es einen Fuzz mit Hunderten zufälliger Abfolgen von Beitritten, Austritten, AFK und Auswahlen. Bei jedem Partiestart prüft er, dass die Teams gleich groß sind, maxTeamSize nie überschreiten und niemand AFK auf dem Feld steht.

Produktion

Starte mit NODE_ENV=production für JSON-Logs und nutze einen Prozessmanager (PM2, systemd oder einen Container), der den Prozess neu startet, falls er stirbt. BonkSession kümmert sich bereits darum, den Raum neu zu erstellen, wenn er ausfällt; der Manager kümmert sich um den Prozess.