Référence
Le protocole de bonk.io
Un résumé du protocole parlé par la bibliothèque, avec les pièges les plus importants.
Cette page résume ce que fait la bibliothèque en coulisses. La documentation complète, avec tous les ID de paquets et les formats, se trouve dans le fichier BONK_PROTOCOL.md du dépôt.
Couches réseau
| Couche | Technologie |
|---|---|
| Transport | WebSocket (TLS) |
| Engine.IO | version 3 (EIO=3) |
| Socket.IO | version 2 |
| Framing | 42[eventId, payload] |
| Sérialisation | JSON |
Déroulement d'une session
- Login sur
login_legacy.php, qui renvoie un token. - Découverte du serveur (
getrooms.phppour créer,autojoin.phppour rejoindre par URL). - Connexion Socket.IO au serveur indiqué, avec un timesync périodique.
- Créer (
CREATE_ROOM) ou rejoindre (JOIN_ROOM) le salon. - L'hôte répond à chaque joueur qui arrive avec les données initiales (voir plus bas).
- Partie : l'hôte envoie
TRIGGER_STARTet le serveur renvoieGAME_STARTà tous.
Deux connexions : Socket.IO et WebRTC
Socket.IO couvre le salon (joueurs, équipes, chat, début et fin de partie). Mais le mouvement des joueurs pendant la partie ne passe pas par lui : il est synchronisé par WebRTC entre les pairs, signalé par un broker PeerJS standard. Pour recevoir ces frames (la base de l'anti-AFK), la bibliothèque complète le handshake WebRTC comme un joueur ordinaire.
Les frames d'input sont de petits paquets binaires. Il y a une frame par touche pressée ou relâchée et aucune tant que le joueur est immobile.
Données initiales de celui qui arrive
Quand un joueur arrive, l'hôte envoie un paquet avec l'état du salon. Le client n'accepte que le premier :
| Situation | Paquet |
|---|---|
| Lobby | INFORM_IN_LOBBY (out 11) |
| Partie en cours | INFORM_IN_GAME (out 40), avec state, stateID, fc, inputs, admin, gs, random |
Envoyer les deux fait ignorer le second. La bibliothèque choisit automatiquement le bon.
Pièges que la bibliothèque gère déjà
players[]est un tableau creux. L'indice est l'id du joueur ; les emplacements libres sontnull.- Le créateur du salon ne reçoit pas
JOIN_ROOM. C'est le joueur 0 et l'hôte. room_fullest ambigu. Il n'est terminal que si le bot n'est pas encore entré dans le salon.- La carte dans
INFORM_IN_LOBBYest un objet JSON, pas une chaîne LZ. - L'IS blob dépend du nombre de joueurs et de la carte.
balexplicite. Avecbal: [], des ids non contigus peuvent produire des apparitions inversées.gs.tldoit refléter le vrai verrou du salon : avec le verrou activé etgs.tl: false, les joueurs restaient figés.- Les ids de paquets ont des espaces de noms séparés selon la direction (le
20reçu est le chat ; le20envoyé est autre chose).
Numérotation des équipes
0 spec · 1 FFA · 2 rouge · 3 bleu · 4 vert · 5 jaune.
Limites de débit
Le serveur limite la fréquence de plusieurs commandes et répond par un status-message (rate_limit_tl pour le verrouillage des équipes, rate_limit_cot pour les changements d'équipe, etc.). Les codes terminaux, comme banned, mettent fin au salon.