Cas d'usage

Un filtre de chat par IA pour serveurs Minecraft

Les filtres de chat à listes de mots bloquent des mots innocents et laissent passer des insultes sans gros mots. VigiMod lit le sens de chaque message, dans 26 langues, et vérifie les règles de votre serveur, comme « Pas de pub pour d'autres serveurs ».

Ce qui rend la tâche difficile

Les listes de mots se trompent dans les deux sens

Elles bloquent des mots innocents qui contiennent un gros mot et laissent passer « personne ne veut de toi ici ». Un modèle note le sens, pas des mots isolés.

Des joueurs de tous âges

Beaucoup de joueurs sont jeunes. La catégorie optionnelle child_safety (bêta) signale les tentatives d'approche d'un mineur, comme alerte pour le staff.

Pubs de serveurs et ventes

Faire de la pub pour d'autres serveurs ou vendre des comptes est une règle, pas un gros mot. Écrivez-la comme règle et VigiMod la note.

Comment ça marche avec VigiMod

  1. 1

    Un plugin écoute le chat (AsyncChatEvent sur Paper), qui tourne hors du thread principal.

  2. 2

    Il envoie à VigiMod le message, l'UUID du joueur et vos règles, avec un délai court.

  3. 3

    S'il est signalé, il annule le message et prévient le joueur ; plusieurs signalements peuvent déclencher votre commande de mute ou d'avertissement.

Des règles à copier

Envoyez-les dans le champ rules : chacune revient avec son propre score, comme une catégorie intégrée.

{
  "rules": {
    "no-server-ads": "Pas de pub pour d'autres serveurs Minecraft ou Discord",
    "no-selling": "Pas de vente de comptes, d'objets ou de grades contre de l'argent réel",
    "no-personal-info": "Ne pas demander aux joueurs leur âge, adresse ou numéro de téléphone",
    "french-only": "Uniquement du français dans le chat global"
  }
}

Exemple

Un listener pour plugin Paper en Java : l'événement du chat est asynchrone, donc l'appel HTTP ne ralentit pas le tick du serveur.

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

Conseils

  • Utilisez un délai court (environ deux secondes) et laissez passer le message si la vérification échoue, pour que le chat ne gèle jamais.
  • Ajoutez child_safety aux catégories sur les serveurs avec de jeunes joueurs, et envoyez ses signalements au staff au lieu d'agir seul.
  • Envoyez l'UUID du joueur comme user_id : le même message répété en boucle fait monter le score de spam.

Questions

Ça marche sur Spigot, Paper et Velocity ?
L'exemple utilise AsyncChatEvent de Paper. Spigot a AsyncPlayerChatEvent et les proxys comme Velocity ont leurs propres événements de chat ; l'appel HTTP à VigiMod est le même partout.
Est-ce que ça fait laguer le serveur ?
Non, si vous l'appelez depuis l'événement de chat asynchrone comme dans l'exemple : le thread principal n'est jamais bloqué.
Repère-t-il les astuces d'écriture comme le l33t speak ?
Souvent, car le modèle lit des phrases entières, mais pas toujours. Pour les pires cas, ajoutez vos mots bloqués avec le plugin que vous utilisez déjà.
Combien de messages peut-il vérifier ?
La bêta gratuite permet 120 messages par minute et par clé API. Les grands réseaux peuvent demander une limite plus haute au support.

Essayez-le sur votre communauté

Créez une clé API gratuite en deux minutes. Sans carte, sans période d'essai.