Saltar a contenido

Integración de chat personalizado

Verité normalmente filtra los mensajes de forma automática. Sin embargo, algunos plugins de chat interceptan el evento de chat normal de Minecraft y gestionan por sí mismos el envío de los mensajes.

Si tu plugin hace esto, es posible que Verité nunca reciba el mensaje original para filtrarlo. En ese caso, debes pasar el mensaje por Verité antes de que tu plugin lo envíe.

Solo necesitas esta guía si tu plugin gestiona o sustituye el chat normal de Minecraft. Los servidores que utilizan el chat estándar no necesitan ninguna configuración adicional.

Integración con Java

Verité proporciona una pequeña API pública diseñada específicamente para integraciones como sistemas de chat personalizados.

1. Añade Verité como dependencia opcional

Añade Verité a tu plugin.yml:

softdepend:
  - Verite

Utilizar una dependencia opcional garantiza que Verité se cargue antes que tu integración cuando esté instalado, sin convertirlo en un requisito obligatorio para que tu plugin pueda iniciarse.

2. Comprueba si la API está disponible

Si Verité es opcional, comprueba que la API esté disponible antes de utilizarla:

private static final boolean VERITE_AVAILABLE;

static {
    boolean available;

    try {
        Class.forName("teacommontea.api.VeriteFilter");
        available = true;
    } catch (ClassNotFoundException ignored) {
        available = false;
    }

    VERITE_AVAILABLE = available;
}

De esta forma, tu integración puede simplemente no hacer nada cuando Verité no esté instalado.

3. Filtra el mensaje

Antes de que tu sistema de chat personalizado envíe un mensaje, pásalo por VeriteFilter:

if (VERITE_AVAILABLE) {
    FilterResult result = VeriteFilter.check(
        player.getUniqueId(),
        message
    );

    if (result.blocks()) {
        player.sendMessage(VeriteFilter.blockMessage());
        return;
    }
}

Eso es todo lo necesario para una integración básica.

check() pasa el mensaje por el filtro de Verité y registra la marca asociada al jugador. Si .blocks() devuelve true, tu sistema de chat debe impedir que se envíe el mensaje.

Usar la categoría del filtro

A veces querrás saber por qué Verité ha detectado un mensaje:

FilterResult result = VeriteFilter.check(
    player.getUniqueId(),
    message
);

switch (result) {
    case CLEAN -> {
        // Enviar normalmente
    }

    case SELF_HARM, ABUSE -> {
        // Gestionar de forma adecuada
    }

    default -> {
        // Contenido bloqueado normal
    }
}

Los posibles resultados son:

  • CLEAN
  • BLOCK
  • PROFANITY
  • SELF_HARM
  • ABUSE

Cualquier resultado excepto CLEAN hace que .blocks() devuelva true.

Importante: SELF_HARM y ABUSE existen para que estos mensajes puedan gestionarse de forma diferente a las infracciones normales de las reglas. Recomendamos no tratarlos automáticamente como infracciones de chat que deban ser sancionadas.

Detectar mensajes repetidos

Si tu sistema de chat necesita distinguir entre contenido filtrado y la detección de mensajes repetidos, utiliza la sobrecarga con detección de repeticiones:

FilterOutcome outcome = VeriteFilter.check(
    player.getUniqueId(),
    message,
    true
);

if (outcome.blocks()) {
    if (outcome.repeat()) {
        player.sendMessage(VeriteFilter.repeatMessage());
    } else {
        player.sendMessage(VeriteFilter.blockMessage());
    }

    return;
}

outcome.category() proporciona la categoría normal del filtro, mientras que outcome.repeat() indica si el mensaje se bloqueó por estar repetido.

Filtrar otro contenido de los usuarios

La API no se limita al chat.

Si tu plugin acepta contenido escrito por los usuarios, como apodos, prefijos, etiquetas de equipo o campos similares, puedes pasarlo por el mismo filtro:

if (VeriteFilter.check(player.getUniqueId(), nickname).blocks()) {
    // Rechazar el apodo
}

Para texto que no pertenezca a ningún jugador en particular, utiliza VeriteFilter.ANONYMOUS:

FilterResult result = VeriteFilter.check(
    VeriteFilter.ANONYMOUS,
    text
);

Las comprobaciones anónimas siguen devolviendo la categoría de filtro correspondiente, pero no añaden ninguna marca al registro de ningún jugador.


Usar Verité con Skript

Si tu sistema de chat personalizado está escrito en Skript, no necesitas interactuar con la API de Java.

Con Verité y Skript instalados, la sintaxis de filtrado de Verité estará disponible automáticamente.

Filtrar un chat personalizado

Si tu script ya se encarga de enviar los mensajes de chat, comprueba el mensaje antes de enviarlo:

if {_msg} is blocked for player:
    send block message to player
    stop

Incluir for player indica a Verité quién ha enviado el mensaje y registra la marca asociada a ese jugador.

Sin un jugador:

if {_text} is blocked:
    # Rechazar el texto

Verité realiza una comprobación pura del filtro sin registrar ninguna marca. Esto resulta útil para elementos como nombres, etiquetas, carteles u otros textos que no deban contar como una infracción de un jugador específico.

Comprobar por qué se ha bloqueado un mensaje

Para tener un mayor control, obtén el resultado del filtro:

set {_result} to filter result of {_msg} for player

if {_result} is "self_harm":
    # Gestionar por separado
    stop

if {_result} is "abuse":
    # Gestionar por separado
    stop

if {_result} is not "clean":
    send block message to player
    stop

El resultado será uno de los siguientes:

clean, block, profanity, self_harm o abuse

Importante: Considera gestionar self_harm y abuse por separado de las infracciones normales de moderación, en lugar de sancionar automáticamente al jugador.

Comprobar el número de marcas de un jugador

También puedes obtener el número de mensajes que Verité ha marcado para un jugador:

set {_flags} to message flags of player

Tu propio sistema de moderación puede utilizar este valor si quieres aplicar un comportamiento diferente ante infracciones repetidas.

Referencia de sintaxis de Skript

%string% is blocked [for %-player%]
%string% is not blocked [for %-player%]

filter result of %string% [for %-player%]

block message

message flags of %player%

El jugador opcional es importante:

Con un jugador: el resultado del filtro se registra para ese jugador.

Sin un jugador: Verité solo comprueba el texto y no registra ninguna marca.


Referencia de la API

La API pública se encuentra en:

teacommontea.api

La clase principal para las integraciones de chat es:

VeriteFilter

Entre los métodos útiles se incluyen:

VeriteFilter.check(UUID player, String message)
VeriteFilter.check(UUID player, String message, boolean repeatAware)

VeriteFilter.count(UUID player)

VeriteFilter.blockMessage()
VeriteFilter.repeatMessage()
VeriteFilter.selfHarmMessage()

VeriteFilter.blockNotice(FilterResult result, String message)

VeriteFilter.ANONYMOUS puede utilizarse para filtrar texto que no esté asociado a un jugador.

Verité también expone sus utilidades de normalización para las integraciones que las necesiten, incluidas la normalización de acentos, la eliminación de entidades, la reducción de caracteres repetidos, el fingerprinting y el recorte de los extremos. Estas funciones son thread-safe y, por lo general, no es necesario llamarlas manualmente antes de utilizar check().

Para la mayoría de las integraciones de chat personalizado, solo necesitas:

if (VeriteFilter.check(player.getUniqueId(), message).blocks()) {
    // No enviar el mensaje
}

Verité se encarga del resto.