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 (
!afkund 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
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 devDer Raumlink erscheint im Log (sala ativa).
Umgebungsvariablen
| Variable | Beschreibung |
|---|---|
BONK_USERNAME, BONK_PASSWORD | Das bonk.io-Konto, das den Raum hostet |
BONK_GAMEMODE | football (Standard), classic, arrows, death arrows, grapple oder vtol |
BONK_MAXTEAMSIZE | Spieler pro Team (1 = 1v1, 2 = 2v2...). Grundlage aller Team-Berechnungen. |
BONK_ROUNDS | Runden pro Partie |
BONK_INITIAL_STATE | Ersatz-IS-Blob (siehe Partien, IS-Blob und Zuschauer) |
BONK_BLOB_CACHE_PATH | Pfad des Blob-Caches pro Karte |
NODE_ENV | development (formatierte Logs) oder production (JSON, ideal für PM2) |
Raumkonfiguration
bonk-room.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
| Datei | Aufgabe |
|---|---|
src/index.ts | Logger, Konfiguration, BonkSession mit Reconnect |
src/example-bot.ts | ExampleBot: verbindet die Raum-Events mit dem Controller |
src/pick/PickController.ts | Teams, Kapitäne, Auswahl, Rotation, AFK und Befehle |
src/config.ts | Validierung (zod) der Konfiguration und Lesen der Umgebung |
examples/antiAfk.ts | Anti-AFK in ~10 Zeilen nur mit der Bibliothek |
Tests
pnpm --filter bonk-room testNeben 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.