Ir para o conteúdo

Integração de chat personalizado

Normalmente, o Verité filtra as mensagens automaticamente. No entanto, alguns plugins de chat intercetam o evento de chat normal do Minecraft e tratam do envio das mensagens por conta própria.

Se o seu plugin fizer isso, o Verité poderá nunca receber a mensagem original para a filtrar. Nesse caso, deverá passar a mensagem pelo Verité antes de o seu plugin a enviar.

Só precisa deste guia se o seu plugin tratar ou substituir o chat normal do Minecraft. Os servidores que utilizam o chat padrão não precisam de qualquer configuração adicional.

Integração com Java

O Verité disponibiliza uma pequena API pública especificamente para integrações como sistemas de chat personalizados.

1. Adicione o Verité como dependência opcional

Adicione o Verité ao seu plugin.yml:

softdepend:
  - Verite

A utilização de uma dependência opcional garante que o Verité é carregado antes da sua integração quando estiver instalado, sem o tornar obrigatório para que o seu plugin possa iniciar.

2. Verifique se a API está disponível

Se o Verité for opcional, verifique se a API está disponível antes de a utilizar:

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

Desta forma, a sua integração pode simplesmente não fazer nada quando o Verité não estiver instalado.

3. Filtre a mensagem

Antes de o seu sistema de chat personalizado enviar uma mensagem, passe-a pelo VeriteFilter:

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

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

É tudo o que é necessário para uma integração básica.

check() passa a mensagem pelo filtro do Verité e regista a sinalização associada ao jogador. Se .blocks() devolver true, o seu sistema de chat deverá impedir o envio da mensagem.

Utilizar a categoria do filtro

Por vezes, poderá querer saber por que motivo o Verité detetou uma mensagem:

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

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

    case SELF_HARM, ABUSE -> {
        // Tratar de forma adequada
    }

    default -> {
        // Conteúdo bloqueado comum
    }
}

Os resultados possíveis são:

  • CLEAN
  • BLOCK
  • PROFANITY
  • SELF_HARM
  • ABUSE

Qualquer resultado exceto CLEAN faz com que .blocks() devolva true.

Importante: SELF_HARM e ABUSE existem para permitir que estas mensagens sejam tratadas de forma diferente das violações comuns das regras. Recomendamos que não sejam automaticamente tratadas como infrações de chat passíveis de punição.

Detetar mensagens repetidas

Se o seu sistema de chat precisar de distinguir conteúdo filtrado da deteção de mensagens repetidas, utilize a sobrecarga com deteção de repetição:

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() fornece a categoria normal do filtro, enquanto outcome.repeat() indica se a mensagem foi bloqueada por ser repetida.

Filtrar outros conteúdos dos utilizadores

A API não está limitada ao chat.

Se o seu plugin aceitar conteúdo escrito pelos utilizadores, como alcunhas, prefixos, etiquetas de equipa ou campos semelhantes, pode passá-lo pelo mesmo filtro:

if (VeriteFilter.check(player.getUniqueId(), nickname).blocks()) {
    // Rejeitar a alcunha
}

Para texto que não pertença a um jogador específico, utilize VeriteFilter.ANONYMOUS:

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

As verificações anónimas continuam a devolver a categoria de filtro adequada, mas não adicionam uma sinalização ao registo de nenhum jogador.


Utilizar o Verité com Skript

Se o seu sistema de chat personalizado estiver escrito em Skript, não precisa de interagir com a API Java.

Com Verité e Skript instalados, a sintaxe de filtragem do Verité fica automaticamente disponível.

Filtrar chat personalizado

Se o seu script já tratar do envio das mensagens de chat, verifique a mensagem antes de a enviar:

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

Incluir for player indica ao Verité quem enviou a mensagem e regista a sinalização associada a esse jogador.

Sem um jogador:

if {_text} is blocked:
    # Rejeitar o texto

O Verité efetua uma verificação pura do filtro sem registar uma sinalização. Isto é útil para elementos como nomes, etiquetas, placas ou outro texto que não deva contar contra um jogador específico.

Verificar por que motivo uma mensagem foi bloqueada

Para maior controlo, obtenha o resultado do filtro:

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

if {_result} is "self_harm":
    # Tratar separadamente
    stop

if {_result} is "abuse":
    # Tratar separadamente
    stop

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

O resultado será um dos seguintes:

clean, block, profanity, self_harm ou abuse

Importante: Considere tratar self_harm e abuse separadamente das violações comuns de moderação, em vez de punir automaticamente o jogador.

Verificar o número de sinalizações de um jogador

Também pode obter o número de mensagens que o Verité sinalizou para um jogador:

set {_flags} to message flags of player

Isto pode ser utilizado pelo seu próprio sistema de moderação caso pretenda comportamentos diferentes para violações repetidas.

Referência da sintaxe do Skript

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

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

block message

message flags of %player%

O jogador opcional é importante:

Com um jogador: o resultado do filtro é registado para esse jogador.

Sem um jogador: o Verité apenas verifica o texto e não regista uma sinalização.


Referência da API

A API pública encontra-se em:

teacommontea.api

A classe principal para integrações de chat é:

VeriteFilter

Os métodos úteis incluem:

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 pode ser utilizado ao filtrar texto que não esteja associado a um jogador.

O Verité também disponibiliza os seus utilitários de normalização para integrações que deles necessitem, incluindo normalização de acentos, remoção de entidades, redução de caracteres repetidos, fingerprinting e remoção de caracteres nas extremidades. Estas funções são thread-safe e, de modo geral, não precisam de ser chamadas manualmente antes de utilizar check().

Para a maioria das integrações de chat personalizado, tudo o que precisa é:

if (VeriteFilter.check(player.getUniqueId(), message).blocks()) {
    // Não enviar a mensagem
}

O Verité trata do resto.