diff --git a/src/main/java/uk/co/angrybee/joe/DiscordWhitelister.java b/src/main/java/uk/co/angrybee/joe/DiscordWhitelister.java index 37f74fc..a138955 100755 --- a/src/main/java/uk/co/angrybee/joe/DiscordWhitelister.java +++ b/src/main/java/uk/co/angrybee/joe/DiscordWhitelister.java @@ -3,6 +3,9 @@ package uk.co.angrybee.joe; import org.bukkit.Server; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.java.JavaPlugin; +import com.earth2me.essentials.Essentials; +import org.kitteh.vanish.VanishPlugin; +import org.bukkit.plugin.PluginManager; import uk.co.angrybee.joe.commands.minecraft.CommandAbout; import uk.co.angrybee.joe.commands.minecraft.CommandReload; import uk.co.angrybee.joe.commands.minecraft.CommandStatus; @@ -14,6 +17,9 @@ import uk.co.angrybee.joe.stores.InGameRemovedList; import uk.co.angrybee.joe.stores.RemovedList; import uk.co.angrybee.joe.stores.UserList; import uk.co.angrybee.joe.stores.WhitelistedPlayers; +import uk.co.angrybee.joe.events.EssentialsVanishEvents; +import uk.co.angrybee.joe.events.SuperVanishEvents; +import uk.co.angrybee.joe.events.VanishNoPacketEvents; import java.util.List; import java.util.logging.Logger; @@ -45,6 +51,11 @@ public class DiscordWhitelister extends JavaPlugin private static Server thisServer; private static Logger pluginLogger; + // Plugins + public static Essentials essentialsPlugin; + public static VanishPlugin vanishNoPacketPlugin; + public static boolean hasSuperVanishOrPremiumVanish; + // For not counting vanished players when other players join/leave private static int vanishedPlayersCount; @@ -65,6 +76,12 @@ public class DiscordWhitelister extends JavaPlugin thisServer = thisPlugin.getServer(); pluginLogger = thisPlugin.getLogger(); + // Get/check for plugin + PluginManager pluginManager = getServer().getPluginManager(); + essentialsPlugin = (Essentials) pluginManager.getPlugin("Essentials"); + vanishNoPacketPlugin = (VanishPlugin) pluginManager.getPlugin("VanishNoPacket"); + hasSuperVanishOrPremiumVanish = pluginManager.getPlugin("SuperVanish") != null || pluginManager.getPlugin("PremiumVanish") != null; + int initSuccess = InitBot(true); if(initSuccess == 0) @@ -245,8 +262,23 @@ public class DiscordWhitelister extends JavaPlugin // Only attempt to set player count if the bot successfully initialized if(mainConfig.getFileConfiguration().getBoolean("show-player-count")) { - // Register events if enabled - thisServer.getPluginManager().registerEvents(new JoinLeaveEvents(), thisPlugin); + if(firstInit) { + // Register events if enabled + thisServer.getPluginManager().registerEvents(new JoinLeaveEvents(), thisPlugin); + //pluginLogger.info("Registered join/leave events!"); + if (hasSuperVanishOrPremiumVanish) { + thisServer.getPluginManager().registerEvents(new SuperVanishEvents(), thisPlugin); + //pluginLogger.info("Registered SuperVanish events!"); + } + if(vanishNoPacketPlugin != null) { + thisServer.getPluginManager().registerEvents(new VanishNoPacketEvents(), thisPlugin); + //pluginLogger.info("Registered VanishNoPacket events!"); + } + if (essentialsPlugin != null) { + thisServer.getPluginManager().registerEvents(new EssentialsVanishEvents(), thisPlugin); + //pluginLogger.info("Registered Essentials vanish events!"); + } + } // Set initial player count DiscordClient.SetPlayerCountStatus(getOnlineUsers()); diff --git a/src/main/java/uk/co/angrybee/joe/Utils.java b/src/main/java/uk/co/angrybee/joe/Utils.java new file mode 100644 index 0000000..5e26e43 --- /dev/null +++ b/src/main/java/uk/co/angrybee/joe/Utils.java @@ -0,0 +1,46 @@ +package uk.co.angrybee.joe; + +import de.myzelyam.api.vanish.VanishAPI; +import org.bukkit.entity.Player; +import org.bukkit.metadata.MetadataValue; + +import static uk.co.angrybee.joe.DiscordWhitelister.*; + +public class Utils { + + // Check if player is vanished + public static boolean isVanished(Player player) { + + // For Essentials + if(essentialsPlugin != null) { + //getPluginLogger().info("Checking via EssX if " + player.getDisplayName() + " is vanished: " + essentialsPlugin.getUser(player).isVanished()); + //getPluginLogger().info("Checking via EssX for list of vanished players: " + essentialsPlugin.getVanishedPlayers()); + if(essentialsPlugin.getUser(player).isVanished()) return true; + } + + // For SuperVanish / PremiumVanish + if(VanishAPI.getPlugin() != null) { + //getPluginLogger().info("Checking via SV if " + player.getDisplayName() + " is vanished: " + VanishAPI.isInvisible(player)); + //getPluginLogger().info("Checking via SV for list of vanished players: " + VanishAPI.getAllInvisiblePlayers()); + if(VanishAPI.isInvisible(player)) return true; + } + + // For VanishNoPacket + if(vanishNoPacketPlugin != null) { + //getPluginLogger().info("Checking via VNP if " + player.getDisplayName() + " is vanished: " + vanishNoPacketPlugin.getManager().isVanished(player)); + //getPluginLogger().info("Checking via VNP for list of vanished players: " + vanishNoPacketPlugin.getManager().getVanishedPlayers()); + if(vanishNoPacketPlugin.getManager().isVanished(player)) return true; + } + + // For others (maybe) + for (MetadataValue meta : player.getMetadata("vanished")) { + if (meta.asBoolean()) return true; + } + + // Otherwise, player is not vanished + return false; + + } + +} + diff --git a/src/main/java/uk/co/angrybee/joe/events/EssentialsVanishEvents.java b/src/main/java/uk/co/angrybee/joe/events/EssentialsVanishEvents.java new file mode 100644 index 0000000..f098b56 --- /dev/null +++ b/src/main/java/uk/co/angrybee/joe/events/EssentialsVanishEvents.java @@ -0,0 +1,21 @@ +package uk.co.angrybee.joe.events; + +import net.ess3.api.events.VanishStatusChangeEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class EssentialsVanishEvents implements Listener { + + @EventHandler + public void onVanishStatusChangeEvent(VanishStatusChangeEvent event){ + // If value is true (player just vanished) + if(event.getValue()) { + VanishEvents.onPlayerHide(event.getAffected().getDisplayName()); + } + // If value is false (player just un-vanished) + else { + VanishEvents.onPlayerShow(event.getAffected().getDisplayName()); + } + } + +} diff --git a/src/main/java/uk/co/angrybee/joe/events/JoinLeaveEvents.java b/src/main/java/uk/co/angrybee/joe/events/JoinLeaveEvents.java index 4c70f3a..4c51685 100644 --- a/src/main/java/uk/co/angrybee/joe/events/JoinLeaveEvents.java +++ b/src/main/java/uk/co/angrybee/joe/events/JoinLeaveEvents.java @@ -1,5 +1,7 @@ package uk.co.angrybee.joe.events; +import org.bukkit.entity.Player; +import org.bukkit.event.EventPriority; import uk.co.angrybee.joe.DiscordWhitelister; import uk.co.angrybee.joe.DiscordClient; @@ -7,20 +9,20 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import uk.co.angrybee.joe.Utils; // Used for showing player count in the discord bots status public class JoinLeaveEvents implements Listener { - @EventHandler + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); if(!DiscordWhitelister.showVanishedPlayersInCount) { - if(event.getPlayer().hasPermission("discordsrv.silentjoin") - || event.getPlayer().hasPermission("discordsrv.silentquit") - || event.getPlayer().hasPermission("sv.joinvanished")) + if(Utils.isVanished(player)) { - DiscordWhitelister.getPlugin().getLogger().info("Player " + event.getPlayer().getDisplayName() + " joined with silent joining/quitting permission, not incrementing player count"); + DiscordWhitelister.getPlugin().getLogger().info("Player " + player.getDisplayName() + " joined while vanished, not incrementing player count"); DiscordWhitelister.addVanishedPlayer(); return; } @@ -28,16 +30,15 @@ public class JoinLeaveEvents implements Listener DiscordClient.SetPlayerCountStatus(DiscordWhitelister.getOnlineUsers()); } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerLeave(PlayerQuitEvent event) { + Player player = event.getPlayer(); if(!DiscordWhitelister.showVanishedPlayersInCount) { - if(event.getPlayer().hasPermission("discordsrv.silentjoin") - || event.getPlayer().hasPermission("discordsrv.silentquit") - || event.getPlayer().hasPermission("sv.joinvanished")) + if(Utils.isVanished(player)) { - DiscordWhitelister.getPlugin().getLogger().info("Player " + event.getPlayer().getDisplayName() + " quit with silent joining/quitting permission, not decrementing player count"); + DiscordWhitelister.getPlugin().getLogger().info("Player " + player.getDisplayName() + " quit while vanished, not decrementing player count"); DiscordWhitelister.removeVanishedPlayer(); return; } diff --git a/src/main/java/uk/co/angrybee/joe/events/SuperVanishEvents.java b/src/main/java/uk/co/angrybee/joe/events/SuperVanishEvents.java new file mode 100644 index 0000000..2e7709b --- /dev/null +++ b/src/main/java/uk/co/angrybee/joe/events/SuperVanishEvents.java @@ -0,0 +1,21 @@ +package uk.co.angrybee.joe.events; + +import de.myzelyam.api.vanish.PlayerHideEvent; +import de.myzelyam.api.vanish.PlayerShowEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import uk.co.angrybee.joe.DiscordWhitelister; + +public class SuperVanishEvents implements Listener { + + @EventHandler + public void onPlayerShowEvent(PlayerShowEvent event){ + VanishEvents.onPlayerShow(event.getPlayer().getDisplayName()); + } + + @EventHandler + public void onPlayerHideEvent(PlayerHideEvent event){ + VanishEvents.onPlayerHide(event.getPlayer().getDisplayName()); + } + +} diff --git a/src/main/java/uk/co/angrybee/joe/events/VanishEvents.java b/src/main/java/uk/co/angrybee/joe/events/VanishEvents.java new file mode 100644 index 0000000..3cebb79 --- /dev/null +++ b/src/main/java/uk/co/angrybee/joe/events/VanishEvents.java @@ -0,0 +1,25 @@ +package uk.co.angrybee.joe.events; + +import uk.co.angrybee.joe.DiscordClient; +import uk.co.angrybee.joe.DiscordWhitelister; + +public class VanishEvents { + + // Called when a player exits vanished mode + public static void onPlayerShow(String playerName) { + if(!DiscordWhitelister.showVanishedPlayersInCount) { + DiscordWhitelister.getPlugin().getLogger().info("Player " + playerName + " un-vanished, incrementing player count"); + DiscordWhitelister.removeVanishedPlayer(); + DiscordClient.SetPlayerCountStatus(DiscordWhitelister.getOnlineUsers()); + } + } + + // Called when a player enters vanished mode + public static void onPlayerHide(String playerName) { + if(!DiscordWhitelister.showVanishedPlayersInCount) { + DiscordWhitelister.getPlugin().getLogger().info("Player " + playerName + " vanished, decrementing player count"); + DiscordWhitelister.addVanishedPlayer(); + DiscordClient.SetPlayerCountStatus(DiscordWhitelister.getOnlineUsers()); + } + } +} diff --git a/src/main/java/uk/co/angrybee/joe/events/VanishNoPacketEvents.java b/src/main/java/uk/co/angrybee/joe/events/VanishNoPacketEvents.java new file mode 100644 index 0000000..d7aa6c1 --- /dev/null +++ b/src/main/java/uk/co/angrybee/joe/events/VanishNoPacketEvents.java @@ -0,0 +1,21 @@ +package uk.co.angrybee.joe.events; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.kitteh.vanish.event.VanishStatusChangeEvent; + +public class VanishNoPacketEvents implements Listener { + + @EventHandler + public void onVanishStatusChangeEvent(VanishStatusChangeEvent event){ + // If value is true (player just vanished) + if(event.isVanishing()) { + VanishEvents.onPlayerHide(event.getPlayer().getDisplayName()); + } + // If value is false (player just un-vanished) + else { + VanishEvents.onPlayerShow(event.getPlayer().getDisplayName()); + } + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 966b468..1e72ba2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,6 +3,7 @@ version: 1.4.8 author: Joe Shimell main: uk.co.angrybee.joe.DiscordWhitelister description: Discord Whitelister. +softdepend: [Essentials, SuperVanish, VanishNoPacket] commands: discordwhitelister: description: See info about this plugin