diff --git a/.idea/artifacts/MineOnlineBroadcastBukkit.xml b/.idea/artifacts/MineOnlineBroadcastBukkit.xml
new file mode 100644
index 0000000..300d2cc
--- /dev/null
+++ b/.idea/artifacts/MineOnlineBroadcastBukkit.xml
@@ -0,0 +1,11 @@
+
+
+ $PROJECT_DIR$/out/artifacts/MineOnlineBroadcastBukkit
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/artifacts/MineOnlineBroadcast_Bukkit.xml b/.idea/artifacts/MineOnlineBroadcast_Bukkit.xml
deleted file mode 100644
index e6c08af..0000000
--- a/.idea/artifacts/MineOnlineBroadcast_Bukkit.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
- $PROJECT_DIR$/out/artifacts/MineOnlineBroadcast_Bukkit
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/libraries/JDA_4_2_0_168_withDependencies_min.xml b/.idea/libraries/JDA_4_2_0_168_withDependencies_min.xml
new file mode 100644
index 0000000..70bf2eb
--- /dev/null
+++ b/.idea/libraries/JDA_4_2_0_168_withDependencies_min.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 2555759..8e28c75 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -1,7 +1,34 @@
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -10,47 +37,177 @@
-
+
-
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
md5
+ server-ip
+ oldcr
+ old
+ onlineMode
+ here
+ onlinemode
+ System.out
+ 200 OK
+ listener
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
@@ -63,32 +220,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -114,59 +349,293 @@
1601520627871
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1601569681272
+
+
+
+ 1601569681273
+
+
+ 1602266936572
+
+
+
+ 1602266936572
+
+
+ 1602444340520
+
+
+
+ 1602444340520
+
+
+ 1602444354264
+
+
+
+ 1602444354264
+
+
+ 1602851549642
+
+
+
+ 1602851549642
+
+
+ 1603025313643
+
+
+
+ 1603025313643
+
+
+ 1603032473299
+
+
+
+ 1603032473299
+
+
+ 1603903123690
+
+
+
+ 1603903123690
+
+
+ 1604088077949
+
+
+
+ 1604088077949
+
+
+ 1604088171335
+
+
+
+ 1604088171335
+
+
+ 1604095778444
+
+
+
+ 1604095778444
+
+
-
+
-
+
-
-
-
-
-
-
+
-
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -176,7 +645,7 @@
- MineOnlineBroadcast-Bukkit
+ MineOnlineBroadcastBukkit
@@ -248,7 +717,7 @@
- craftbukkit
+ JDA-4.2.0_168-withDependencies-min
diff --git a/MineOnlineBroadcast-Bukkit.iml b/MineOnlineBroadcast-Bukkit.iml
index 61df5f3..cd8eec0 100644
--- a/MineOnlineBroadcast-Bukkit.iml
+++ b/MineOnlineBroadcast-Bukkit.iml
@@ -10,5 +10,6 @@
+
\ No newline at end of file
diff --git a/lib/JDA-4.2.0_168-withDependencies-min.jar b/lib/JDA-4.2.0_168-withDependencies-min.jar
new file mode 100644
index 0000000..ec267ba
Binary files /dev/null and b/lib/JDA-4.2.0_168-withDependencies-min.jar differ
diff --git a/lib/discord-webhooks-0.5.0.jar b/lib/discord-webhooks-0.5.0.jar
new file mode 100644
index 0000000..654ae31
Binary files /dev/null and b/lib/discord-webhooks-0.5.0.jar differ
diff --git a/res/plugin.yml b/res/plugin.yml
index a08e609..f70fae8 100644
--- a/res/plugin.yml
+++ b/res/plugin.yml
@@ -1,10 +1,10 @@
-name: MineOnlineBroadcast
-version: 1.0.8
+name: gg.codie.mineonline.plugin.bukkit.MineOnlineBroadcast
+version: 1.0.9
description: Lists a server on mineonline.codie.gg/servers
author: codieradical
authors: [Codie]
website: https://mineonline.codie.gg/
-main: MineOnlineBroadcast
+main: gg.codie.mineonline.plugin.bukkit.MineOnlineBroadcastPlugin
database: false
depend: []
\ No newline at end of file
diff --git a/src/MineOnlineBroadcastListener.java b/src/MineOnlineBroadcastListener.java
deleted file mode 100644
index 9e77dde..0000000
--- a/src/MineOnlineBroadcastListener.java
+++ /dev/null
@@ -1,22 +0,0 @@
-import org.bukkit.event.player.PlayerEvent;
-import org.bukkit.event.player.PlayerKickEvent;
-import org.bukkit.event.player.PlayerListener;
-import org.bukkit.event.player.PlayerLoginEvent;
-
-public class MineOnlineBroadcastListener extends PlayerListener {
- public MineOnlineBroadcastListener() {
-
- }
-
- public void onPlayerQuit(PlayerEvent event) {
- MineOnlineBroadcast.lastPing = System.currentTimeMillis() - 40000;
- }
-
- public void onPlayerLogin(PlayerLoginEvent event) {
- MineOnlineBroadcast.lastPing = System.currentTimeMillis() - 40000;
- }
-
- public void onPlayerKick(PlayerKickEvent event) {
- MineOnlineBroadcast.lastPing = System.currentTimeMillis() - 40000;
- }
-}
diff --git a/src/gg/codie/common/input/AbstractColorCodeProvider.java b/src/gg/codie/common/input/AbstractColorCodeProvider.java
new file mode 100644
index 0000000..ad87b51
--- /dev/null
+++ b/src/gg/codie/common/input/AbstractColorCodeProvider.java
@@ -0,0 +1,11 @@
+package gg.codie.common.input;
+
+public abstract class AbstractColorCodeProvider implements IColorCodeProvider {
+ public String removeColorCodes(String in){
+ for (EColorCodeColor chatColor : EColorCodeColor.values()) {
+ in = in.replace(getColorCode(chatColor), "");
+ }
+
+ return in;
+ }
+}
diff --git a/src/gg/codie/common/input/EColorCodeColor.java b/src/gg/codie/common/input/EColorCodeColor.java
new file mode 100644
index 0000000..2d82733
--- /dev/null
+++ b/src/gg/codie/common/input/EColorCodeColor.java
@@ -0,0 +1,20 @@
+package gg.codie.common.input;
+
+public enum EColorCodeColor {
+ Black,
+ DarkBlue,
+ DarkGreen,
+ DarkTeal,
+ DarkRed,
+ Purple,
+ Gold,
+ Gray,
+ DarkGray,
+ Blue,
+ BrightGreen,
+ Teal,
+ Red,
+ Pink,
+ Yellow,
+ White
+}
diff --git a/src/gg/codie/common/input/IColorCodeProvider.java b/src/gg/codie/common/input/IColorCodeProvider.java
new file mode 100644
index 0000000..2267230
--- /dev/null
+++ b/src/gg/codie/common/input/IColorCodeProvider.java
@@ -0,0 +1,6 @@
+package gg.codie.common.input;
+
+public interface IColorCodeProvider {
+ String getColorCode(EColorCodeColor chatColor);
+ String removeColorCodes(String text);
+}
diff --git a/src/gg/codie/minecraft/server/AbstractMinecraftColorCodeProvider.java b/src/gg/codie/minecraft/server/AbstractMinecraftColorCodeProvider.java
new file mode 100644
index 0000000..0fcc404
--- /dev/null
+++ b/src/gg/codie/minecraft/server/AbstractMinecraftColorCodeProvider.java
@@ -0,0 +1,47 @@
+package gg.codie.minecraft.server;
+
+import gg.codie.common.input.AbstractColorCodeProvider;
+import gg.codie.common.input.EColorCodeColor;
+
+public abstract class AbstractMinecraftColorCodeProvider extends AbstractColorCodeProvider {
+ public abstract String getPrefix();
+
+ @Override
+ public String getColorCode(EColorCodeColor chatColor) {
+ switch (chatColor) {
+ case Black:
+ return getPrefix() + '0';
+ case DarkBlue:
+ return getPrefix() + '1';
+ case DarkGreen:
+ return getPrefix() + '2';
+ case DarkTeal:
+ return getPrefix() + '3';
+ case DarkRed:
+ return getPrefix() + '4';
+ case Purple:
+ return getPrefix() + '5';
+ case Gold:
+ return getPrefix() + '6';
+ case Gray:
+ return getPrefix() + '7';
+ case DarkGray:
+ return getPrefix() + '8';
+ case Blue:
+ return getPrefix() + '9';
+ case BrightGreen:
+ return getPrefix() + 'a';
+ case Teal:
+ return getPrefix() + 'b';
+ case Red:
+ return getPrefix() + 'c';
+ case Pink:
+ return getPrefix() + 'd';
+ case Yellow:
+ return getPrefix() + 'e';
+ case White:
+ default:
+ return getPrefix() + 'f';
+ }
+ }
+}
diff --git a/src/gg/codie/minecraft/server/MinecraftColorCodeProvider.java b/src/gg/codie/minecraft/server/MinecraftColorCodeProvider.java
new file mode 100644
index 0000000..da30926
--- /dev/null
+++ b/src/gg/codie/minecraft/server/MinecraftColorCodeProvider.java
@@ -0,0 +1,7 @@
+package gg.codie.minecraft.server;
+
+public class MinecraftColorCodeProvider extends AbstractMinecraftColorCodeProvider {
+ public String getPrefix() {
+ return "ยง";
+ }
+}
diff --git a/src/gg/codie/mineonline/discord/DiscordChatBridge.java b/src/gg/codie/mineonline/discord/DiscordChatBridge.java
new file mode 100644
index 0000000..649fe3e
--- /dev/null
+++ b/src/gg/codie/mineonline/discord/DiscordChatBridge.java
@@ -0,0 +1,92 @@
+package gg.codie.mineonline.discord;
+
+import club.minnced.discord.webhook.WebhookClient;
+import club.minnced.discord.webhook.WebhookClientBuilder;
+import club.minnced.discord.webhook.send.WebhookMessageBuilder;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.JDABuilder;
+import net.dv8tion.jda.api.entities.MessageChannel;
+import net.dv8tion.jda.api.events.ShutdownEvent;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+
+import javax.annotation.Nonnull;
+import javax.security.auth.login.LoginException;
+
+public class DiscordChatBridge extends ListenerAdapter {
+
+ WebhookMessageBuilder webhookMessage;
+ WebhookClientBuilder builder;
+ MessageChannel channel;
+ WebhookClient client;
+ final String webhook;
+ final long channelID;
+ final String token;
+ final JDA jda;
+ final IAvatarProvider avatarProvider;
+
+ public DiscordChatBridge(IAvatarProvider avatarProvider, String discordChannel, String discordToken, String webhookUrl, IMessageRecievedListener msgEvent, IShutdownListener shutdownListener) throws NumberFormatException, InterruptedException, LoginException {
+ token = discordToken;
+ channelID = Long.parseLong(discordChannel);
+ webhook = webhookUrl;
+
+ this.avatarProvider = avatarProvider;
+
+ if (webhook != null) {
+ try {
+ builder = new WebhookClientBuilder(webhook);
+ client = builder.build();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ jda = JDABuilder.createDefault(token)
+ .build();
+ jda.awaitReady();
+ System.out.println("Discord Bridge Started");
+ jda.addEventListener(new ListenerAdapter() {
+ @Override
+ public void onMessageReceived(MessageReceivedEvent event) {
+ if (event.getChannel().getId().equals("" + channelID) && !event.isWebhookMessage() && !event.getAuthor().getId().equals(event.getJDA().getSelfUser().getId()) && !event.getMessage().getContentStripped().isEmpty()) { // stop listening to yourself
+ msgEvent.onMessageRecieved(event);
+ }
+ }
+ });
+ jda.addEventListener(new ListenerAdapter() {
+ @Override
+ public void onShutdown(@Nonnull ShutdownEvent event) {
+ shutdownListener.onShutdown();
+ super.onShutdown(event);
+ }
+ });
+ }
+
+ public void sendDiscordMessage(String username, String message){
+ if (webhook != null && !username.equals("")){ // webhook player messages to discord
+ webhookMessage = new WebhookMessageBuilder();
+ webhookMessage.setUsername(username);
+ webhookMessage.setAvatarUrl(avatarProvider.getAvatarURL(username));
+ webhookMessage.setContent(message);
+ client.send(webhookMessage.build());
+ } else if (token != null && !username.equals("")) { // Non-webhook player messages to discord
+ try {
+ channel = jda.getTextChannelById(channelID);
+ channel.sendMessage("**" + username + "**: " + message).queue();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ } else if (username.equals("")){ // Non webhook system messages to discord
+ try {
+ channel = jda.getTextChannelById(channelID);
+ channel.sendMessage(message).queue();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ public void shutdown() {
+ jda.shutdown();
+ }
+}
+
diff --git a/src/gg/codie/mineonline/discord/IAvatarProvider.java b/src/gg/codie/mineonline/discord/IAvatarProvider.java
new file mode 100644
index 0000000..ee58e0e
--- /dev/null
+++ b/src/gg/codie/mineonline/discord/IAvatarProvider.java
@@ -0,0 +1,5 @@
+package gg.codie.mineonline.discord;
+
+public interface IAvatarProvider {
+ String getAvatarURL(String username);
+}
diff --git a/src/gg/codie/mineonline/discord/IMessageRecievedListener.java b/src/gg/codie/mineonline/discord/IMessageRecievedListener.java
new file mode 100644
index 0000000..303c238
--- /dev/null
+++ b/src/gg/codie/mineonline/discord/IMessageRecievedListener.java
@@ -0,0 +1,9 @@
+package gg.codie.mineonline.discord;
+
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+
+public interface IMessageRecievedListener {
+
+ void onMessageRecieved(MessageReceivedEvent message);
+
+}
diff --git a/src/gg/codie/mineonline/discord/IShutdownListener.java b/src/gg/codie/mineonline/discord/IShutdownListener.java
new file mode 100644
index 0000000..7268cde
--- /dev/null
+++ b/src/gg/codie/mineonline/discord/IShutdownListener.java
@@ -0,0 +1,7 @@
+package gg.codie.mineonline.discord;
+
+public interface IShutdownListener {
+
+ void onShutdown();
+
+}
diff --git a/src/gg/codie/mineonline/discord/MinotarAvatarProvider.java b/src/gg/codie/mineonline/discord/MinotarAvatarProvider.java
new file mode 100644
index 0000000..c053c76
--- /dev/null
+++ b/src/gg/codie/mineonline/discord/MinotarAvatarProvider.java
@@ -0,0 +1,8 @@
+package gg.codie.mineonline.discord;
+
+public class MinotarAvatarProvider implements IAvatarProvider {
+ @Override
+ public String getAvatarURL(String username) {
+ return "https://minotar.net/avatar/" + username + "/100.png";
+ }
+}
diff --git a/src/gg/codie/mineonline/ProxyThread.java b/src/gg/codie/mineonline/plugin/ProxyThread.java
similarity index 99%
rename from src/gg/codie/mineonline/ProxyThread.java
rename to src/gg/codie/mineonline/plugin/ProxyThread.java
index f063b44..77dd236 100644
--- a/src/gg/codie/mineonline/ProxyThread.java
+++ b/src/gg/codie/mineonline/plugin/ProxyThread.java
@@ -1,4 +1,4 @@
-package gg.codie.mineonline;
+package gg.codie.mineonline.plugin;
import gg.codie.minecraft.api.SessionServer;
import gg.codie.utils.ArrayUtils;
diff --git a/src/gg/codie/mineonline/plugin/bukkit/MineOnlineBroadcastListener.java b/src/gg/codie/mineonline/plugin/bukkit/MineOnlineBroadcastListener.java
new file mode 100644
index 0000000..e54e3ac
--- /dev/null
+++ b/src/gg/codie/mineonline/plugin/bukkit/MineOnlineBroadcastListener.java
@@ -0,0 +1,39 @@
+package gg.codie.mineonline.plugin.bukkit;
+
+import gg.codie.minecraft.server.MinecraftColorCodeProvider;
+import gg.codie.mineonline.discord.DiscordChatBridge;
+import org.bukkit.event.player.*;
+
+public class MineOnlineBroadcastListener extends PlayerListener {
+ DiscordChatBridge discord;
+ MinecraftColorCodeProvider colorCodeProvider = new MinecraftColorCodeProvider();
+
+ public MineOnlineBroadcastListener(DiscordChatBridge discord) {
+ this.discord = discord;
+ }
+
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ MineOnlineBroadcastPlugin.lastPing = 0;
+ discord.sendDiscordMessage("", "**" + colorCodeProvider.removeColorCodes(event.getPlayer().getName()) + "** left the game.");
+ }
+
+ public void onPlayerQuit(PlayerEvent event) {
+ MineOnlineBroadcastPlugin.lastPing = 0;
+ discord.sendDiscordMessage("", "**" + colorCodeProvider.removeColorCodes(event.getPlayer().getName()) + "** left the game.");
+ }
+
+ public void onPlayerLogin(PlayerLoginEvent event) {
+ MineOnlineBroadcastPlugin.lastPing = 0;
+ discord.sendDiscordMessage("", "**" + colorCodeProvider.removeColorCodes(event.getPlayer().getName()) + "** joined the game.");
+ }
+
+ public void onPlayerKick(PlayerKickEvent event) {
+ MineOnlineBroadcastPlugin.lastPing = 0;
+ discord.sendDiscordMessage("", "**" + colorCodeProvider.removeColorCodes(event.getPlayer().getName()) + "** left the game.");
+ }
+
+ @Override
+ public void onPlayerChat(PlayerChatEvent event) {
+ discord.sendDiscordMessage(colorCodeProvider.removeColorCodes(event.getPlayer().getName()), colorCodeProvider.removeColorCodes(event.getMessage()));
+ }
+}
diff --git a/src/MineOnlineBroadcast.java b/src/gg/codie/mineonline/plugin/bukkit/MineOnlineBroadcastPlugin.java
similarity index 62%
rename from src/MineOnlineBroadcast.java
rename to src/gg/codie/mineonline/plugin/bukkit/MineOnlineBroadcastPlugin.java
index 8816360..1f37a0b 100644
--- a/src/MineOnlineBroadcast.java
+++ b/src/gg/codie/mineonline/plugin/bukkit/MineOnlineBroadcastPlugin.java
@@ -1,4 +1,13 @@
-import gg.codie.mineonline.ProxyThread;
+package gg.codie.mineonline.plugin.bukkit;
+
+import gg.codie.common.input.EColorCodeColor;
+import gg.codie.minecraft.server.MinecraftColorCodeProvider;
+import gg.codie.mineonline.discord.DiscordChatBridge;
+import gg.codie.mineonline.discord.IMessageRecievedListener;
+import gg.codie.mineonline.discord.IShutdownListener;
+import gg.codie.mineonline.discord.MinotarAvatarProvider;
+import gg.codie.mineonline.plugin.ProxyThread;
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.plugin.java.JavaPlugin;
@@ -15,14 +24,17 @@ import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Properties;
import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
-public class MineOnlineBroadcast extends JavaPlugin {
+public class MineOnlineBroadcastPlugin extends JavaPlugin {
Thread broadcastThread;
public static long lastPing;
MineOnlineBroadcastListener listener;
Logger log;
ProxyThread proxyThread;
+ DiscordChatBridge discord;
public void launchProxy() throws IOException {
ServerSocket serverSocket = new ServerSocket(0);
@@ -75,7 +87,7 @@ public class MineOnlineBroadcast extends JavaPlugin {
HttpURLConnection connection = null;
try {
- URLClassLoader classLoader = new URLClassLoader(new URL[] { MineOnlineBroadcast.class.getProtectionDomain().getCodeSource().getLocation() });
+ URLClassLoader classLoader = new URLClassLoader(new URL[] { MineOnlineBroadcastPlugin.class.getProtectionDomain().getCodeSource().getLocation() });
Class jsonObjectClass = classLoader.loadClass("org.json.JSONObject");
@@ -133,13 +145,13 @@ public class MineOnlineBroadcast extends JavaPlugin {
this.log = Logger.getLogger("Minecraft");
- this.log.info("Enabled MineOnlineBroadcast");
+ this.log.info("Enabled gg.codie.mineonline.plugin.bukkit.MineOnlineBroadcast");
broadcastThread = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
- if (System.currentTimeMillis() - MineOnlineBroadcast.lastPing > 45000) {
+ if (System.currentTimeMillis() - MineOnlineBroadcastPlugin.lastPing > 45000) {
lastPing = System.currentTimeMillis();
try {
Properties propertiesFile = new Properties();
@@ -184,12 +196,12 @@ public class MineOnlineBroadcast extends JavaPlugin {
public void initialize() {
this.log = Logger.getLogger("Minecraft");
- this.listener = new MineOnlineBroadcastListener();
- this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_LOGIN, this.listener, Event.Priority.Lowest, this);
- this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_QUIT, this.listener, Event.Priority.Highest, this);
- this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_KICK, this.listener, Event.Priority.Highest, this);
+
+ MinecraftColorCodeProvider colorCodeProvider = new MinecraftColorCodeProvider();
+
+ Properties propertiesFile = new Properties();
+
try {
- Properties propertiesFile = new Properties();
propertiesFile.load(new FileInputStream(new File("server.properties")));
boolean onlineMode = propertiesFile.getProperty("online-mode", "true").equals("true");
@@ -198,10 +210,86 @@ public class MineOnlineBroadcast extends JavaPlugin {
} catch (Exception ex) {
log.warning("Failed to enable online-mode fix. Authentication may fail.");
}
+
+ try {
+ propertiesFile.load(new FileInputStream(new File("server.properties")));
+ String discordToken = propertiesFile.getProperty("discord-token", null);
+ String discordChannelID = propertiesFile.getProperty("discord-channel", null);
+ String discordWebhookURL = propertiesFile.getProperty("discord-webhook-url", null);
+ String serverName = propertiesFile.getProperty("server-name", "Minecraft Server");
+
+
+ if (discordToken != null && discordChannelID != null) { // Create the discord bot if token and channel are present
+ discord = new DiscordChatBridge(new MinotarAvatarProvider(), discordChannelID, discordToken, discordWebhookURL, new IMessageRecievedListener() {
+ @Override
+ public void onMessageRecieved(MessageReceivedEvent event) {
+ StringBuilder sb = new StringBuilder();
+ String message = event.getMessage().getContentStripped();
+
+ message = message.replace("\n", "") // Make emojis pretty
+ .replace(("\uD83D\uDE41"), ":)")
+ .replace(("\uD83D\uDE26"), ":(")
+ .replace(("\uD83D\uDE04"), ":D")
+ .replace(("\u2764"), "<3");
+
+ for (int i = 0; i < message.length(); i++) {
+ char c = message.charAt(i);
+ if ((int) c > 31 && (int) c < 128) {
+ sb.append(c);
+ }
+ }
+
+ if (event.getMessage().getContentStripped().startsWith("\n"))
+ return;
+
+ String saneName = event.getAuthor().getName();
+ String saneMessage = sb.toString();
+
+ if(saneMessage.trim().isEmpty())
+ return;
+
+ Pattern trailingWhite = Pattern.compile(colorCodeProvider.getColorCode(EColorCodeColor.White) + "\\s{0,}$");
+ Matcher whiteMatcher = trailingWhite.matcher(saneMessage);
+
+ if (whiteMatcher.find()) { // Prevent a crash in classic where if the message ends with this all connected clients crash
+ saneMessage = saneMessage.substring(0, saneMessage.length() - whiteMatcher.group().length());
+ }
+
+ if (saneMessage.length() > 256) // Truncate messages that are overly long
+ saneMessage = saneMessage.substring(0, 256);
+
+ message = (colorCodeProvider.getColorCode(EColorCodeColor.Blue) + saneName + ": " + colorCodeProvider.getColorCode(EColorCodeColor.White) + saneMessage);
+
+ // remove double color codes that occur with resetting.
+ message = message.replace(colorCodeProvider.getColorCode(EColorCodeColor.White) + colorCodeProvider.getPrefix(), colorCodeProvider.getPrefix());
+
+ getServer().broadcastMessage(message);
+ }
+ }, new IShutdownListener() {
+ @Override
+ public void onShutdown() {
+ discord.sendDiscordMessage("", "Stopping " + serverName);
+ }
+ });
+
+ discord.sendDiscordMessage("", "Starting " + serverName);
+ }
+ } catch (Exception ex) {
+ log.warning("Failed to start discord bridge.");
+ ex.printStackTrace();
+ }
+
+ this.listener = new MineOnlineBroadcastListener(discord);
+ this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_LOGIN, this.listener, Event.Priority.Lowest, this);
+ this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_QUIT, this.listener, Event.Priority.Highest, this);
+ this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_KICK, this.listener, Event.Priority.Highest, this);
+ this.getServer().getPluginManager().registerEvent(Event.Type.PLAYER_CHAT, this.listener, Event.Priority.Highest, this);
}
@Override
public void onDisable() {
+ //unregister();
+ discord.shutdown();
broadcastThread.interrupt();
stopProxy();
}