diff --git a/src/main/java/buttondevteam/discordplugin/DPUtils.java b/src/main/java/buttondevteam/discordplugin/DPUtils.java index 25adff8..89c0b82 100755 --- a/src/main/java/buttondevteam/discordplugin/DPUtils.java +++ b/src/main/java/buttondevteam/discordplugin/DPUtils.java @@ -42,7 +42,7 @@ public final class DPUtils { public static T perform(IRequest action, long timeout, TimeUnit unit) throws TimeoutException, InterruptedException { if (DiscordPlugin.SafeMode) return null; - if (Thread.currentThread() == DiscordPlugin.mainThread) // TODO: Ignore shutdown message <-- + if (Bukkit.isPrimaryThread()) // TODO: Ignore shutdown message <-- // throw new RuntimeException("Tried to wait for a Discord request on the main thread. This could cause lag."); Bukkit.getLogger().warning("Waiting for a Discord request on the main thread!"); return RequestBuffer.request(action).get(timeout, unit); // Let the pros handle this @@ -55,7 +55,7 @@ public final class DPUtils { public static T perform(IRequest action) { if (DiscordPlugin.SafeMode) return null; - if (Thread.currentThread() == DiscordPlugin.mainThread) // TODO: Ignore shutdown message <-- + if (Bukkit.isPrimaryThread()) // TODO: Ignore shutdown message <-- // throw new RuntimeException("Tried to wait for a Discord request on the main thread. This could cause lag."); Bukkit.getLogger().warning("Waiting for a Discord request on the main thread!"); return RequestBuffer.request(action).get(); // Let the pros handle this @@ -67,7 +67,7 @@ public final class DPUtils { public static Void perform(IVoidRequest action) { if (DiscordPlugin.SafeMode) return null; - if (Thread.currentThread() == DiscordPlugin.mainThread) + if (Bukkit.isPrimaryThread()) throw new RuntimeException("Tried to wait for a Discord request on the main thread. This could cause lag."); return RequestBuffer.request(action).get(); // Let the pros handle this } diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index c5e6ded..9ed6232 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -3,6 +3,7 @@ package buttondevteam.discordplugin; import buttondevteam.discordplugin.commands.DiscordCommandBase; import buttondevteam.discordplugin.listeners.*; import buttondevteam.discordplugin.mccommands.DiscordMCCommandBase; +import buttondevteam.discordplugin.mccommands.ResetMCCommand; import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.chat.Channel; import buttondevteam.lib.chat.TBMCChatAPI; @@ -42,7 +43,6 @@ import java.util.stream.Collectors; public class DiscordPlugin extends JavaPlugin implements IListener { private static final String SubredditURL = "https://www.reddit.com/r/ChromaGamers"; private static boolean stop = false; - static Thread mainThread; public static IDiscordClient dc; public static DiscordPlugin plugin; public static boolean SafeMode = true; @@ -52,6 +52,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { @SuppressWarnings("unchecked") @Override public void onEnable() { + stop = false; //If not the first time try { Bukkit.getLogger().info("Initializing DiscordPlugin..."); try { @@ -69,7 +70,6 @@ public class DiscordPlugin extends JavaPlugin implements IListener { cb.withToken(Files.readFirstLine(new File("TBMC", "Token.txt"), StandardCharsets.UTF_8)); dc = cb.login(); dc.getDispatcher().registerListener(this); - mainThread = Thread.currentThread(); } catch (Exception e) { e.printStackTrace(); Bukkit.getPluginManager().disablePlugin(this); @@ -105,7 +105,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } if (mainServer == null || devServer == null) return; // Retry - if (!TBMCCoreAPI.IsTestServer()) { + if (!TBMCCoreAPI.IsTestServer()) { //Don't change conditions here, see mainServer=devServer=null in onDisable() botchannel = mainServer.getChannelByID(209720707188260864L); // bot annchannel = mainServer.getChannelByID(126795071927353344L); // announcements genchannel = mainServer.getChannelByID(125813020357165056L); // general @@ -157,7 +157,10 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } DiscordCommandBase.registerCommands(); - if (getConfig().getBoolean("serverup", false)) { + if (ResetMCCommand.resetting) + ChromaBot.getInstance().sendMessage("", new EmbedBuilder().withColor(Color.CYAN) + .withTitle("Discord plugin restarted - chat connected.").build()); //Really important to note the chat, hmm + else if (getConfig().getBoolean("serverup", false)) { ChromaBot.getInstance().sendMessage("", new EmbedBuilder().withColor(Color.YELLOW) .withTitle("Server recovered from a crash - chat connected.").build()); val thr = new Throwable( @@ -167,6 +170,9 @@ public class DiscordPlugin extends JavaPlugin implements IListener { } else ChromaBot.getInstance().sendMessage("", new EmbedBuilder().withColor(Color.GREEN) .withTitle("Server started - chat connected.").build()); + + ResetMCCommand.resetting = false; //This is the last event handling this flag + getConfig().set("serverup", true); saveConfig(); DPUtils.performNoWait(() -> { @@ -237,6 +243,7 @@ public class DiscordPlugin extends JavaPlugin implements IListener { stop = true; for (val entry : MCChatListener.ConnectedSenders.entrySet()) MCListener.callEventExcludingSome(new PlayerQuitEvent(entry.getValue(), "")); + MCChatListener.ConnectedSenders.clear(); getConfig().set("lastannouncementtime", lastannouncementtime); getConfig().set("lastseentime", lastseentime); getConfig().set("serverup", false); @@ -256,18 +263,22 @@ public class DiscordPlugin extends JavaPlugin implements IListener { saveConfig(); MCChatListener.forAllMCChat(ch -> { try { - DiscordPlugin.sendMessageToChannelWait(ch, "", - new EmbedBuilder().withColor(Restart ? Color.ORANGE : Color.RED) - .withTitle(Restart ? "Server restarting" : "Server stopping") - .withDescription( - Bukkit.getOnlinePlayers().size() > 0 - ? (DPUtils - .sanitizeString(Bukkit.getOnlinePlayers().stream() - .map(Player::getDisplayName).collect(Collectors.joining(", "))) - + (Bukkit.getOnlinePlayers().size() == 1 ? " was " : " were ") - + "asked *politely* to leave the server for a bit.") - : "") - .build(), 5, TimeUnit.SECONDS); + if (ResetMCCommand.resetting) + DiscordPlugin.sendMessageToChannelWait(ch, "", + new EmbedBuilder().withColor(Color.ORANGE).withTitle("Discord plugin restarting").build()); + else + DiscordPlugin.sendMessageToChannelWait(ch, "", + new EmbedBuilder().withColor(Restart ? Color.ORANGE : Color.RED) + .withTitle(Restart ? "Server restarting" : "Server stopping") + .withDescription( + Bukkit.getOnlinePlayers().size() > 0 + ? (DPUtils + .sanitizeString(Bukkit.getOnlinePlayers().stream() + .map(Player::getDisplayName).collect(Collectors.joining(", "))) + + (Bukkit.getOnlinePlayers().size() == 1 ? " was " : " were ") + + "asked *politely* to leave the server for a bit.") + : "") + .build(), 5, TimeUnit.SECONDS); } catch (TimeoutException | InterruptedException e) { e.printStackTrace(); } @@ -279,6 +290,8 @@ public class DiscordPlugin extends JavaPlugin implements IListener { ChromaBot.delete(); dc.changePresence(StatusType.IDLE, ActivityType.PLAYING, "Chromacraft"); //No longer using the same account for testing dc.logout(); + mainServer = devServer = null; //Fetch servers and channels again + sent = false; } catch (Exception e) { TBMCCoreAPI.SendException("An error occured while disabling DiscordPlugin!", e); } diff --git a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java index 12d706b..49bcf63 100755 --- a/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/listeners/MCChatListener.java @@ -138,7 +138,7 @@ public class MCChatListener implements Listener, IListener } val iterator = lastmsgCustom.iterator(); - while (iterator.hasNext()) { //TODO: Add cmd to fix mcchat + while (iterator.hasNext()) { val lmd = iterator.next(); if ((e.isFromcmd() || isdifferentchannel.test(lmd.channel)) //Test if msg is from Discord && e.getChannel().ID.equals(lmd.mcchannel.ID) //If it's from a command, the command msg has been deleted, so we need to send it @@ -362,6 +362,14 @@ public class MCChatListener implements Listener, IListener if (wait) recthread.join(5000); } + lastmsgdata = null; + lastmsgPerUser.clear(); + lastmsgCustom.clear(); + lastmsgfromd.clear(); + ConnectedSenders.clear(); + lastlist = lastlistp = ListC = 0; + UnconnectedSenders.clear(); + recthread = sendthread = null; } catch (InterruptedException e) { e.printStackTrace(); //This thread shouldn't be interrupted } diff --git a/src/main/java/buttondevteam/discordplugin/mccommands/ResetMCCommand.java b/src/main/java/buttondevteam/discordplugin/mccommands/ResetMCCommand.java index 5d571a7..dcfd00d 100644 --- a/src/main/java/buttondevteam/discordplugin/mccommands/ResetMCCommand.java +++ b/src/main/java/buttondevteam/discordplugin/mccommands/ResetMCCommand.java @@ -1,7 +1,6 @@ package buttondevteam.discordplugin.mccommands; import buttondevteam.discordplugin.DiscordPlugin; -import buttondevteam.discordplugin.listeners.MCChatListener; import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.TBMCCommandBase; import org.bukkit.Bukkit; @@ -9,27 +8,25 @@ import org.bukkit.command.CommandSender; @CommandClass(path = "discord reset", modOnly = true) public class ResetMCCommand extends TBMCCommandBase { //Not player-only, so not using DiscordMCCommandBase + public static boolean resetting = false; @Override public boolean OnCommand(CommandSender sender, String s, String[] strings) { Bukkit.getScheduler().runTaskAsynchronously(DiscordPlugin.plugin, () -> { - sender.sendMessage("§bStopping MCChatListener..."); - DiscordPlugin.SafeMode = true; - MCChatListener.stop(true); - if (DiscordPlugin.dc.isLoggedIn()) { - sender.sendMessage("§bLogging out..."); - DiscordPlugin.dc.logout(); - } else - sender.sendMessage("§bWe're not logged in."); - sender.sendMessage("§bLogging in..."); - DiscordPlugin.dc.login(); - DiscordPlugin.SafeMode = false; - sender.sendMessage("§bChromaBot has been reset!"); + resetting = true; //Turned off after sending enable message (ReadyEvent) + sender.sendMessage("§bDisabling DiscordPlugin..."); + Bukkit.getPluginManager().disablePlugin(DiscordPlugin.plugin); + sender.sendMessage("§bEnabling DiscordPlugin..."); + Bukkit.getPluginManager().enablePlugin(DiscordPlugin.plugin); + sender.sendMessage("§bReset finished!"); }); - return false; + return true; } @Override public String[] GetHelpText(String s) { - return new String[0]; + return new String[]{ // + "§6---- Reset ChromaBot ----", // + "This command stops the Minecraft chat and relogs the bot." // + }; } }