# Referência da API para programadores

O Verité expõe uma API Java pública e estável no pacote `teacommontea.api`. Cada subsistema é uma fachada de métodos estáticos sobre tipos públicos estáveis, por isso pode fazer tudo o que o plugin faz sem nunca referenciar uma classe de implementação interna.

Esta página é a superfície completa, organizada para consulta. Dois temas têm os seus próprios guias dedicados e são apenas referenciados aqui:

- O filtro de chat: [Integração de chat personalizado](page:developers/wiring).
- Aplicação de silenciamentos, modo lento e congelamento: [Aplicação de moderação personalizada](page:developers/moderation-enforcement).

## Começar

### Adicione o Verité como dependência opcional

Adicione o Verité ao seu `plugin.yml` para que carregue antes do seu plugin quando instalado, sem se tornar obrigatório:

```yaml
softdepend:
  - Verite
```

### Proteção quanto à disponibilidade

Se o Verité for opcional, verifique se existe uma classe antes de tocar na API:

```java
private static final boolean VERITE_AVAILABLE;

static {
    boolean available;
    try {
        Class.forName("teacommontea.api.VeriteAPI");
        available = true;
    } catch (ClassNotFoundException ignored) {
        available = false;
    }
    VERITE_AVAILABLE = available;
}
```

Cada subsistema também se degrada por conta própria: quando o módulo de suporte está desativado, os métodos de consulta devolvem `null`, `false` ou uma coleção vazia, as chamadas de mutação tornam-se inócuas e as chamadas de emissão devolvem um resultado falhado. Raramente tem de tratar um módulo desativado como caso especial.

## VeriteAPI

`VeriteAPI` é o único ponto de entrada abrangente. Reporta a versão da API, reporta que módulos estão ativados e devolve a classe de cada subsistema para descoberta.

| Membro | Devolve | Significado |
| --- | --- | --- |
| `VeriteAPI.VERSION` | `String` | A string da versão da API. |
| `moderationEnabled()` | `boolean` | Se o módulo de moderação está carregado. |
| `vanishEnabled()` | `boolean` | Se o módulo de vanish está carregado. |
| `captchaEnabled()` | `boolean` | Se o módulo de captcha está carregado. |
| `moderation()` | `Class<VeriteModeration>` | A classe do subsistema de moderação. |
| `playerData()` | `Class<VeritePlayerData>` | A classe do subsistema de dados de jogadores. |
| `store()` | `Class<VeriteStore>` | A classe do subsistema de armazenamento. |
| `vanish()` | `Class<VeriteVanish>` | A classe do subsistema de vanish. |
| `captcha()` | `Class<VeriteCaptcha>` | A classe do subsistema de captcha. |
| `filter()` | `Class<VeriteFilter>` | A classe do subsistema de filtro de chat. |
| `text()` | `Class<VeriteText>` | A classe do subsistema de formatação de texto. |

Todos os subsistemas são fachadas estáticas, por isso chama-os diretamente (por exemplo `VeriteModeration.isBanned(uuid)`). Os métodos de acesso existem para descoberta e verificações centralizadas de estado ativado.

## VeriteModeration

O ponto de entrada completo para emitir, consultar e levantar castigos. `durationMillis` utiliza `Punishment.PERMANENT` para um castigo permanente. Os métodos de porta devolvem `true` quando pararam o jogador. Consulte [Aplicação de moderação personalizada](page:developers/moderation-enforcement) para o fluxo de trabalho de portas e ouvintes em profundidade.

### Estado e consultas

| Método | Devolve | Significado |
| --- | --- | --- |
| `enabled()` | `boolean` | Se o módulo de moderação está carregado. |
| `isBanned(UUID player)` | `boolean` | Se o jogador tem um banimento ativo. |
| `isMuted(UUID player)` | `boolean` | Se o jogador tem um silenciamento ativo. |
| `activeBan(UUID player)` | `Punishment` | O banimento ativo, ou `null`. |
| `activeMute(UUID player)` | `Punishment` | O silenciamento ativo, ou `null`. |
| `history(UUID player, int limit)` | `List<Punishment>` | Histórico de castigos recente do jogador. |
| `byIp(String ip, int limit)` | `List<Punishment>` | Castigos registados contra um ip. |
| `byStaff(UUID staff, int limit)` | `List<Punishment>` | Castigos emitidos por um membro do pessoal. |
| `activeWarnings(UUID player)` | `List<Punishment>` | Avisos atualmente ativos do jogador. |
| `activePunishments()` | `List<ActivePunishment>` | Ponteiros leves para todos os castigos ativos. |
| `activeOfType(PunishmentType type, long now)` | `List<Punishment>` | Castigos ativos de um tipo num dado momento. |
| `loadPunishment(long id)` | `Punishment` | O registo completo de um id numérico, ou `null`. |
| `altsOf(UUID player)` | `List<UUID>` | Contas que partilham o primeiro ip conhecido do jogador. |
| `pruneHistory(UUID player, long cutoff, long now)` | `int` | Remove o histórico mais antigo do que o corte, devolve a quantidade removida. |
| `warningExpire()` | `long` | A janela de expiração de avisos em milissegundos. |

### Emitir castigos

| Método | Devolve |
| --- | --- |
| `ban(UUID target, String targetName, String reason, UUID executor, String executorName, long durationMillis, boolean silent)` | `PunishmentResult` |
| `mute(UUID target, String targetName, String reason, UUID executor, String executorName, long durationMillis, boolean silent)` | `PunishmentResult` |
| `ipban(UUID target, String ip, String targetName, String reason, UUID executor, String executorName, long durationMillis, boolean silent)` | `PunishmentResult` |
| `ipmute(UUID target, String ip, String targetName, String reason, UUID executor, String executorName, long durationMillis, boolean silent)` | `PunishmentResult` |
| `warn(UUID target, String targetName, String reason, UUID executor, String executorName, boolean silent)` | `PunishmentResult` |
| `kick(UUID target, String targetName, String reason, UUID executor, String executorName, boolean silent)` | `PunishmentResult` |

### Levantar castigos

| Método | Devolve | Significado |
| --- | --- | --- |
| `unban(UUID target, String targetName, UUID remover, String removerName, String reason)` | `boolean` | Levanta o banimento ativo, `true` em caso de sucesso. |
| `unmute(UUID target, String targetName, UUID remover, String removerName, String reason)` | `boolean` | Levanta o silenciamento ativo, `true` em caso de sucesso. |
| `unwarn(UUID target, String targetName, UUID removedBy, String removedByName, String reason)` | `PunishmentResult` | Remove um aviso. |

### Renderização e avisos

| Método | Devolve | Significado |
| --- | --- | --- |
| `banScreen(Punishment ban)` | `String` | O ecrã de banimento completo para um registo de banimento. |
| `muteLine(Punishment mute)` | `String` | O resumo de uma linha do silenciamento. |
| `muteNotice(Punishment mute)` | `String` | O aviso de silenciamento enviado a um jogador silenciado. |

### Portas de chat

Cada porta devolve `true` quando o jogador deve ser parado e envia-lhe o motivo como efeito secundário. Use-as onde pretende aplicar.

| Método | Devolve | Significado |
| --- | --- | --- |
| `muteGate(Player p)` | `boolean` | O jogador está silenciado; envia o aviso de silenciamento. |
| `chatMuteGate(Player p)` | `boolean` | O congelamento global do chat está ativo; envia o aviso de congelamento. |
| `slowmodeGate(Player p)` | `boolean` | O jogador está retido pelo modo lento; envia a espera restante. |

### Comandos de chat

Estes acionam os próprios comandos de chat do plugin para um `CommandSender`.

| Método | Significado |
| --- | --- |
| `broadcast(CommandSender sender, String[] args)` | Envia uma difusão. |
| `chatClear(CommandSender sender)` | Limpa o chat. |
| `chatMute(CommandSender sender)` | Alterna o congelamento global do chat. |
| `slowmode(CommandSender sender, String[] args)` | Define o modo lento. |

### Ouvinte

| Método | Significado |
| --- | --- |
| `registerListener(ModerationListener listener)` | Subscrever a atividade de castigos. |
| `unregisterListener(ModerationListener listener)` | Deixar de receber eventos. |

## VeritePlayerData

Ler e registar os dados de conta, sessão e identidade que o sistema de moderação armazena. Os carimbos temporais são milissegundos epoch. Quando o módulo está desativado, as consultas devolvem `null` ou vazio e as chamadas de registo são inócuas.

| Método | Devolve | Significado |
| --- | --- | --- |
| `enabled()` | `boolean` | Se o armazenamento de dados está aberto. |
| `hasProfile(UUID player)` | `boolean` | Se existe um perfil. |
| `profile(UUID player)` | `PlayerProfile` | O perfil completo, ou `null`. |
| `uuidByName(String name)` | `UUID` | Resolver um uuid a partir de um nome. |
| `nameOf(UUID player)` | `String` | Resolver o nome atual a partir de um uuid. |
| `knownNames()` | `List<String>` | Todos os nomes conhecidos no armazenamento. |
| `namesOf(UUID player)` | `List<String>` | Todos os nomes que um jogador utilizou. |
| `ipsOf(UUID player)` | `List<String>` | Todos os ips a partir dos quais um jogador se ligou. |
| `usersOfIp(String ip)` | `List<UUID>` | Todos os utilizadores que partilharam um ip. |
| `clientsOf(UUID player)` | `List<String>` | Todos os clientes que um jogador utilizou. |
| `recordLogin(UUID player, String name, String ip, long now)` | `void` | Registar um login. |
| `recordClient(UUID player, String brand, int protocol, String referrer, long now)` | `void` | Registar a marca e o protocolo do cliente. |
| `flushSession(UUID player, long now)` | `void` | Descarregar a sessão do jogador. |
| `recordLogout(UUID player, long now)` | `void` | Registar um logout. |

## VeriteStore e VeriteScope

`VeriteStore` abre âmbitos de dados nomeados no armazenamento persistente de chave-valor partilhado do plugin, para que o seu plugin possa persistir dados juntamente com o Verité sem uma base de dados própria. Atribua espaços de nome aos seus âmbitos para evitar colisões com os dados do plugin.

| Método de `VeriteStore` | Devolve | Significado |
| --- | --- | --- |
| `available()` | `boolean` | Se o armazenamento está aberto. |
| `scope(String name)` | `VeriteScope` | Abre um âmbito nomeado, ou `null` se indisponível. |

Um `VeriteScope` é uma área nomeada que lê e escreve livremente. As escritas persistem através do ciclo normal de descarga do plugin.

| Método de `VeriteScope` | Devolve | Significado |
| --- | --- | --- |
| `set(String key, Object value)` | `void` | Armazenar um valor sob uma chave. |
| `delete(String key)` | `void` | Remover uma chave. |
| `has(String key)` | `boolean` | Testar a presença de uma chave. |
| `get(String key)` | `Object` | O valor armazenado em bruto. |
| `getString(String key, String def)` | `String` | Leitura tipada com predefinição. |
| `getLong(String key, long def)` | `long` | Leitura tipada com predefinição. |
| `getInt(String key, int def)` | `int` | Leitura tipada com predefinição. |
| `getBoolean(String key, boolean def)` | `boolean` | Leitura tipada com predefinição. |
| `getBigDecimal(String key)` | `BigDecimal` | Leitura tipada. |
| `entries()` | `List<ScopeEntry>` | Todos os pares chave-valor no âmbito. |

```java
VeriteScope scope = VeriteStore.scope("myplugin");
if (scope != null) {
    scope.set("greeting", "hello");
    String greeting = scope.getString("greeting", "");
}
```

## VeriteVanish

Estado e controlo do vanish do pessoal. `vanish`, `unvanish` e `toggle` devolvem `true` quando o estado realmente mudou. Quando o módulo está desativado, as consultas devolvem `false` ou vazio e as chamadas de mutação são inócuas.

| Método | Devolve | Significado |
| --- | --- | --- |
| `enabled()` | `boolean` | Se o módulo de vanish está carregado. |
| `isVanished(UUID player)` | `boolean` | Se um jogador está em vanish. |
| `isVanished(Player player)` | `boolean` | Sobrecarga de conveniência para um jogador online. |
| `getVanished()` | `Set<UUID>` | Todos os jogadores atualmente em vanish. |
| `vanish(Player p)` | `boolean` | Colocar um jogador em vanish. |
| `unvanish(Player p)` | `boolean` | Retirar um jogador do vanish. |
| `toggle(Player p)` | `boolean` | Alternar o estado de vanish de um jogador. |
| `registerPlaceholders()` | `void` | Registar a expansão do vanish para o PlaceholderAPI. |
| `registerListener(VanishListener listener)` | `void` | Subscrever as alterações de vanish. |
| `unregisterListener(VanishListener listener)` | `void` | Deixar de receber eventos de vanish. |

## VeriteCaptcha

Emitir e acompanhar desafios de captcha. Os métodos `challenge` devolvem `true` quando um desafio foi realmente iniciado. O rótulo `source` regista por que motivo o desafio foi aberto e é transportado até aos eventos de conclusão e de pedido de castigo. Quando o módulo está desativado, todas as chamadas devolvem `false`.

| Membro | Devolve | Significado |
| --- | --- | --- |
| `VeriteCaptcha.BYPASS_PERMISSION` | `String` | O nó de permissão que ignora o captcha. |
| `VeriteCaptcha.NOTIFY_PERMISSION` | `String` | O nó de permissão de notificação de captcha. |
| `enabled()` | `boolean` | Se o módulo de captcha está carregado. |
| `isActive(UUID player)` | `boolean` | Se um desafio está ativo para o jogador. |
| `challengeStandard(Player player, String source)` | `boolean` | Abrir um desafio padrão. |
| `challengeDetailed(Player player, String source)` | `boolean` | Abrir um desafio detalhado. |
| `challenge(Player player, CaptchaType type, String source)` | `boolean` | Abrir um desafio de um tipo explícito. |

## VeriteFilter

O filtro de chat consciente de evasão. O fluxo de trabalho completo, incluindo verificações anónimas, verificações com deteção de repetição e os auxiliares de mensagem de bloqueio, está documentado em [Integração de chat personalizado](page:developers/wiring). A superfície:

| Membro | Devolve | Significado |
| --- | --- | --- |
| `VeriteFilter.ANONYMOUS` | `UUID` | Passe como o jogador quando não há infrator a registar. |
| `check(UUID player, String message)` | `FilterResult` | Classificar uma mensagem e registar o acerto contra o jogador. |
| `check(UUID player, String message, boolean repeatAware)` | `FilterOutcome` | Classificação com deteção de repetição. |
| `count(UUID player)` | `int` | Quantas vezes um jogador foi sinalizado. |
| `blockMessage()` | `String` | A mensagem de bloqueio configurada. |
| `repeatMessage()` | `String` | O aviso de mensagem repetida configurado. |
| `selfHarmMessage()` | `String` | O aviso de automutilação configurado. |
| `blockNotice(FilterResult result, String message)` | `BaseComponent[]` | O componente de aviso renderizado para um resultado. |
| `foldAccents(String s)` | `String` | Auxiliar de normalização: remover acentos. |
| `stripDeletes(String s)` | `String` | Auxiliar de normalização: remover caracteres de largura zero e de eliminação. |
| `stripEntities(String s)` | `String` | Auxiliar de normalização: remover entidades ao estilo html. |
| `reduceRuns(String s, int max)` | `String` | Auxiliar de normalização: colapsar letras repetidas. |
| `fingerprint(String word)` | `String` | Assinatura de letras independente da ordem para correspondência de transposição. |
| `trimEdges(String word)` | `String` | Cortar as extremidades não alfabéticas de uma palavra. |

Os auxiliares de normalização são funções puras e é seguro chamá-los fora da thread principal.

## VeriteText

Analisar texto com etiquetas do Verite e aplicar o prefixo do plugin da forma que o plugin faz, para que a sua saída fique estilizada de forma idêntica.

| Método | Devolve | Significado |
| --- | --- | --- |
| `parse(String tagged)` | `BaseComponent[]` | Analisar etiquetas do Verite num array de componentes. |
| `prefixed(String tagged)` | `BaseComponent[]` | Analisar e antepor o prefixo do plugin. |
| `prefix()` | `String` | O prefixo atual. |
| `setPrefix(String prefix)` | `void` | Alterar o prefixo. |

## Utilitários

### VeriteGeoIp

Consultar o país de um ip e verificar o estado da base de dados GeoIP.

| Método | Devolve | Significado |
| --- | --- | --- |
| `country(String ip)` | `String` | Nome do país de um ip, ou `null` se não resolvido. |
| `available()` | `boolean` | Se a base de dados GeoIP foi carregada. |
| `isPrivate(String ip)` | `boolean` | Se um ip está num intervalo privado ou reservado. |
| `attempted()` | `boolean` | Se foi tentado um carregamento da base de dados. |

### VeriteDuration

Analisar e formatar durações de castigo humanas, com constantes de unidade em milissegundos: `SECOND`, `MINUTE`, `HOUR`, `DAY`, `WEEK`, `MONTH`, `YEAR`.

| Método | Devolve | Significado |
| --- | --- | --- |
| `suggestions()` | `List<String>` | Tokens de duração sugeridos. |
| `parse(String token)` | `long` | Analisar um token como `7d` em milissegundos. |
| `parseTwoToken(String number, String unitWord)` | `long` | Analisar um número e uma palavra de unidade separados em milissegundos. |
| `format(long millis)` | `String` | Formatar milissegundos numa string humana. |

### VeriteFormat

Formatar tempos, pluralizar substantivos e nomear versões de protocolo de cliente.

| Método | Devolve | Significado |
| --- | --- | --- |
| `fancyTime(long millis)` | `String` | Um intervalo em milissegundos como string humana. |
| `plural(long count, String noun)` | `String` | Uma contagem com o substantivo singular ou plural correto. |
| `pluralize(long count, String noun)` | `String` | Uma contagem com o substantivo singular ou plural correto. |
| `versionName(int protocol)` | `String` | O nome da versão do Minecraft para um número de protocolo de cliente. |

### VeriteLimits

Aplicar os mesmos limites de duração e tempos de espera por emissor que o plugin aplica.

| Método | Devolve | Significado |
| --- | --- | --- |
| `capDuration(CommandSender issuer, PunishmentType type, long requested)` | `DurationCheck` | Validar uma duração pedida e devolver o valor limitado. |
| `cooldownRemaining(CommandSender issuer, PunishmentType type, long now)` | `long` | Milissegundos até que o emissor possa atuar novamente. |
| `markUsed(CommandSender issuer, PunishmentType type, long now)` | `void` | Registar que um emissor usou a sua quota. |

### VeriteMojang

Resolver um nome de utilizador do Minecraft contra a Mojang, utilizando o mesmo caminho e cache que o plugin utiliza.

| Método | Devolve | Significado |
| --- | --- | --- |
| `lookup(String name)` | `MojangProfile` | Resolver um nome para um uuid, nome canónico e estado. |

### VeriteExempt

Verificar se um emissor está impedido de castigar um alvo.

| Método | Devolve | Significado |
| --- | --- | --- |
| `blockReason(CommandSender issuer, UUID target, PunishmentType type)` | `String` | O motivo pelo qual o castigo não é permitido, ou `null` quando permitido. |

### VeriteLockdown

Consultar e controlar o estado de bloqueio do servidor. Abordado em contexto em [Aplicação de moderação personalizada](page:developers/moderation-enforcement).

| Método | Devolve | Significado |
| --- | --- | --- |
| `active()` | `boolean` | Se um bloqueio está em vigor. |
| `reason()` | `String` | O motivo atual do bloqueio. |
| `begin(String why)` | `void` | Iniciar um bloqueio com um motivo. |
| `end()` | `void` | Limpar o bloqueio. |

### VeriteConfig

Ler a configuração efetiva do módulo de moderação.

| Método | Devolve | Significado |
| --- | --- | --- |
| `banAlts()` | `boolean` | Se as contas alt são banidas. |
| `muteCommandBlacklist()` | `List<String>` | Comandos bloqueados enquanto silenciado. |
| `warningExpire()` | `long` | A janela de expiração de avisos em milissegundos. |
| `useGroupWeights()` | `boolean` | Se os pesos de grupo são utilizados. |
| `permitSameWeight()` | `boolean` | Se as ações de peso igual são permitidas. |
| `reduceToLimit()` | `boolean` | Se as durações reduzem ao limite do emissor. |
| `dupeipScanLimit()` | `int` | O limite de análise de dupeip. |
| `yaml()` | `YamlConfiguration` | A configuração de suporte em bruto. |

## Tipos

### Punishment

Um registo de moderação imutável. `PERMANENT` é o carimbo temporal de fim sentinela para um castigo permanente (`-1L`). `GLOBAL_SCOPE` é o âmbito curinga (`"*"`). Os carimbos temporais são milissegundos epoch. Um ip de alvo `null` significa que o castigo é de âmbito uuid em vez de âmbito ip.

Acessores: `id()`, `randomId()`, `type()`, `uuid()`, `ip()`, `reason()`, `executorUuid()`, `executorName()`, `removedByUuid()`, `removedByName()`, `removalReason()`, `dateStart()`, `dateEnd()`, `serverScope()`, `serverOrigin()`, `template()`, `silent()`, `ipban()`, `active()`.

Auxiliares derivados:

| Método | Devolve | Significado |
| --- | --- | --- |
| `permanent()` | `boolean` | Se `dateEnd` é `PERMANENT`. |
| `expired(long now)` | `boolean` | Se um castigo temporário passou o seu fim. |
| `inForce(long now)` | `boolean` | Se o registo está ativo e não expirado. |
| `duration()` | `long` | Duração total, ou `PERMANENT`. |
| `remaining(long now)` | `long` | Milissegundos restantes, ou `PERMANENT`. |
| `hasTemplate()` | `boolean` | Se o registo carrega um modelo. |

### PunishmentType

Enum: `BAN`, `MUTE`, `WARNING`, `KICK`.

| Método | Devolve | Significado |
| --- | --- | --- |
| `id()` | `String` | O nome em minúsculas da localidade raiz. |
| `PunishmentType.of(String s)` | `PunishmentType` | Analisar a forma em minúsculas de volta, sem distinção de maiúsculas. |

### PunishmentResult

Record: `PunishmentResult(boolean ok, Punishment entry, String error)`. Em caso de sucesso `ok` é `true`, `entry` contém o castigo resultante e `error` é `null`. Em caso de falha `entry` é `null` e `error` contém o motivo.

### ActivePunishment

Record: `ActivePunishment(PunishmentType type, UUID uuid, long entryId)`. Um ponteiro leve; carregue o registo completo com `VeriteModeration.loadPunishment(entryId)`.

### FilterResult

Enum: `CLEAN`, `BLOCK`, `SELF_HARM`, `ABUSE`, `PROFANITY`. `blocks()` devolve `true` para qualquer coisa que não seja `CLEAN`. Uma mensagem parada por repetir uma recente reporta-se aqui como `BLOCK`; use a sobrecarga `check` com deteção de repetição para as distinguir. `SELF_HARM` e `ABUSE` marcam um falante que pode estar em crise; não os trate como violações comuns das regras.

### FilterOutcome

O valor de `VeriteFilter.check(player, message, true)`.

| Método | Devolve | Significado |
| --- | --- | --- |
| `category()` | `FilterResult` | A categoria de filtro comum, nunca `null`. |
| `repeat()` | `boolean` | Se o bloqueio foi uma repetição (só é `true` quando `category()` é `BLOCK`). |
| `blocks()` | `boolean` | Se a mensagem deve ser descartada. |

### PlayerProfile

Record com campos: `uuid`, `name`, `names`, `ips`, `lastIp`, `clients`, `lastClient`, `protocol`, `referrer`, `firstJoin`, `lastSeen`, `joinCount`, `playtimeMs`, `online`, `punishments`. Os carimbos temporais são milissegundos epoch. Os campos de lista nunca são `null` mas podem estar vazios.

### MojangProfile e MojangStatus

`MojangProfile(UUID uuid, String name, MojangStatus status)`. Quando `status` não é `FOUND`, `uuid` e `name` são `null`.

`MojangStatus`: `FOUND` (resolvido), `NOT_FOUND` (a Mojang confirmou não existir tal conta), `UNKNOWN` (a consulta não pôde ser concluída, por exemplo um erro de rede).

### DurationCheck

Record: `DurationCheck(boolean ok, long durationMillis, String error)`. Quando `ok`, `durationMillis` contém a duração possivelmente limitada a aplicar e `error` é `null`. Quando não `ok`, `error` explica a rejeição.

### ScopeEntry

Record: `ScopeEntry(String key, Object value)`. Um par chave-valor de um âmbito de armazenamento.

### CaptchaType e CaptchaOutcomeType

`CaptchaType`: `STANDARD` (um desafio rápido e de baixo atrito), `DETAILED` (um desafio mais rigoroso de vários passos).

`CaptchaOutcomeType`: `PASS`, `FAIL`, `TIMEOUT`.

## Ouvintes

### ModerationListener

Implemente e registe através de `VeriteModeration.registerListener`. Todos os métodos são inócuos por predefinição, por isso sobreponha apenas o que precisar. Os callbacks podem correr na thread principal do servidor; não bloqueie.

| Método | Dispara quando |
| --- | --- |
| `entryAdded(Punishment punishment)` | Um castigo é emitido. |
| `entryRemoved(Punishment punishment)` | Um castigo é levantado, perdoado ou expira. |
| `broadcastSent(String message, String target)` | O sistema de moderação envia uma difusão. |

### VanishListener

Implemente e registe através de `VeriteVanish.registerListener`. Inócuos por predefinição; não bloqueie nos callbacks.

| Método | Dispara quando |
| --- | --- |
| `vanished(UUID player)` | Um jogador entra em vanish. |
| `unvanished(UUID player)` | Um jogador sai do vanish. |
