Caso de uso

Un filtro de chat con IA para servidores de Minecraft

Los filtros de chat con listas de palabras bloquean palabras inocentes y dejan pasar insultos sin palabrotas. VigiMod lee el sentido de cada mensaje, en 26 idiomas, y revisa las reglas de tu servidor, como «Nada de publicidad de otros servidores».

Qué lo hace difícil

Las listas de palabras fallan por los dos lados

Bloquean palabras inocentes que contienen una grosería y dejan pasar «aquí nadie te quiere». Un modelo puntúa el sentido, no palabras sueltas.

Jugadores de todas las edades

Muchos jugadores son jóvenes. La categoría opcional child_safety (beta) marca intentos de captar a un menor, como aviso para el staff.

Anuncios de servidores y ventas

Anunciar otros servidores o vender cuentas es una regla, no una palabrota. Escríbela como regla y VigiMod la puntúa.

Cómo funciona con VigiMod

  1. 1

    Un plugin escucha el chat (AsyncChatEvent en Paper), que se ejecuta fuera del hilo principal.

  2. 2

    Envía a VigiMod el mensaje, el UUID del jugador y tus reglas, con un timeout corto.

  3. 3

    Si está marcado, cancela el mensaje y avisa al jugador; varias marcas pueden activar tu comando de mute o warn.

Reglas para copiar

Envíalas en el campo rules: cada una vuelve con su propia puntuación, como una categoría integrada.

{
  "rules": {
    "no-server-ads": "Nada de publicidad de otros servidores de Minecraft o de Discord",
    "no-selling": "Nada de vender cuentas, objetos o rangos por dinero real",
    "no-personal-info": "No preguntar a los jugadores su edad, dirección o teléfono",
    "spanish-only": "En el chat global solo español"
  }
}

Ejemplo

Un listener para un plugin de Paper en Java: el evento del chat es asíncrono, así que la llamada HTTP no ralentiza el tick del servidor.

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

Consejos

  • Usa un timeout corto (unos dos segundos) y deja pasar el mensaje si la revisión falla, para que el chat nunca se congele.
  • Añade child_safety a las categorías en servidores con jugadores jóvenes y envía sus marcas al staff en lugar de actuar solo.
  • Envía el UUID del jugador como user_id: el mismo mensaje repetido una y otra vez sube la puntuación de spam.

Preguntas

¿Funciona en Spigot, Paper y Velocity?
El ejemplo usa AsyncChatEvent de Paper. Spigot tiene AsyncPlayerChatEvent y los proxies como Velocity tienen sus propios eventos de chat; la llamada HTTP a VigiMod es la misma en todos.
¿Provoca lag en el servidor?
No, si lo llamas desde el evento asíncrono del chat como en el ejemplo: el hilo principal nunca se bloquea.
¿Detecta trucos de escritura como el l33t speak?
A menudo sí, porque el modelo lee frases enteras, pero no siempre. Para los peores casos añade tus palabras bloqueadas con el plugin que ya usas.
¿Cuántos mensajes puede revisar?
La beta gratuita permite 120 mensajes por minuto por clave API. Las redes más grandes pueden pedir a soporte un límite mayor.

Pruébalo en tu comunidad

Crea una clave API gratuita en dos minutos. Sin tarjeta y sin periodo de prueba.