Zum Inhalt

Integration benutzerdefinierter Chat-Systeme

Verité filtert Nachrichten normalerweise automatisch. Einige Chat-Plugins fangen jedoch das normale Chat-Ereignis von Minecraft ab und übernehmen die Nachrichtenzustellung selbst.

Wenn dein Plugin dies tut, erhält Verité die ursprüngliche Nachricht möglicherweise nie und kann sie daher nicht filtern. In diesem Fall solltest du die Nachricht durch Verité prüfen lassen, bevor dein Plugin sie sendet.

Du benötigst diese Anleitung nur, wenn dein Plugin den normalen Minecraft-Chat verarbeitet oder ersetzt. Server, die den Standard-Chat verwenden, benötigen keine zusätzliche Einrichtung.

Java-Integration

Verité stellt eine kleine öffentliche API bereit, die speziell für Integrationen wie benutzerdefinierte Chat-Systeme vorgesehen ist.

1. Verité als optionale Abhängigkeit hinzufügen

Füge Verité zu deiner plugin.yml hinzu:

softdepend:
  - Verite

Eine optionale Abhängigkeit stellt sicher, dass Verité vor deiner Integration geladen wird, sofern es installiert ist, ohne Verité zu einer zwingenden Voraussetzung für den Start deines Plugins zu machen.

2. Prüfen, ob die API verfügbar ist

Wenn Verité optional ist, prüfe vor der Verwendung, ob die API verfügbar ist:

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

Deine Integration kann dann einfach nichts tun, wenn Verité nicht installiert ist.

3. Die Nachricht filtern

Bevor dein benutzerdefiniertes Chat-System eine Nachricht sendet, übergib sie an VeriteFilter:

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

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

Mehr ist für eine grundlegende Integration nicht erforderlich.

check() lässt die Nachricht durch den Filter von Verité laufen und zeichnet die Meldung für den Spieler auf. Wenn .blocks() den Wert true zurückgibt, sollte dein Chat-System verhindern, dass die Nachricht gesendet wird.

Die Filterkategorie verwenden

Manchmal möchtest du wissen, warum Verité eine Nachricht erkannt hat:

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

switch (result) {
    case CLEAN -> {
        // Normal senden
    }

    case SELF_HARM, ABUSE -> {
        // Angemessen behandeln
    }

    default -> {
        // Gewöhnlicher blockierter Inhalt
    }
}

Folgende Ergebnisse sind möglich:

  • CLEAN
  • BLOCK
  • PROFANITY
  • SELF_HARM
  • ABUSE

Bei jedem Ergebnis außer CLEAN gibt .blocks() den Wert true zurück.

Wichtig: SELF_HARM und ABUSE sind dafür vorgesehen, diese Nachrichten anders als gewöhnliche Regelverstöße behandeln zu können. Wir empfehlen, sie nicht automatisch als strafbare Chat-Verstöße zu behandeln.

Wiederholte Nachrichten erkennen

Wenn dein Chat-System zwischen gefilterten Inhalten und der Erkennung wiederholter Nachrichten unterscheiden muss, verwende die wiederholungssensitive Überladung:

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() liefert die normale Filterkategorie, während outcome.repeat() angibt, ob die Nachricht blockiert wurde, weil sie wiederholt wurde.

Andere Benutzerinhalte filtern

Die API ist nicht auf den Chat beschränkt.

Wenn dein Plugin von Benutzern verfasste Inhalte wie Spitznamen, Präfixe, Team-Tags oder ähnliche Felder akzeptiert, kannst du diese durch denselben Filter prüfen lassen:

if (VeriteFilter.check(player.getUniqueId(), nickname).blocks()) {
    // Spitznamen ablehnen
}

Verwende für Text, der keinem bestimmten Spieler zugeordnet ist, VeriteFilter.ANONYMOUS:

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

Anonyme Prüfungen geben weiterhin die entsprechende Filterkategorie zurück, fügen aber dem Datensatz keines Spielers eine Meldung hinzu.


Verité mit Skript verwenden

Wenn dein benutzerdefiniertes Chat-System in Skript geschrieben ist, musst du nicht mit der Java-API interagieren.

Wenn Verité und Skript installiert sind, steht die Filtersyntax von Verité automatisch zur Verfügung.

Benutzerdefinierten Chat filtern

Wenn dein Skript das Senden von Chatnachrichten bereits selbst übernimmt, prüfe die Nachricht vor dem Senden:

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

Mit for player teilst du Verité mit, wer die Nachricht gesendet hat, und die Meldung wird für diesen Spieler aufgezeichnet.

Ohne Spieler:

if {_text} is blocked:
    # Text ablehnen

Verité führt eine reine Filterprüfung durch, ohne eine Meldung aufzuzeichnen. Dies ist beispielsweise für Namen, Tags, Schilder oder andere Texte nützlich, die keinem bestimmten Spieler als Verstoß angerechnet werden sollen.

Prüfen, warum eine Nachricht blockiert wurde

Für mehr Kontrolle kannst du das Filterergebnis abrufen:

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

if {_result} is "self_harm":
    # Separat behandeln
    stop

if {_result} is "abuse":
    # Separat behandeln
    stop

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

Das Ergebnis ist einer der folgenden Werte:

clean, block, profanity, self_harm oder abuse

Wichtig: Erwäge, self_harm und abuse getrennt von gewöhnlichen Moderationsverstößen zu behandeln, anstatt den Spieler automatisch zu bestrafen.

Anzahl der Meldungen eines Spielers prüfen

Du kannst außerdem abrufen, wie viele Nachrichten Verité für einen Spieler markiert hat:

set {_flags} to message flags of player

Dein eigenes Moderationssystem kann diesen Wert verwenden, wenn du bei wiederholten Verstößen ein anderes Verhalten möchtest.

Skript-Syntaxreferenz

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

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

block message

message flags of %player%

Der optionale Spieler ist von Bedeutung:

Mit einem Spieler: Das Filterergebnis wird für diesen Spieler aufgezeichnet.

Ohne Spieler: Verité prüft nur den Text und zeichnet keine Meldung auf.


API-Referenz

Die öffentliche API befindet sich unter:

teacommontea.api

Die primäre Klasse für Chat-Integrationen ist:

VeriteFilter

Zu den nützlichen Methoden gehören:

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 kann beim Filtern von Text verwendet werden, der keinem Spieler zugeordnet ist.

Verité stellt außerdem seine Normalisierungsfunktionen für Integrationen zur Verfügung, die diese benötigen. Dazu gehören Akzentnormalisierung, Entfernung von Entities, Reduzierung wiederholter Zeichen, Fingerprinting und das Bereinigen der Textenden. Diese Funktionen sind thread-safe und müssen im Allgemeinen nicht manuell aufgerufen werden, bevor check() verwendet wird.

Für die meisten benutzerdefinierten Chat-Integrationen benötigst du lediglich:

if (VeriteFilter.check(player.getUniqueId(), message).blocks()) {
    // Nachricht nicht senden
}

Verité übernimmt den Rest.