Anwendungsfall

Ein KI-Chatfilter für Minecraft-Server

Chatfilter mit Wortlisten auf Minecraft-Servern blockieren harmlose Wörter und lassen Beleidigungen ohne Schimpfwörter durch. VigiMod liest die Bedeutung jeder Nachricht, in 26 Sprachen, und prüft die Regeln deines Servers, etwa „Keine Werbung für andere Server“.

Was es schwierig macht

Wortlisten irren in beide Richtungen

Sie blockieren harmlose Wörter, die ein Schimpfwort enthalten, und lassen „hier will dich keiner“ durch. Ein Modell bewertet die Bedeutung, nicht einzelne Wörter.

Spieler jeden Alters

Viele Spieler sind jung. Die optionale Kategorie child_safety (Beta) markiert Versuche, an Minderjährige heranzutreten, als Hinweis für das Team.

Serverwerbung und Verkäufe

Werbung für andere Server oder der Verkauf von Accounts ist eine Regel, kein Schimpfwort. Schreib sie als Regel, und VigiMod bewertet sie.

So funktioniert es mit VigiMod

  1. 1

    Ein Plugin hört auf den Chat (AsyncChatEvent auf Paper), der außerhalb des Hauptthreads läuft.

  2. 2

    Es sendet VigiMod die Nachricht, die UUID des Spielers und deine Regeln, mit kurzem Timeout.

  3. 3

    Bei einer Markierung bricht es die Nachricht ab und informiert den Spieler; mehrere Markierungen können deinen Mute- oder Warn-Befehl auslösen.

Regeln zum Kopieren

Sende sie im Feld rules: Jede kommt mit einer eigenen Bewertung zurück, wie eine eingebaute Kategorie.

{
  "rules": {
    "no-server-ads": "Keine Werbung für andere Minecraft- oder Discord-Server",
    "no-selling": "Kein Verkauf von Accounts, Items oder Rängen für echtes Geld",
    "no-personal-info": "Spieler nicht nach Alter, Adresse oder Telefonnummer fragen",
    "german-only": "Im globalen Chat nur Deutsch"
  }
}

Beispiel

Ein Listener für ein Paper-Plugin in Java: Das Chat-Event ist asynchron, daher bremst der HTTP-Aufruf den Server-Tick nicht.

Java (Paper plugin)

// A listener for a Paper plugin: register it in onEnable() with
// getServer().getPluginManager().registerEvents(new ChatFilter(), this);
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import io.papermc.paper.event.player.AsyncChatEvent;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

public final class ChatFilter implements Listener {
  private final HttpClient http = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(2)).build();
  private final String key = System.getenv("VIGIMOD_KEY");

  // AsyncChatEvent runs off the main thread: waiting for the answer does not slow the server
  @EventHandler(ignoreCancelled = true)
  public void onChat(AsyncChatEvent event) {
    JsonObject rules = new JsonObject();
    rules.addProperty("no-server-ads", "No advertising other Minecraft servers or Discord servers");
    JsonObject body = new JsonObject();
    body.addProperty("text", PlainTextComponentSerializer.plainText().serialize(event.message()));
    body.addProperty("user_id", event.getPlayer().getUniqueId().toString());
    body.addProperty("scope", "my-server");
    body.add("rules", rules);

    HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.vigimod.com/moderate"))
        .timeout(Duration.ofSeconds(2))
        .header("X-API-Key", key)
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(body.toString()))
        .build();
    try {
      HttpResponse<String> response = http.send(request, HttpResponse.BodyHandlers.ofString());
      if (response.statusCode() != 200) return;
      JsonObject result = JsonParser.parseString(response.body()).getAsJsonObject();
      if (result.get("flagged").getAsBoolean()) {
        event.setCancelled(true);
        event.getPlayer().sendMessage(Component.text("Your message was not sent: it breaks the server rules."));
      }
    } catch (Exception e) {
      // slow or down: let the message through
    }
  }
}

Tipps

  • Nutze einen kurzen Timeout (etwa zwei Sekunden) und lass die Nachricht durch, wenn die Prüfung fehlschlägt, damit der Chat nie hängt.
  • Füge auf Servern mit jungen Spielern child_safety zu den Kategorien hinzu und leite diese Markierungen an das Team weiter, statt allein zu handeln.
  • Sende die UUID des Spielers als user_id: Dieselbe Nachricht immer wieder erhöht den Spam-Wert.

Fragen

Funktioniert es mit Spigot, Paper und Velocity?
Das Beispiel nutzt AsyncChatEvent von Paper. Spigot hat AsyncPlayerChatEvent, und Proxys wie Velocity haben eigene Chat-Events; der HTTP-Aufruf an VigiMod ist überall gleich.
Verursacht es Lag auf dem Server?
Nein, wenn du es wie im Beispiel aus dem asynchronen Chat-Event aufrufst: Der Hauptthread wird nie blockiert.
Erkennt es Schreibtricks wie l33t speak?
Oft, weil das Modell ganze Sätze liest, aber nicht immer. Für die schlimmsten Fälle ergänze deine gesperrten Wörter mit dem Plugin, das du schon nutzt.
Wie viele Nachrichten kann es prüfen?
Die kostenlose Beta erlaubt 120 Nachrichten pro Minute und API-Schlüssel. Größere Netzwerke können beim Support ein höheres Limit anfragen.

Teste es in deiner Community

Erstelle in zwei Minuten einen kostenlosen API-Schlüssel. Keine Karte, keine Testphase.