Caso d'uso

Un filtro chat con AI per server Minecraft

I filtri chat a liste di parole sui server Minecraft bloccano parole innocenti e lasciano passare insulti senza parolacce. VigiMod legge il significato di ogni messaggio, in 26 lingue, e controlla le regole del tuo server, come «Niente pubblicità di altri server».

Cosa lo rende difficile

Le liste di parole sbagliano in due modi

Bloccano parole innocenti che contengono una parolaccia e lasciano passare «qui non ti vuole nessuno». Un modello valuta il significato, non le singole parole.

Giocatori di ogni età

Molti giocatori sono giovani. La categoria child_safety, su richiesta (beta), segnala i tentativi di adescare un minore, come avviso per lo staff.

Pubblicità di server e vendite

Fare pubblicità ad altri server o vendere account è una regola, non una parolaccia. Scrivila come regola e VigiMod la valuta.

Come funziona con VigiMod

  1. 1

    Un plugin ascolta la chat (AsyncChatEvent su Paper), che gira fuori dal thread principale.

  2. 2

    Invia a VigiMod il messaggio, l'UUID del giocatore e le tue regole, con un timeout breve.

  3. 3

    Se è segnalato, annulla il messaggio e avvisa il giocatore; più segnalazioni possono attivare il tuo comando di mute o warn.

Regole da copiare

Inviale nel campo rules: ognuna torna con il suo punteggio, come una categoria predefinita.

{
  "rules": {
    "no-server-ads": "Niente pubblicità di altri server Minecraft o server Discord",
    "no-selling": "Niente vendita di account, oggetti o gradi per soldi veri",
    "no-personal-info": "Non chiedere ai giocatori età, indirizzo o numero di telefono",
    "italian-only": "In chat globale solo italiano"
  }
}

Esempio

Un listener per un plugin Paper in Java: l'evento della chat è asincrono, quindi la chiamata HTTP non rallenta il tick del server.

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
    }
  }
}

Consigli

  • Usa un timeout breve (circa due secondi) e lascia passare il messaggio se il controllo fallisce, così la chat non si blocca mai.
  • Aggiungi child_safety alle categorie sui server con giocatori giovani e manda le sue segnalazioni allo staff invece di agire da solo.
  • Passa l'UUID del giocatore come user_id: lo stesso messaggio ripetuto di continuo alza il punteggio spam.

Domande

Funziona su Spigot, Paper e Velocity?
L'esempio usa AsyncChatEvent di Paper. Spigot ha AsyncPlayerChatEvent e i proxy come Velocity hanno i loro eventi della chat; la chiamata HTTP a VigiMod è la stessa ovunque.
Fa laggare il server?
No, se lo chiami dall'evento asincrono della chat come nell'esempio: il thread principale non viene mai bloccato.
Riconosce i trucchi di scrittura come il l33t speak?
Spesso sì, perché il modello legge frasi intere, ma non sempre. Per i casi peggiori aggiungi le tue parole bloccate con il plugin che usi già.
Quanti messaggi può controllare?
La beta gratuita permette 120 messaggi al minuto per chiave API. I network più grandi possono chiedere al supporto un limite più alto.

Provalo sulla tua community

Crea una chiave API gratuita in due minuti. Niente carta, niente periodo di prova.