Update a server's placeholders upon a state change

This commit is contained in:
ME1312 2020-07-05 00:11:51 -04:00
parent 69fad5221c
commit 5ad6b49de7
No known key found for this signature in database
GPG Key ID: FEFFE2F698E88FA8
1 changed files with 47 additions and 23 deletions

View File

@ -42,6 +42,8 @@ public class PlaceholderImpl extends PlaceholderExpansion implements Taskable, C
if (plugin.config.get().getMap("Settings").getBoolean("PlaceholderAPI-Ready", false)) init(); if (plugin.config.get().getMap("Settings").getBoolean("PlaceholderAPI-Ready", false)) init();
} }
@Override @Override
public String getIdentifier() { public String getIdentifier() {
return "subservers"; return "subservers";
@ -66,18 +68,20 @@ public class PlaceholderImpl extends PlaceholderExpansion implements Taskable, C
if (!init) { if (!init) {
init = true; init = true;
Bukkit.getPluginManager().registerEvents(cache.events, plugin); Bukkit.getPluginManager().registerEvents(cache.events, plugin);
Bukkit.getScheduler().runTaskLater(plugin, this::start, 120L); Bukkit.getScheduler().runTaskLater(plugin, () -> {
if (task == null) {
int interval = plugin.config.get().getMap("Settings").getInt("PlaceholderAPI-Cache-Interval", 300);
int start = interval - new Random().nextInt((interval / 3) + 1); // Don't have all servers request at the same time
task = Bukkit.getScheduler().runTaskTimer(plugin, cache::refresh, 20L * start, 20L * interval);
cache.refresh();
}
}, 120L);
} }
} }
@Override @Override
public void start() { public void start() {
if (task == null) { // do nothing
int interval = plugin.config.get().getMap("Settings").getInt("PlaceholderAPI-Cache-Interval", 300);
int start = interval - new Random().nextInt((interval / 3) + 1); // Don't have all servers request at the same time
task = Bukkit.getScheduler().runTaskTimer(plugin, cache::refresh, 20L * start, 20L * interval);
cache.refresh();
}
} }
@Override @Override
@ -356,11 +360,11 @@ public class PlaceholderImpl extends PlaceholderExpansion implements Taskable, C
} }
} }
private static final class Cache { private final class Cache {
private static HashMap<String, Proxy> proxies = new HashMap<String, Proxy>(); private HashMap<String, Proxy> proxies = new HashMap<String, Proxy>();
private static HashMap<String, Host> hosts = new HashMap<String, Host>(); private HashMap<String, Host> hosts = new HashMap<String, Host>();
private static HashMap<String, Server> servers = new HashMap<String, Server>(); private HashMap<String, Server> servers = new HashMap<String, Server>();
private static Proxy master = null; private Proxy master = null;
private Listener events = new Events(); private Listener events = new Events();
private void reset() { private void reset() {
@ -373,52 +377,71 @@ public class PlaceholderImpl extends PlaceholderExpansion implements Taskable, C
private void refresh() { private void refresh() {
if (SubAPI.getInstance().getSubDataNetwork()[0] != null) { if (SubAPI.getInstance().getSubDataNetwork()[0] != null) {
SubAPI.getInstance().getProxies(proxies -> { SubAPI.getInstance().getProxies(proxies -> {
Cache.proxies = new HashMap<>(proxies); this.proxies = new HashMap<>(proxies);
}); });
SubAPI.getInstance().getMasterProxy(master -> { SubAPI.getInstance().getMasterProxy(master -> {
Cache.master = master; this.master = master;
}); });
SubAPI.getInstance().getHosts(hosts -> { SubAPI.getInstance().getHosts(hosts -> {
Cache.hosts = new HashMap<>(hosts); this.hosts = new HashMap<>(hosts);
}); });
SubAPI.getInstance().getServers(servers -> { SubAPI.getInstance().getServers(servers -> {
Cache.servers = new HashMap<>(servers); this.servers = new HashMap<>(servers);
}); });
} }
} }
private final class Events implements Listener { private final class Events implements Listener {
private HashMap<String, BukkitTask> edits = new HashMap<String, BukkitTask>();
@EventHandler @EventHandler
public void add(SubAddProxyEvent e) { public void add(SubAddProxyEvent e) {
SubAPI.getInstance().getProxy(e.getProxy(), proxy -> { SubAPI.getInstance().getProxy(e.getProxy(), proxy -> {
proxies.put(proxy.getName().toLowerCase(), proxy); if (proxy != null) proxies.put(proxy.getName().toLowerCase(), proxy);
}); });
} }
@EventHandler @EventHandler
public void add(SubAddHostEvent e) { public void add(SubAddHostEvent e) {
SubAPI.getInstance().getHost(e.getHost(), host -> { SubAPI.getInstance().getHost(e.getHost(), host -> {
hosts.put(host.getName().toLowerCase(), host); if (host != null) hosts.put(host.getName().toLowerCase(), host);
}); });
} }
@EventHandler @EventHandler
public void add(SubAddServerEvent e) { public void add(SubAddServerEvent e) {
SubAPI.getInstance().getServer(e.getServer(), server -> { add(e.getServer());
servers.put(server.getName().toLowerCase(), server); }
public void add(String s) {
SubAPI.getInstance().getServer(s, server -> {
if (server != null) servers.put(server.getName().toLowerCase(), server);
}); });
} }
@EventHandler
public void edit(SubEditServerEvent e) {
String s = e.getServer().toLowerCase();
if (edits.keySet().contains(s)) edits.get(s).cancel();
edits.put(s, Bukkit.getScheduler().runTaskLater(plugin, () -> add(s), 120L));
}
@EventHandler @EventHandler
public void start(SubStartEvent e) { public void start(SubStartEvent e) {
Server server = getServer(e.getServer()); Server server = getServer(e.getServer());
if (server != null) Util.isException(() -> Util.<ObjectMap<String>>reflect(Server.class.getDeclaredField("raw"), server).set("running", true)); if (server != null) {
Util.isException(() -> Util.<ObjectMap<String>>reflect(Server.class.getDeclaredField("raw"), server).set("running", true));
add(e.getServer());
}
} }
@EventHandler @EventHandler
public void started(SubStartedEvent e) { public void started(SubStartedEvent e) {
Server server = getServer(e.getServer()); Server server = getServer(e.getServer());
if (server != null) Util.isException(() -> Util.<ObjectMap<String>>reflect(Server.class.getDeclaredField("raw"), server).set("online", true)); if (server != null) {
Util.isException(() -> Util.<ObjectMap<String>>reflect(Server.class.getDeclaredField("raw"), server).set("online", true));
add(e.getServer());
}
} }
@EventHandler @EventHandler
@ -428,6 +451,7 @@ public class PlaceholderImpl extends PlaceholderExpansion implements Taskable, C
ObjectMap<String> raw = Util.reflect(Server.class.getDeclaredField("raw"), server); ObjectMap<String> raw = Util.reflect(Server.class.getDeclaredField("raw"), server);
raw.set("online", false); raw.set("online", false);
raw.set("running", false); raw.set("running", false);
add(e.getServer());
}); });
} }
} }
@ -467,7 +491,7 @@ public class PlaceholderImpl extends PlaceholderExpansion implements Taskable, C
public Map<String, SubServer> getSubServers() { public Map<String, SubServer> getSubServers() {
TreeMap<String, SubServer> servers = new TreeMap<String, SubServer>(); TreeMap<String, SubServer> servers = new TreeMap<String, SubServer>();
for (Map.Entry<String, Server> server : Cache.servers.entrySet()) { for (Map.Entry<String, Server> server : this.servers.entrySet()) {
if (server.getValue() instanceof SubServer) servers.put(server.getKey(), (SubServer) server.getValue()); if (server.getValue() instanceof SubServer) servers.put(server.getKey(), (SubServer) server.getValue());
} }
return servers; return servers;