Sala 24/7

Sala 24/7 de referência

O bot de football completo, construído só com a biblioteca. Use como base para o seu.

O repositório inclui apps/bonk-room, um bot de football que roda 24 horas por dia. Ele foi feito só com a biblioteca bonktools, então serve como exemplo prático de tudo o que a lib oferece: sessão com reconexão, eventos, times, lock, anti-AFK e sincronização de partida.

O que ele faz

  • Cria e mantém uma sala de football, recriando-a se cair.
  • Monta os times automaticamente, sempre com o mesmo tamanho.
  • Escolhe capitães e deixa o capitão escolher os jogadores digitando o número no chat.
  • Rotaciona o campeão ao fim de cada partida: o vencedor fica no azul.
  • Trata AFK (!afk e detecção por inatividade) e nunca escolhe quem está AFK.
  • Trava os times: só o bot move jogadores.
  • Mostra a partida para quem entra depois, sem reiniciá-la.

As regras completas estão em Times, capitães e escolha.

Como rodar

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                        # preencha BONK_USERNAME e BONK_PASSWORD
cp bonk-room.example.json bonk-room.json    # ajuste nome, modo e rounds da sala
pnpm dev

O link da sala aparece no log (sala ativa).

Variáveis de ambiente

VariávelDescrição
BONK_USERNAME, BONK_PASSWORDConta do bonk.io que hospeda a sala
BONK_GAMEMODEfootball (padrão), classic, arrows, death arrows, grapple ou vtol
BONK_MAXTEAMSIZEJogadores por time (1 = 1v1, 2 = 2v2...). Base de todos os cálculos de time.
BONK_ROUNDSRounds por partida
BONK_INITIAL_STATEIS blob de fallback (veja Partidas e IS blob)
BONK_BLOB_CACHE_PATHCaminho do cache de blobs por mapa
NODE_ENVdevelopment (logs formatados) ou production (JSON, ideal para PM2)

Configuração da 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 do mapa>"
  },
  "throttle": {
    "maxConcurrentRooms": 1,
    "roomCreationDelayMs": 3000,
    "roomCreationJitterMs": 2000
  },
  "initialStates": { "2": "<IS blob 1v1>", "4": "<IS blob 2v2>" }
}

Estrutura do código

ArquivoPapel
src/index.tsLogger, configuração, BonkSession com reconexão
src/example-bot.tsExampleBot: liga os eventos da sala ao controlador
src/pick/PickController.tsTimes, capitães, escolha, rotação, AFK e comandos
src/config.tsValidação (zod) da configuração e leitura do ambiente
examples/antiAfk.tsAnti-AFK em ~10 linhas usando só a lib

Testes

bash
pnpm --filter bonk-room test

Além dos cenários do fluxo de times e do AFK, há um fuzz com centenas de sequências aleatórias de entradas, saídas, AFK e escolhas. A cada partida iniciada ele confere que os times têm o mesmo tamanho, nunca passam de maxTeamSize e não têm ninguém AFK em campo.

Produção

Rode com NODE_ENV=production para logs JSON e use um gerenciador de processos (PM2, systemd ou um contêiner) para reiniciar o processo se ele morrer. A BonkSession já cuida de recriar a sala quando ela cai; o gerenciador cuida do processo.