Bibliothek
Anti-AFK
Erkenne inaktive Spieler anhand von Bewegung und Chat, mit 12 s Toleranz.
Anti-AFK markiert einen Spieler als AFK, der 12 Sekunden lang weder bewegt noch geschrieben hat. Jedes der beiden Signale setzt die Uhr zurück.
room.enableAntiAfk(); // Standard: 12 s
room.on('player-afk', (id) => room.kickPlayer(id)); // einmal, wenn er AFK wird
room.on('player-back', (id) => room.chat(`Spieler ${id} ist zurück`));
room.isAfk(playerId); // einmalige Abfrage
room.disableAntiAfk();Optionen
room.enableAntiAfk({
thresholdMs: 12_000, // Ruhezeit, bis er AFK wird
checkIntervalMs: 1_000, // Häufigkeit der Prüfung
});Die Standardzeit steht auch als Konstante AFK_THRESHOLD_MS zur Verfügung.
Wer überwacht wird
Nur Spieler, die während einer Partie in einem Team sind. Zuschauer und der Bot selbst werden ignoriert. Die Uhr startet mit dem Beginn der Partie (oder wenn der Spieler während der Partie einem Team beitritt) und wird beim Ende der Partie verworfen.
Woher die Signale kommen
| Signal | Quelle | Event |
|---|---|---|
| Chat | Socket.IO | chat-message |
| Bewegung | WebRTC (Input-Frames zwischen Peers) | peer-input |
Die Bewegung läuft nicht über Socket.IO: Die Spieler tauschen Input-Frames untereinander per WebRTC aus. Die Bibliothek schließt den WebRTC-Handshake wie ein Spieler ab und empfängt diese Frames. Sie erhält einen Frame pro gedrückter oder losgelassener Taste und keinen, solange der Spieler ruht, was die Erkennung zuverlässig macht.
peer-input liefert { playerId, peerID, data }, wobei der Frame bereits dem richtigen Spieler zugeordnet ist. Du kannst es direkt für Aktivitätsstatistiken nutzen.
Wichtige Einschränkungen
- Braucht den echten Modus. Das Event
peer-inputexistiert nur, wenn der Raum den echten Transport nutzt (mitpeerID), wie beicreateRoom()undjoinRoom(). Bei Tests mit einem Fake-Transport emittierepeer-inputmanuell. - Zuverlässigkeit des Signals. Kommt aus irgendeinem Grund während einer ganzen Partie kein Bewegungs-Frame an, ist das Signal nicht zuverlässig. Der 24/7-Raum ignoriert das automatische AFK in diesem Fall, damit nie alle wegen eines Netzwerkfehlers bestraft werden. Mach es genauso, wenn du Strafen verhängst.
Vollständiges Beispiel
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)} ist AFK!`);
room.kickPlayer(id); // entferne diese Zeile, wenn du nur warnen willst
});
room.on('player-back', (id) => room.chat(`${name(id)} ist zurück.`));
}