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) {
}
}
}