From 4d234cf8324f5a6f54bc17b5141988ef7c2223e3 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Mon, 26 Oct 2020 21:16:08 +0100 Subject: [PATCH] Fix vanish player count and no crash on fast disable #130 --- .../discordplugin/DiscordPlugin.java | 32 ++++++++++++++++--- .../discordplugin/mcchat/MCChatListener.java | 2 +- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java index 907c35a..6f6770a 100755 --- a/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java +++ b/src/main/java/buttondevteam/discordplugin/DiscordPlugin.java @@ -48,6 +48,7 @@ public class DiscordPlugin extends ButtonPlugin { public static boolean SafeMode = true; @Getter private Command2DC manager; + private boolean starting; /** * The prefix to use with Discord commands like /role. It only works in the bot channel. @@ -130,21 +131,30 @@ public class DiscordPlugin extends ButtonPlugin { return; } } + starting = true; val cb = DiscordClientBuilder.create(token).build().gateway(); cb.setInitialStatus(si -> Presence.doNotDisturb(Activity.playing("booting"))); cb.setStoreService(new JdkStoreService()); //The default doesn't work for some reason - it's waaay faster now - cb.login().subscribe(dc -> { + cb.login().doOnError(t -> stopStarting()).subscribe(dc -> { DiscordPlugin.dc = dc; //Set to gateway client dc.on(ReadyEvent.class) // Listen for ReadyEvent(s) .map(event -> event.getGuilds().size()) // Get how many guilds the bot is in .flatMap(size -> dc .on(GuildCreateEvent.class) // Listen for GuildCreateEvent(s) .take(size) // Take only the first `size` GuildCreateEvent(s) to be received - .collectList()).subscribe(this::handleReady); // Take all received GuildCreateEvents and make it a List + .collectList()).doOnError(t -> stopStarting()).subscribe(this::handleReady); // Take all received GuildCreateEvents and make it a List }); /* All guilds have been received, client is fully connected */ } catch (Exception e) { TBMCCoreAPI.SendException("Failed to enable the Discord plugin!", e, this); getLogger().severe("You may be able to restart the plugin using /discord restart"); + stopStarting(); + } + } + + private void stopStarting() { + synchronized (this) { + starting = false; + notifyAll(); } } @@ -175,6 +185,10 @@ public class DiscordPlugin extends ButtonPlugin { DPUtils.disableIfConfigErrorRes(null, commandChannel, DPUtils.getMessageChannel(commandChannel)); //Won't disable, just prints the warning here + if (MinecraftChatModule.state == DPState.STOPPING_SERVER) { + stopStarting(); + return; //Reusing that field to check if stopping while still initializing + } CommonListeners.register(dc.getEventDispatcher()); TBMCCoreAPI.RegisterEventsForExceptions(new MCListener(), this); TBMCCoreAPI.RegisterUserClass(DiscordPlayer.class, DiscordPlayer::new); @@ -210,18 +224,28 @@ public class DiscordPlugin extends ButtonPlugin { } catch (Exception e) { TBMCCoreAPI.SendException("An error occurred while enabling DiscordPlugin!", e, this); } + stopStarting(); } @Override public void pluginPreDisable() { + if (MinecraftChatModule.state == DPState.RUNNING) + MinecraftChatModule.state = DPState.STOPPING_SERVER; + synchronized (this) { + if (starting) { + try { + wait(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } if (ChromaBot.getInstance() == null) return; //Failed to load Timings timings = new Timings(); timings.printElapsed("Disable start"); timings.printElapsed("Updating player list"); ChromaBot.getInstance().updatePlayerList(); timings.printElapsed("Done"); - if (MinecraftChatModule.state == DPState.RUNNING) - MinecraftChatModule.state = DPState.STOPPING_SERVER; } @Override diff --git a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java index 0888992..38c159d 100755 --- a/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java +++ b/src/main/java/buttondevteam/discordplugin/mcchat/MCChatListener.java @@ -405,7 +405,7 @@ public class MCChatListener implements Listener { private boolean runCustomCommand(DiscordSenderBase dsender, String cmdlowercased) { if (cmdlowercased.startsWith("list")) { var players = Bukkit.getOnlinePlayers(); - dsender.sendMessage("There are " + players.size() + " out of " + Bukkit.getMaxPlayers() + " players online."); + dsender.sendMessage("There are " + players.stream().filter(MCChatUtils::checkEssentials).count() + " out of " + Bukkit.getMaxPlayers() + " players online."); dsender.sendMessage("Players: " + players.stream().filter(MCChatUtils::checkEssentials) .map(Player::getDisplayName).collect(Collectors.joining(", "))); return true;