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
Un plugin ascolta la chat (AsyncChatEvent su Paper), che gira fuori dal thread principale.
- 2
Invia a VigiMod il messaggio, l'UUID del giocatore e le tue regole, con un timeout breve.
- 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.
Continua a imparare
Tutte le guide- Base · 6 min di letturaCos'è un classificatore di testo e come decide?Un classificatore legge una frase e restituisce una probabilità per ogni categoria. Come è fatto, cosa significa il punteggio e dove sbaglia.
- Intermedio · 6 min di letturaCome scegliere la soglia di moderazioneUn punteggio di 0,7 non è una decisione. Come funzionano le soglie, perché quella predefinita è solo un punto di partenza e un metodo semplice per regolarle.
- Intermedio · 6 min di letturaIl bias nei modelli di moderazione: perché i messaggi innocenti con nomi stranieri vengono segnalatiUn modello può segnalare «Mohammed ha perso il treno» come odio. Da dove nasce questo bias, come si misura e come si elimina.
Provalo sulla tua community
Crea una chiave API gratuita in due minuti. Niente carta, niente periodo di prova.