Bibliothèque

Anti-AFK

Détectez les joueurs inactifs par le mouvement et par le chat, avec 12 s de tolérance.

L'anti-AFK marque comme AFK un joueur resté 12 secondes sans bouger et sans écrire. L'un ou l'autre signal remet le compteur à zéro.

ts
room.enableAntiAfk();                                  // par défaut : 12 s

room.on('player-afk',  (id) => room.kickPlayer(id));   // une fois, quand il passe AFK
room.on('player-back', (id) => room.chat(`le joueur ${id} est de retour`));

room.isAfk(playerId);                                  // vérification ponctuelle
room.disableAntiAfk();

Options

ts
room.enableAntiAfk({
  thresholdMs: 12_000,     // durée d'immobilité avant AFK
  checkIntervalMs: 1_000,  // fréquence de la vérification
});

Le délai par défaut est aussi disponible sous forme de constante AFK_THRESHOLD_MS.

Qui est surveillé

Uniquement les joueurs dans une équipe pendant une partie. Les spectateurs et le bot lui-même sont ignorés. Le compteur démarre au début de la partie (ou quand le joueur rejoint une équipe pendant la partie) et est abandonné à la fin de la partie.

D'où viennent les signaux

SignalSourceÉvénement
ChatSocket.IOchat-message
MouvementWebRTC (frames d'input entre pairs)peer-input

Le mouvement ne passe pas par Socket.IO : les joueurs s'échangent des frames d'input via WebRTC. La bibliothèque complète le handshake WebRTC comme un joueur et reçoit ces frames. Elle reçoit une frame par touche pressée ou relâchée, et aucune tant que le joueur est immobile, ce qui rend la détection fiable.

peer-input fournit { playerId, peerID, data }, avec la frame déjà associée au bon joueur. Vous pouvez l'utiliser directement pour des statistiques d'activité.

Limites importantes

  • Nécessite le mode réel. L'événement peer-input n'existe que lorsque le salon utilise le transport réel (avec peerID), comme avec createRoom() et joinRoom(). Dans des tests avec un faux transport, émettez peer-input manuellement.
  • Fiabilité du signal. Si, pour une raison quelconque, aucune frame de mouvement n'arrive pendant toute une partie, le signal n'est pas fiable. Le salon 24h/24 ignore alors l'AFK automatique, pour ne jamais punir tout le monde à cause d'une panne réseau. Faites de même si vous appliquez des sanctions.

Exemple complet

ts
import type { BonkRoom } from 'bonktools';

export function setupAntiAfk(room: BonkRoom): void {
  room.enableAntiAfk();

  const name = (id: number) => room.state.players.get(id)?.userName ?? `#${id}`;

  room.on('player-afk', (id) => {
    room.chat(`${name(id)} est AFK !`);
    room.kickPlayer(id); // retirez cette ligne si vous voulez seulement prévenir
  });

  room.on('player-back', (id) => room.chat(`${name(id)} est de retour.`));
}