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 (!afk y 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

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                        # 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 dev

El enlace de la sala aparece en el log (sala ativa).

Variables de entorno

VariableDescripción
BONK_USERNAME, BONK_PASSWORDLa cuenta de bonk.io que aloja la sala
BONK_GAMEMODEfootball (por defecto), classic, arrows, death arrows, grapple o vtol
BONK_MAXTEAMSIZEJugadores por equipo (1 = 1v1, 2 = 2v2...). Base de todos los cálculos de equipos.
BONK_ROUNDSRounds por partida
BONK_INITIAL_STATEIS blob de reserva (consulta Partidas, IS blob y espectadores)
BONK_BLOB_CACHE_PATHRuta de la caché de blobs por mapa
NODE_ENVdevelopment (logs con formato) o production (JSON, ideal para PM2)

Configuración de la sala

bonk-room.json:

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

ArchivoFunción
src/index.tsLogger, configuración, BonkSession con reconexión
src/example-bot.tsExampleBot: conecta los eventos de la sala con el controlador
src/pick/PickController.tsEquipos, capitanes, elección, rotación, AFK y comandos
src/config.tsValidación (zod) de la configuración y lectura del entorno
examples/antiAfk.tsAnti-AFK en ~10 líneas usando solo la biblioteca

Pruebas

bash
pnpm --filter bonk-room test

Ademá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.