API
A API fornece uma interface pública para desenvolvedores integrarem seus plugins ao sistema de integração com Discord do yDiscordHook, permitindo enviar mensagens e embeds para jogadores Discord.
Obtendo a instância da API
A API é exposta através de um BukkitService assim como feito comumente no Vault.
Exemplo:
DiscordAPIHolder discordAPI;
try {
RegisteredServiceProvider<DiscordAPIHolder> rsp = Bukkit.getServer().getServicesManager().getRegistration(DiscordAPIHolder.class);
return rsp == null ? null : (DiscordAPIHolder)rsp.getProvider();
} catch (Throwable t) {
return null;
}
Métodos disponíveis
getPlayer(String playerName)
Recupera os dados Discord de um jogador pelo nome.
PlayerDcHolder playerDc = discordAPI.getPlayer("Steve");Parâmetros:
playerName- Nome do jogador
Retorno:
PlayerDcHoldercontendo dados Discord do jogador ounullse não encontrado/não vinculado
Observações:
- Retorna
nullse o jogador não tiver Discord vinculado - Acesso seguro aos dados Discord do jogador
getPlayer(Player player)
Recupera os dados Discord de um jogador Bukkit.
PlayerDcHolder playerDc = discordAPI.getPlayer(player);Parâmetros:
player- Objeto Player do Bukkit
Retorno:
PlayerDcHoldercontendo dados Discord do jogador ounullse não encontrado/não vinculado
Observações:
- Converte automaticamente o objeto Player para nome
- Método sobrecarregado para conveniência
sendMessage(PlayerDcHolder playerDc, String message)
Envia uma mensagem de texto simples para o jogador no Discord.
boolean success = discordAPI.sendMessage(playerDc, "Olá, bem-vindo!");Parâmetros:
playerDc- Dados Discord do jogadormessage- Mensagem de texto a enviar
Retorno:
truese a mensagem foi enviada com sucesso,falsecaso contrário
Observações:
- Envia via DM (Direct Message) privado no Discord
- A mensagem é enviada de forma assíncrona
- Retorna false se o jogador não tiver Discord vinculado ou se houver erro
sendEmbed(PlayerDcHolder playerDc, String embed, HashMap<String, String> toReplace)
Envia um embed formatado para o jogador no Discord com substituição de placeholders.
HashMap<String, String> replace = new HashMap<>();
replace.put("{player_name}", "Steve");
replace.put("{level}", "50");
boolean success = discordAPI.sendEmbed(playerDc, "embed_name", replace);Parâmetros:
playerDc- Dados Discord do jogadorembed- Nome do embed configuradotoReplace- HashMap com chave-valor para substituição de placeholders
Retorno:
truese o embed foi enviado com sucesso,falsecaso contrário
Observações:
- Permite personalização dinâmica via placeholders
- Os placeholders no embed são substituídos pelos valores do HashMap
- Retorna false se o embed não existir ou houver erro no envio
sendEmbed(PlayerDcHolder playerDc, String embed, HashMap<String, String> toReplace, String imageBase64)
Envia um embed formatado com imagem personalizada.
HashMap<String, String> replace = new HashMap<>();
replace.put("{player}", "Steve");
boolean success = discordAPI.sendEmbed(playerDc, "rank_embed", replace, base64Image);Parâmetros:
playerDc- Dados Discord do jogadorembed- Nome do embed configuradotoReplace- HashMap com chave-valor para substituição de placeholdersimageBase64- String contendo imagem em base64
Retorno:
truese o embed foi enviado com sucesso,falsecaso contrário
Observações:
- Permite adicionar imagem customizada ao embed
- A imagem deve estar em formato base64
- Útil para enviar prints, troféus, skins, etc.
- Retorna false se houver erro no envio ou conversão de imagem
getJda()
Obtém a instância JDA (Java Discord API) do bot.
JDA jda = discordAPI.getJda();Retorno:
- Instância
JDAdo bot Discord
Observações:
- Fornece acesso direto à API do JDA
- Permite operações avançadas e customizadas
- Útil para desenvolvedores com conhecimento de JDA
- Pode retornar
nullse o bot não estiver inicializado
Estrutura de dados
PlayerDcHolder
Representa os dados Discord de um jogador Minecraft.
Propriedades principais:
- ID Discord do usuário
- Nome do usuário Discord
- Status de vinculação
- Timestamp de vinculação
- Permissões Discord
Boas práticas
- Sempre verifique se
PlayerDcHoldernão énullantes de usar - Use
sendMessage()para notificações simples - Use
sendEmbed()para informações estruturadas e visuais - Valide o HashMap de substituição antes de enviar embeds
- Evite enviar muitas mensagens em curto período (rate limiting)
- Converta imagens para base64 antes de enviar
Exemplos de uso
Enviar notificação simples
PlayerDcHolder playerDc = discordAPI.getPlayer("Steve");
if (playerDc != null) {
discordAPI.sendMessage(playerDc, "Você ganhou 1000 moedas!");
}Enviar embed com placeholders
PlayerDcHolder playerDc = discordAPI.getPlayer(player);
if (playerDc != null) {
HashMap<String, String> replace = new HashMap<>();
replace.put("{player}", player.getName());
replace.put("{level}", String.valueOf(getPlayerLevel(player)));
replace.put("{rank}", getPlayerRank(player));
discordAPI.sendEmbed(playerDc, "level_up", replace);
}Enviar embed com imagem customizada
@EventHandler
public void onPlayerRankUp(PlayerRankUpEvent event) {
Player player = event.getPlayer();
PlayerDcHolder playerDc = discordAPI.getPlayer(player);
if (playerDc != null) {
HashMap<String, String> replace = new HashMap<>();
replace.put("{new_rank}", event.getNewRank());
replace.put("{date}", new SimpleDateFormat("dd/MM/yyyy").format(new Date()));
String skinBase64 = getPlayerSkinBase64(player);
discordAPI.sendEmbed(playerDc, "rank_promotion", replace, skinBase64);
}
}Notificar sobre eventos importantes
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
PlayerDcHolder playerDc = discordAPI.getPlayer(player);
if (playerDc != null) {
HashMap<String, String> replace = new HashMap<>();
replace.put("{player}", player.getName());
replace.put("{time}", new SimpleDateFormat("HH:mm").format(new Date()));
discordAPI.sendEmbed(playerDc, "welcome", replace);
}
}Sistema de recompensas com notificação
public void giveReward(Player player, String rewardName, double amount) {
PlayerDcHolder playerDc = discordAPI.getPlayer(player);
if (playerDc != null) {
HashMap<String, String> replace = new HashMap<>();
replace.put("{reward}", rewardName);
replace.put("{amount}", String.valueOf(amount));
replace.put("{total}", String.valueOf(getPlayerBalance(player)));
discordAPI.sendEmbed(playerDc, "reward_received", replace);
}
addBalance(player.getName(), amount);
}Alertar sobre atividades suspeitas
@EventHandler
public void onMultipleFailedLogins(MultipleFailedLoginsEvent event) {
Player player = event.getPlayer();
PlayerDcHolder playerDc = discordAPI.getPlayer(player);
if (playerDc != null) {
HashMap<String, String> replace = new HashMap<>();
replace.put("{attempts}", String.valueOf(event.getAttempts()));
replace.put("{ip}", event.getIP());
discordAPI.sendEmbed(playerDc, "security_alert", replace);
}
}Integração com sistemas de tickets
public void notifyTicketResponse(Player player, String ticketId, String response) {
PlayerDcHolder playerDc = discordAPI.getPlayer(player);
if (playerDc != null) {
HashMap<String, String> replace = new HashMap<>();
replace.put("{ticket_id}", ticketId);
replace.put("{response}", response);
replace.put("{date}", new SimpleDateFormat("dd/MM/yyyy HH:mm").format(new Date()));
discordAPI.sendEmbed(playerDc, "ticket_response", replace);
}
}Dashboard de sincronização
public void showSyncStatus(Player player) {
PlayerDcHolder playerDc = discordAPI.getPlayer(player);
player.sendMessage("═══════════════════════════");
player.sendMessage("STATUS DISCORD");
player.sendMessage("═══════════════════════════");
if (playerDc != null) {
player.sendMessage("Status: ✓ VINCULADO");
player.sendMessage("Mensagens habilitadas");
// Testar envio
boolean testSuccess = discordAPI.sendMessage(playerDc, "Teste de conexão");
player.sendMessage("Teste de conexão: " + (testSuccess ? "✓" : "✗"));
} else {
player.sendMessage("Status: ✗ NÃO VINCULADO");
player.sendMessage("Digite /discord para vincular sua conta");
}
player.sendMessage("═══════════════════════════");
}Usar JDA diretamente para operações avançadas
JDA jda = discordAPI.getJda();
if (jda != null) {
jda.getTextChannelById("CHANNEL_ID")
.sendMessage("Mensagem customizada do servidor!")
.queue();
}