1+ package com .SaaranshXd .discordbridge ;
2+
3+ import org .bukkit .Bukkit ;
4+ import org .bukkit .ChatColor ;
5+ import org .bukkit .command .Command ;
6+ import org .bukkit .command .CommandSender ;
7+ import org .bukkit .entity .Player ;
8+ import org .bukkit .event .EventHandler ;
9+ import org .bukkit .event .Listener ;
10+ import org .bukkit .event .entity .PlayerDeathEvent ;
11+ import org .bukkit .event .player .AsyncPlayerChatEvent ;
12+ import org .bukkit .event .player .PlayerJoinEvent ;
13+ import org .bukkit .event .player .PlayerQuitEvent ;
14+ import org .bukkit .plugin .java .JavaPlugin ;
15+
16+ import java .io .OutputStream ;
17+ import java .net .HttpURLConnection ;
18+ import java .net .URL ;
19+
20+ public class DiscordBridge extends JavaPlugin implements Listener {
21+
22+ private String webhookUrl ;
23+ private String consoleAvatar ;
24+
25+ @ Override
26+ public void onEnable () {
27+ // Generate /plugins/DiscordBridge/config.yml if missing
28+ saveDefaultConfig ();
29+ loadConfigValues ();
30+
31+ // Register events
32+ Bukkit .getPluginManager ().registerEvents (this , this );
33+
34+ getLogger ().info ("DiscordBridge enabled!" );
35+ }
36+
37+ @ Override
38+ public void onDisable () {
39+ getLogger ().info ("DiscordBridge disabled!" );
40+ }
41+
42+ private void loadConfigValues () {
43+ webhookUrl = getConfig ().getString ("webhook-url" );
44+ consoleAvatar = getConfig ().getString ("console-avatar" );
45+
46+ if (webhookUrl == null || webhookUrl .isEmpty ()) {
47+ getLogger ().warning ("No webhook URL set in config.yml!" );
48+ }
49+ }
50+
51+ @ EventHandler
52+ public void onPlayerChat (AsyncPlayerChatEvent event ) {
53+ Player player = event .getPlayer ();
54+ String message = ChatColor .stripColor (event .getMessage ());
55+ sendWebhook (player .getName (), message , false );
56+ }
57+
58+ @ EventHandler
59+ public void onPlayerJoin (PlayerJoinEvent event ) {
60+ sendWebhook ("[Console]" , event .getPlayer ().getName () + " joined the game!" , true );
61+ }
62+
63+ @ EventHandler
64+ public void onPlayerQuit (PlayerQuitEvent event ) {
65+ sendWebhook ("[Console]" , event .getPlayer ().getName () + " left the game!" , true );
66+ }
67+
68+ @ EventHandler
69+ public void onPlayerDeath (PlayerDeathEvent event ) {
70+ Player player = event .getEntity ();
71+ String deathMessage = event .getDeathMessage ();
72+
73+ // If there's a custom death message, use it. Otherwise, create a basic one.
74+ if (deathMessage != null && !deathMessage .isEmpty ()) {
75+ // Strip color codes from death message
76+ deathMessage = ChatColor .stripColor (deathMessage );
77+ } else {
78+ deathMessage = player .getName () + " died" ;
79+ }
80+
81+ sendWebhook ("[Console]" , "💀 " + deathMessage , true );
82+ }
83+
84+ private void sendWebhook (String username , String content , boolean isConsole ) {
85+ if (webhookUrl == null || webhookUrl .isEmpty ()) return ;
86+
87+ Bukkit .getScheduler ().runTaskAsynchronously (this , () -> {
88+ try {
89+ URL url = new URL (webhookUrl );
90+ HttpURLConnection conn = (HttpURLConnection ) url .openConnection ();
91+ conn .setRequestMethod ("POST" );
92+ conn .setRequestProperty ("Content-Type" , "application/json" );
93+ conn .setDoOutput (true );
94+
95+ String avatar = isConsole
96+ ? consoleAvatar
97+ : "https://minotar.net/avatar/" + username .replace ("[minecraft] " , "" );
98+
99+ String json = "{"
100+ + "\" username\" : \" " + username + "\" ,"
101+ + "\" avatar_url\" : \" " + avatar + "\" ,"
102+ + "\" content\" : \" " + content .replace ("\" " , "\\ \" " ) + "\" "
103+ + "}" ;
104+
105+ try (OutputStream os = conn .getOutputStream ()) {
106+ os .write (json .getBytes ());
107+ }
108+
109+ conn .getInputStream ().close ();
110+ conn .disconnect ();
111+ } catch (Exception e ) {
112+ getLogger ().warning ("Failed to send webhook: " + e .getMessage ());
113+ }
114+ });
115+ }
116+
117+ // /dbridge reload command
118+ @ Override
119+ public boolean onCommand (CommandSender sender , Command cmd , String label , String [] args ) {
120+ if (cmd .getName ().equalsIgnoreCase ("dbridge" )) {
121+ if (args .length == 1 && args [0 ].equalsIgnoreCase ("reload" )) {
122+ reloadConfig ();
123+ loadConfigValues ();
124+ sender .sendMessage (ChatColor .GREEN + "DiscordBridge config reloaded!" );
125+ return true ;
126+ }
127+ sender .sendMessage (ChatColor .RED + "Usage: /dbridge reload" );
128+ return true ;
129+ }
130+ return false ;
131+ }
132+ }
0 commit comments