Sala 24/7
Sala 24/7 de referencia
El bot de fútbol completo, construido solo con la biblioteca. Úsalo como base para el tuyo.
El repositorio incluye apps/bonk-room, un bot de fútbol que funciona las 24 horas del día. Está hecho solo con la biblioteca bonktools, así que sirve como ejemplo práctico de todo lo que ofrece: sesión con reconexión, eventos, equipos, bloqueo, anti-AFK y sincronización de partida.
Qué hace
- Crea y mantiene una sala de fútbol, recreándola si cae.
- Monta los equipos automáticamente, siempre con el mismo tamaño.
- Elige capitanes y deja que el capitán escoja a los jugadores escribiendo el número en el chat.
- Rota al campeón al final de cada partida: el ganador se queda en azul.
- Gestiona el AFK (
!afky detección por inactividad) y nunca elige a quien está AFK. - Bloquea los equipos: solo el bot mueve jugadores.
- Muestra la partida a quien entra después, sin reiniciarla.
Las reglas completas están en Equipos, capitanes y elección.
Cómo ejecutarla
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 # rellena BONK_USERNAME y BONK_PASSWORD
cp bonk-room.example.json bonk-room.json # ajusta el nombre, el modo y los rounds de la sala
pnpm devEl enlace de la sala aparece en el log (sala ativa).
Variables de entorno
| Variable | Descripción |
|---|---|
BONK_USERNAME, BONK_PASSWORD | La cuenta de bonk.io que aloja la sala |
BONK_GAMEMODE | football (por defecto), classic, arrows, death arrows, grapple o vtol |
BONK_MAXTEAMSIZE | Jugadores por equipo (1 = 1v1, 2 = 2v2...). Base de todos los cálculos de equipos. |
BONK_ROUNDS | Rounds por partida |
BONK_INITIAL_STATE | IS blob de reserva (consulta Partidas, IS blob y espectadores) |
BONK_BLOB_CACHE_PATH | Ruta de la caché de blobs por mapa |
NODE_ENV | development (logs con formato) o production (JSON, ideal para PM2) |
Configuración de la sala
bonk-room.json:
{
"room": {
"id": "my-room",
"name": "My Bonk Room",
"password": "",
"maxPlayers": 6,
"mode": "b",
"rounds": 3,
"hidden": true,
"map": "<blob LZ-String del mapa>"
},
"throttle": {
"maxConcurrentRooms": 1,
"roomCreationDelayMs": 3000,
"roomCreationJitterMs": 2000
},
"initialStates": { "2": "<IS blob 1v1>", "4": "<IS blob 2v2>" }
}Estructura del código
| Archivo | Función |
|---|---|
src/index.ts | Logger, configuración, BonkSession con reconexión |
src/example-bot.ts | ExampleBot: conecta los eventos de la sala con el controlador |
src/pick/PickController.ts | Equipos, capitanes, elección, rotación, AFK y comandos |
src/config.ts | Validación (zod) de la configuración y lectura del entorno |
examples/antiAfk.ts | Anti-AFK en ~10 líneas usando solo la biblioteca |
Pruebas
pnpm --filter bonk-room testAdemás de los escenarios del flujo de equipos y del AFK, hay un fuzz con cientos de secuencias aleatorias de entradas, salidas, AFK y elecciones. En cada inicio de partida comprueba que los equipos tienen el mismo tamaño, nunca superan maxTeamSize y no tienen a nadie AFK en el campo.
Producción
Ejecútala con NODE_ENV=production para logs JSON y usa un gestor de procesos (PM2, systemd o un contenedor) que reinicie el proceso si muere. BonkSession ya se encarga de recrear la sala cuando cae; el gestor se encarga del proceso.