diff --git a/pom.xml b/pom.xml index a203ac7..2d1895a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.helpchat RedisBungeeExpansion - 2.0.1 + 2.0.3 jar RedisBungeeExpansion diff --git a/src/main/java/com/helpchat/redisbungeeexpansion/RedisBungeeExpansion.java b/src/main/java/com/helpchat/redisbungeeexpansion/RedisBungeeExpansion.java index 278dee7..4e010cf 100644 --- a/src/main/java/com/helpchat/redisbungeeexpansion/RedisBungeeExpansion.java +++ b/src/main/java/com/helpchat/redisbungeeexpansion/RedisBungeeExpansion.java @@ -2,8 +2,6 @@ import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; -import me.clip.placeholderapi.PlaceholderAPI; -import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.expansion.Cacheable; import me.clip.placeholderapi.expansion.Configurable; import me.clip.placeholderapi.expansion.PlaceholderExpansion; @@ -11,45 +9,32 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.plugin.messaging.PluginMessageListener; -import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import java.io.ByteArrayInputStream; import java.io.DataInputStream; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; public final class RedisBungeeExpansion extends PlaceholderExpansion implements PluginMessageListener, Taskable, Cacheable, Configurable { - - private final Map servers = new ConcurrentHashMap<>(); - - private int total = 0; - - private BukkitTask task; - + private static final int FETCH_INTERVAL = 1; // in seconds + private static final int CLEANUP_INTERVAL = 10; // in seconds + private final Set readServers = new HashSet<>(); + private final ConcurrentHashMap servers = new ConcurrentHashMap<>(); private final String CHANNEL = "legacy:redisbungee"; - - private int fetchInterval = 60; - - private boolean registered = false; + private int total = 0; + private BukkitTask fetchTask; + private BukkitTask cleanupTask; public RedisBungeeExpansion() { - if (!registered) { - Bukkit.getMessenger().registerOutgoingPluginChannel(getPlaceholderAPI(), CHANNEL); - Bukkit.getMessenger().registerIncomingPluginChannel(getPlaceholderAPI(), CHANNEL, this); - registered = true; - } + Bukkit.getMessenger().registerOutgoingPluginChannel(getPlaceholderAPI(), CHANNEL); + Bukkit.getMessenger().registerIncomingPluginChannel(getPlaceholderAPI(), CHANNEL, this); } @Override public boolean register() { - List srvs = getStringList("tracked_servers"); - - if (srvs != null && !srvs.isEmpty()) { + if (!srvs.isEmpty()) { for (String s : srvs) { servers.put(s, 0); } @@ -74,7 +59,7 @@ public String getAuthor() { @Override public String getVersion() { - return "2.0.1"; + return "2.0.3"; } @Override @@ -107,7 +92,7 @@ private void getPlayers(String server) { @Override public String onPlaceholderRequest(Player p, String identifier) { - + readServers.add(identifier); if (identifier.equalsIgnoreCase("total") || identifier.equalsIgnoreCase("all")) { return String.valueOf(total); @@ -125,59 +110,67 @@ public String onPlaceholderRequest(Player p, String identifier) { } servers.put(identifier, 0); - return null; + return "0"; } @Override public void start() { - - task = new BukkitRunnable() { - - @Override - public void run() { - - if (servers.isEmpty()) { - - getPlayers("ALL"); - - return; + cleanupTask = Bukkit.getScheduler().runTaskTimer(getPlaceholderAPI(), () -> { + for (String server : servers.keySet()) { + if (!readServers.contains(server)) { + servers.remove(server); } + } - for (String server : servers.keySet()) { - getPlayers(server); - } + readServers.clear(); + }, 100L, 20L * CLEANUP_INTERVAL); + fetchTask = Bukkit.getScheduler().runTaskTimer(getPlaceholderAPI(), () -> { + if (servers.isEmpty()) { getPlayers("ALL"); + return; } - }.runTaskTimer(getPlaceholderAPI(), 100L, 20L * fetchInterval); + + for (String server : servers.keySet()) { + getPlayers(server); + } + + getPlayers("ALL"); + }, 100L, 20L * FETCH_INTERVAL); } @Override public void stop() { - if (task != null) { + if (fetchTask != null) { + try { + fetchTask.cancel(); + } catch (Exception ignored) { + } + fetchTask = null; + } + + if (cleanupTask != null) { try { - task.cancel(); - } catch (Exception ex) { + cleanupTask.cancel(); + } catch (Exception ignored) { } - task = null; + cleanupTask = null; } } @Override public void clear() { servers.clear(); - if (registered) { - Bukkit.getMessenger().unregisterOutgoingPluginChannel(getPlaceholderAPI(), CHANNEL); - Bukkit.getMessenger().unregisterIncomingPluginChannel(getPlaceholderAPI(), CHANNEL, this); - registered = false; - } + readServers.clear(); + + Bukkit.getMessenger().unregisterOutgoingPluginChannel(getPlaceholderAPI(), CHANNEL); + Bukkit.getMessenger().unregisterIncomingPluginChannel(getPlaceholderAPI(), CHANNEL, this); } @Override public void onPluginMessageReceived(String channel, Player player, byte[] message) { - if (!channel.equals(CHANNEL)) { return; } @@ -185,15 +178,12 @@ public void onPluginMessageReceived(String channel, Player player, byte[] messag DataInputStream in = new DataInputStream(new ByteArrayInputStream(message)); try { - String subChannel = in.readUTF(); if (subChannel.equals("PlayerCount")) { - String server = in.readUTF(); if (in.available() > 0) { - int count = in.readInt(); if (server.equals("ALL")) { @@ -202,10 +192,7 @@ public void onPluginMessageReceived(String channel, Player player, byte[] messag servers.put(server, count); } } - - } else if (subChannel.equals("GetServers")) { - String[] serverList = in.readUTF().split(", "); if (serverList.length == 0) { @@ -213,14 +200,12 @@ public void onPluginMessageReceived(String channel, Player player, byte[] messag } for (String server : serverList) { - if (!servers.containsKey(server)) { servers.put(server, 0); } } } - - } catch (Exception e) { + } catch (Exception ignored) { } } }