Referencia
El protocolo de bonk.io
Un resumen del protocolo que habla la biblioteca, con las trampas más importantes.
Esta página resume lo que hace la biblioteca por debajo. La documentación completa, con todos los ID de paquetes y formatos, está en el archivo BONK_PROTOCOL.md del repositorio.
Capas de red
| Capa | Tecnología |
|---|---|
| Transporte | WebSocket (TLS) |
| Engine.IO | versión 3 (EIO=3) |
| Socket.IO | versión 2 |
| Framing | 42[eventId, payload] |
| Serialización | JSON |
Flujo de una sesión
- Login en
login_legacy.php, que devuelve un token. - Descubrimiento del servidor (
getrooms.phppara crear,autojoin.phppara entrar por URL). - Conexión Socket.IO al servidor indicado, con timesync periódico.
- Crear (
CREATE_ROOM) o entrar (JOIN_ROOM) en la sala. - El host responde a cada jugador que entra con los datos iniciales (ver abajo).
- Partida: el host envía
TRIGGER_STARTy el servidor reenvíaGAME_STARTa todos.
Dos conexiones: Socket.IO y WebRTC
Socket.IO cubre la sala (jugadores, equipos, chat, inicio y fin de partida). Pero el movimiento de los jugadores dentro de la partida no pasa por él: se sincroniza por WebRTC entre los peers, señalizado por un broker PeerJS estándar. Para recibir esos frames (la base del anti-AFK), la biblioteca completa el handshake WebRTC como un jugador normal.
Los frames de input son pequeños paquetes binarios. Hay un frame por tecla pulsada o soltada y ninguno mientras el jugador está quieto.
Datos iniciales para quien entra
Cuando entra un jugador, el host envía un paquete con el estado de la sala. El cliente solo acepta el primero:
| Situación | Paquete |
|---|---|
| Lobby | INFORM_IN_LOBBY (out 11) |
| Partida en curso | INFORM_IN_GAME (out 40), con state, stateID, fc, inputs, admin, gs, random |
Enviar ambos hace que se ignore el segundo. La biblioteca elige el correcto automáticamente.
Trampas que la biblioteca ya resuelve
players[]es un array disperso. El índice es el id del jugador; los huecos libres sonnull.- El creador de la sala no recibe
JOIN_ROOM. Es el jugador 0 y host. room_fulles ambiguo. Solo es terminal cuando el bot aún no ha entrado en la sala.- El mapa en
INFORM_IN_LOBBYes un objeto JSON, no una cadena LZ. - El IS blob depende del número de jugadores y del mapa.
balexplícito. Conbal: [], los ids no contiguos pueden generar apariciones intercambiadas.gs.tldebe reflejar el bloqueo real de la sala: con el bloqueo activado ygs.tl: false, los jugadores quedaban congelados.- Los ids de paquete tienen espacios de nombres separados por dirección (el
20recibido es chat; el20enviado es otra cosa).
Numeración de equipos
0 spec · 1 FFA · 2 rojo · 3 azul · 4 verde · 5 amarillo.
Límites de tasa
El servidor limita la frecuencia de varios comandos y responde con un status-message (rate_limit_tl para el bloqueo de equipos, rate_limit_cot para los cambios de equipo, etc.). Los códigos terminales, como banned, cierran la sala.