From f0390d29295c4965330d61b27162d077ba8a748b Mon Sep 17 00:00:00 2001 From: Garsooon Date: Thu, 4 Jun 2026 23:27:40 +0900 Subject: [PATCH] Add discord bridging --- pom.xml | 26 ++++++- .../java/dev/oxs/staffchat/DiscordBridge.java | 78 +++++++++++++++++++ .../java/dev/oxs/staffchat/StaffChat.java | 24 +++++- .../dev/oxs/staffchat/StaffChatSettings.java | 4 + src/main/resources/plugin.yml | 1 + 5 files changed, 130 insertions(+), 3 deletions(-) create mode 100644 src/main/java/dev/oxs/staffchat/DiscordBridge.java diff --git a/pom.xml b/pom.xml index e1a18b0..7853bcf 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.oxs.staffchat StaffChat - 2.0.0-SNAPSHOT + 2.0.1 A simple staff chat plugin for Poseidon Minecraft servers. @@ -38,6 +38,10 @@ true + + dv8tion + https://m2.dv8tion.net/releases + @@ -69,6 +73,26 @@ 1.1.8 + + com.johnymuffin + discordcore + 1.1.3 + provided + + + + net.dv8tion + JDA + 4.4.0_350 + provided + + + club.minnced + opus-java + + + + \ No newline at end of file diff --git a/src/main/java/dev/oxs/staffchat/DiscordBridge.java b/src/main/java/dev/oxs/staffchat/DiscordBridge.java new file mode 100644 index 0000000..fb79dbe --- /dev/null +++ b/src/main/java/dev/oxs/staffchat/DiscordBridge.java @@ -0,0 +1,78 @@ +package dev.oxs.staffchat; + +import com.johnymuffin.discordcore.DiscordCore; +import com.johnymuffin.discordcore.DiscordBot; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.bukkit.Bukkit; + +import java.util.logging.Logger; + +public class DiscordBridge { + + private final StaffChat plugin; + private final Logger log; + private DiscordBot discordBot; + private String channelId; + private Object jdaListener; + + public DiscordBridge(StaffChat plugin) { + this.plugin = plugin; + this.log = plugin.getServer().getLogger(); + } + + public void start() { + if (!plugin.getConfig().getConfigBoolean("discord.enabled")) return; + + channelId = plugin.getConfig().getConfigString("discord.channel-id"); + if (channelId == null || channelId.isEmpty() || channelId.equals("none")) { + log.warning("[StaffChat] discord.enabled is true but discord.channel-id is not set."); + return; + } + + org.bukkit.plugin.Plugin dc = Bukkit.getPluginManager().getPlugin("DiscordCore"); + if (dc == null || !dc.isEnabled()) { + log.warning("[StaffChat] DiscordCore not found — Discord bridge disabled."); + return; + } + + try { + discordBot = ((DiscordCore) dc).getDiscordBot(); + registerJdaListener(); + log.info("[StaffChat] Discord bridge active on channel " + channelId); + } catch (Exception | NoClassDefFoundError e) { + log.severe("[StaffChat] Failed to attach JDA listener: " + e.getMessage()); + } + } + + private void registerJdaListener() { + final String targetChannel = this.channelId; + ListenerAdapter listener = new ListenerAdapter() { + @Override + public void onMessageReceived(MessageReceivedEvent event) { + if (!event.getChannel().getId().equals(targetChannel)) return; + if (event.getAuthor().isBot() || event.isWebhookMessage()) return; + + final String username = event.getAuthor().getName(); + final String message = event.getMessage().getContentRaw(); + + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> plugin.staffChatMessageFromDiscord(username, message)); + } + }; + discordBot.getJda().addEventListener(listener); + jdaListener = listener; + } + + public void stop() { + if (discordBot != null && jdaListener != null) { + try { + discordBot.getJda().removeEventListener(jdaListener); + } catch (Exception | NoClassDefFoundError ignored) {} + } + } + + public void sendToDiscord(String playerName, String message) { + if (discordBot == null) return; + discordBot.discordSendToChannel(channelId, "**[StaffChat]** " + playerName + ": " + message); + } +} diff --git a/src/main/java/dev/oxs/staffchat/StaffChat.java b/src/main/java/dev/oxs/staffchat/StaffChat.java index e4e1986..a031793 100755 --- a/src/main/java/dev/oxs/staffchat/StaffChat.java +++ b/src/main/java/dev/oxs/staffchat/StaffChat.java @@ -28,6 +28,8 @@ public class StaffChat extends JavaPlugin implements Listener { private HashMap staffChatToggled = new HashMap<>(); + private DiscordBridge discordBridge; + @Override public void onEnable() { plugin = this; @@ -51,22 +53,40 @@ public void onEnable() { pluginName = pdf.getName(); + discordBridge = new DiscordBridge(plugin); + discordBridge.start(); + log.info("[" + pluginName + "] Is Loading, Version: " + pdf.getVersion()); } @Override public void onDisable() { + if (discordBridge != null) discordBridge.stop(); log.info(pluginName + " has been disabled."); } public void StaffChatMessage(Player sender, String message) { + String name = StaffChatSettings.getInstance(plugin).getConfigBoolean("settings.staffchat-use-displayNamesStaffChat") + ? sender.getDisplayName() : sender.getName(); + String formatted = plugin.getPluginPrefix() + " " + ChatColor.WHITE + name + ": " + ChatColor.WHITE + printColours(message); + for (Player onlinePlayer : getServer().getOnlinePlayers()) { + if (onlinePlayer.hasPermission("staffchat.see") || onlinePlayer.isOp()) { + onlinePlayer.sendMessage(formatted); + } + } + if (discordBridge != null) discordBridge.sendToDiscord(name, message); + } + + public void staffChatMessageFromDiscord(String discordUsername, String message) { + String discordPrefix = printColours(StaffChatSettings.getInstance(plugin).getConfigString("discord.discord-prefix")); + String formatted = discordPrefix + " " + ChatColor.WHITE + discordUsername + ": " + ChatColor.WHITE + printColours(message); for (Player onlinePlayer : getServer().getOnlinePlayers()) { if (onlinePlayer.hasPermission("staffchat.see") || onlinePlayer.isOp()) { - Boolean useDisplayName = StaffChatSettings.getInstance(plugin).getConfigBoolean("settings.staffchat-use-displayNamesStaffChat"); - onlinePlayer.sendMessage(plugin.getPluginPrefix() + " " + ChatColor.WHITE + (useDisplayName ? sender.getDisplayName() : sender.getName()) + ": " + ChatColor.WHITE + printColours(message)); + onlinePlayer.sendMessage(formatted); } } + log.info("[StaffChat][Discord] " + discordUsername + ": " + message); } public void PublicChatMessage(Player sender, String message) { diff --git a/src/main/java/dev/oxs/staffchat/StaffChatSettings.java b/src/main/java/dev/oxs/staffchat/StaffChatSettings.java index 5e13b3c..1a841eb 100644 --- a/src/main/java/dev/oxs/staffchat/StaffChatSettings.java +++ b/src/main/java/dev/oxs/staffchat/StaffChatSettings.java @@ -23,6 +23,10 @@ private void write() { generateConfigOption("settings.staffchat-use-displayNamesStaffChat", false); generateConfigOption("settings.staffchat-use-displayNamesPublicChat", true); generateConfigOption("settings.staffchat-publicChatPrefix", "&f<%player%&f> "); + //Discord Bridge (requires DiscordCore-4) + generateConfigOption("discord.enabled", false); + generateConfigOption("discord.channel-id", "none"); + generateConfigOption("discord.discord-prefix", "&5{&9D &dStaffChat&5}&f"); } public void generateConfigOption(String key, Object defaultValue) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index fea9c9b..ff99655 100755 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,6 +5,7 @@ version: ${project.version} authors: - oxs depend: [ ] +softdepend: [ DiscordCore ] commands: StaffChatCommand: