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 (
!afke 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
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 devO link da sala aparece no log (sala ativa).
Variáveis de ambiente
| Variável | Descrição |
|---|---|
BONK_USERNAME, BONK_PASSWORD | Conta do bonk.io que hospeda a sala |
BONK_GAMEMODE | football (padrão), classic, arrows, death arrows, grapple ou vtol |
BONK_MAXTEAMSIZE | Jogadores por time (1 = 1v1, 2 = 2v2...). Base de todos os cálculos de time. |
BONK_ROUNDS | Rounds por partida |
BONK_INITIAL_STATE | IS blob de fallback (veja Partidas e IS blob) |
BONK_BLOB_CACHE_PATH | Caminho do cache de blobs por mapa |
NODE_ENV | development (logs formatados) ou production (JSON, ideal para PM2) |
Configuração da 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 do mapa>"
},
"throttle": {
"maxConcurrentRooms": 1,
"roomCreationDelayMs": 3000,
"roomCreationJitterMs": 2000
},
"initialStates": { "2": "<IS blob 1v1>", "4": "<IS blob 2v2>" }
}Estrutura do código
| Arquivo | Papel |
|---|---|
src/index.ts | Logger, configuração, BonkSession com reconexão |
src/example-bot.ts | ExampleBot: liga os eventos da sala ao controlador |
src/pick/PickController.ts | Times, capitães, escolha, rotação, AFK e comandos |
src/config.ts | Validação (zod) da configuração e leitura do ambiente |
examples/antiAfk.ts | Anti-AFK em ~10 linhas usando só a lib |
Testes
pnpm --filter bonk-room testAlé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.