Make BungeeServerTracker and BungeeChannel not static

This commit is contained in:
filoghost 2021-03-15 19:48:12 +01:00
parent 4d3ccd1a2e
commit f474684693
5 changed files with 61 additions and 43 deletions

View File

@ -46,6 +46,7 @@ public class HolographicDisplays extends FCommonsPlugin implements ProtocolPacke
private ConfigManager configManager; private ConfigManager configManager;
private InternalHologramManager internalHologramManager; private InternalHologramManager internalHologramManager;
private APIHologramManager apiHologramManager; private APIHologramManager apiHologramManager;
private BungeeServerTracker bungeeServerTracker;
@Override @Override
public void onCheckedEnable() throws PluginEnableException { public void onCheckedEnable() throws PluginEnableException {
@ -87,6 +88,7 @@ public class HolographicDisplays extends FCommonsPlugin implements ProtocolPacke
throw new PluginEnableException(e, "Couldn't initialize the NMS manager."); throw new PluginEnableException(e, "Couldn't initialize the NMS manager.");
} }
bungeeServerTracker = new BungeeServerTracker(this);
configManager = new ConfigManager(getDataFolder().toPath()); configManager = new ConfigManager(getDataFolder().toPath());
internalHologramManager = new InternalHologramManager(nmsManager); internalHologramManager = new InternalHologramManager(nmsManager);
apiHologramManager = new APIHologramManager(nmsManager); apiHologramManager = new APIHologramManager(nmsManager);
@ -105,8 +107,8 @@ public class HolographicDisplays extends FCommonsPlugin implements ProtocolPacke
ProtocolLibHook.setup(this, nmsManager, this, errorCollector); ProtocolLibHook.setup(this, nmsManager, this, errorCollector);
// Start repeating tasks. // Start repeating tasks.
PlaceholdersManager.startRefreshTask(this); PlaceholdersManager.startRefreshTask(this, bungeeServerTracker);
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new BungeeCleanupTask(), 5 * 60 * 20, 5 * 60 * 20); Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new BungeeCleanupTask(bungeeServerTracker), 5 * 60 * 20, 5 * 60 * 20);
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new WorldPlayerCounterTask(), 0L, 3 * 20); Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new WorldPlayerCounterTask(), 0L, 3 * 20);
HologramCommandManager commandManager = new HologramCommandManager(configManager, internalHologramManager, nmsManager); HologramCommandManager commandManager = new HologramCommandManager(configManager, internalHologramManager, nmsManager);
@ -136,7 +138,7 @@ public class HolographicDisplays extends FCommonsPlugin implements ProtocolPacke
public void load(boolean deferHologramsCreation, ErrorCollector errorCollector) { public void load(boolean deferHologramsCreation, ErrorCollector errorCollector) {
PlaceholdersManager.untrackAll(); PlaceholdersManager.untrackAll();
internalHologramManager.clearAll(); internalHologramManager.clearAll();
BungeeServerTracker.resetTrackedServers(); bungeeServerTracker.resetTrackedServers();
configManager.reloadCustomPlaceholders(errorCollector); configManager.reloadCustomPlaceholders(errorCollector);
configManager.reloadMainConfig(errorCollector); configManager.reloadMainConfig(errorCollector);
@ -147,7 +149,7 @@ public class HolographicDisplays extends FCommonsPlugin implements ProtocolPacke
errorCollector.add(e, "failed to load animation files"); errorCollector.add(e, "failed to load animation files");
} }
BungeeServerTracker.restartTask(Configuration.bungeeRefreshSeconds); bungeeServerTracker.restartTask(Configuration.bungeeRefreshSeconds);
if (deferHologramsCreation) { if (deferHologramsCreation) {
// For the initial load: holograms are loaded later, when the worlds are ready // For the initial load: holograms are loaded later, when the worlds are ready

View File

@ -25,17 +25,14 @@ public class BungeeChannel implements PluginMessageListener {
private static final String BUNGEECORD_CHANNEL = "BungeeCord"; private static final String BUNGEECORD_CHANNEL = "BungeeCord";
private static final String REDISBUNGEE_CHANNEL = "legacy:redisbungee"; private static final String REDISBUNGEE_CHANNEL = "legacy:redisbungee";
private final BungeeServerTracker bungeeServerTracker;
private static BungeeChannel instance; public BungeeChannel(BungeeServerTracker bungeeServerTracker) {
this.bungeeServerTracker = bungeeServerTracker;
public static BungeeChannel getInstance() {
if (instance == null) {
instance = new BungeeChannel(HolographicDisplays.getInstance());
}
return instance;
} }
private BungeeChannel(Plugin plugin) { public void register(Plugin plugin) {
Bukkit.getMessenger().registerOutgoingPluginChannel(plugin, BUNGEECORD_CHANNEL); Bukkit.getMessenger().registerOutgoingPluginChannel(plugin, BUNGEECORD_CHANNEL);
Bukkit.getMessenger().registerIncomingPluginChannel(plugin, BUNGEECORD_CHANNEL, this); Bukkit.getMessenger().registerIncomingPluginChannel(plugin, BUNGEECORD_CHANNEL, this);
@ -65,7 +62,7 @@ public class BungeeChannel implements PluginMessageListener {
if (in.available() > 0) { if (in.available() > 0) {
int online = in.readInt(); int online = in.readInt();
BungeeServerInfo serverInfo = BungeeServerTracker.getOrCreateServerInfo(server); BungeeServerInfo serverInfo = bungeeServerTracker.getOrCreateServerInfo(server);
serverInfo.setOnlinePlayers(online); serverInfo.setOnlinePlayers(online);
} }
} }

View File

@ -12,6 +12,7 @@ import me.filoghost.holographicdisplays.bridge.bungeecord.serverpinger.ServerPin
import me.filoghost.holographicdisplays.disk.Configuration; import me.filoghost.holographicdisplays.disk.Configuration;
import me.filoghost.holographicdisplays.disk.ServerAddress; import me.filoghost.holographicdisplays.disk.ServerAddress;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import java.io.IOException; import java.io.IOException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
@ -22,27 +23,35 @@ import java.util.concurrent.ConcurrentHashMap;
public class BungeeServerTracker { public class BungeeServerTracker {
private static final String PINGER_NOT_ENABLED_ERROR = "[Please enable pinger]"; private static final String PINGER_NOT_ENABLED_ERROR = "[Please enable pinger]";
private final BungeeChannel bungeeChannel;
private final Map<String, BungeeServerInfo> trackedServers;
private static final Map<String, BungeeServerInfo> trackedServers = new ConcurrentHashMap<>(); private int taskID = -1;
private static int taskID = -1;
public BungeeServerTracker(Plugin plugin) {
public static void resetTrackedServers() { bungeeChannel = new BungeeChannel(this);
bungeeChannel.register(plugin);
trackedServers = new ConcurrentHashMap<>();
}
public void resetTrackedServers() {
trackedServers.clear(); trackedServers.clear();
} }
public static void track(String server) { public void track(String server) {
if (!trackedServers.containsKey(server)) { if (!trackedServers.containsKey(server)) {
BungeeServerInfo info = new BungeeServerInfo(); BungeeServerInfo info = new BungeeServerInfo();
info.setMotd(Configuration.pingerOfflineMotd); info.setMotd(Configuration.pingerOfflineMotd);
trackedServers.put(server, info); trackedServers.put(server, info);
if (!Configuration.pingerEnabled) { if (!Configuration.pingerEnabled) {
BungeeChannel.getInstance().askPlayerCount(server); bungeeChannel.askPlayerCount(server);
} }
} }
} }
protected static BungeeServerInfo getOrCreateServerInfo(String server) { protected BungeeServerInfo getOrCreateServerInfo(String server) {
BungeeServerInfo info = trackedServers.get(server); BungeeServerInfo info = trackedServers.get(server);
if (info == null) { if (info == null) {
info = new BungeeServerInfo(); info = new BungeeServerInfo();
@ -53,7 +62,7 @@ public class BungeeServerTracker {
return info; return info;
} }
public static int getPlayersOnline(String server) { public int getPlayersOnline(String server) {
BungeeServerInfo info = trackedServers.get(server); BungeeServerInfo info = trackedServers.get(server);
if (info != null) { if (info != null) {
info.updateLastRequest(); info.updateLastRequest();
@ -65,7 +74,7 @@ public class BungeeServerTracker {
} }
} }
public static String getMaxPlayers(String server) { public String getMaxPlayers(String server) {
if (!Configuration.pingerEnabled) { if (!Configuration.pingerEnabled) {
return PINGER_NOT_ENABLED_ERROR; return PINGER_NOT_ENABLED_ERROR;
} }
@ -81,7 +90,7 @@ public class BungeeServerTracker {
} }
} }
public static String getMotd1(String server) { public String getMotd1(String server) {
if (!Configuration.pingerEnabled) { if (!Configuration.pingerEnabled) {
return PINGER_NOT_ENABLED_ERROR; return PINGER_NOT_ENABLED_ERROR;
} }
@ -97,7 +106,7 @@ public class BungeeServerTracker {
} }
} }
public static String getMotd2(String server) { public String getMotd2(String server) {
if (!Configuration.pingerEnabled) { if (!Configuration.pingerEnabled) {
return PINGER_NOT_ENABLED_ERROR; return PINGER_NOT_ENABLED_ERROR;
} }
@ -113,7 +122,7 @@ public class BungeeServerTracker {
} }
} }
public static String getOnlineStatus(String server) { public String getOnlineStatus(String server) {
if (!Configuration.pingerEnabled) { if (!Configuration.pingerEnabled) {
return PINGER_NOT_ENABLED_ERROR; return PINGER_NOT_ENABLED_ERROR;
} }
@ -129,11 +138,11 @@ public class BungeeServerTracker {
} }
} }
public static Map<String, BungeeServerInfo> getTrackedServers() { public Map<String, BungeeServerInfo> getTrackedServers() {
return trackedServers; return trackedServers;
} }
public static void restartTask(int refreshSeconds) { public void restartTask(int refreshSeconds) {
if (taskID != -1) { if (taskID != -1) {
Bukkit.getScheduler().cancelTask(taskID); Bukkit.getScheduler().cancelTask(taskID);
} }
@ -143,14 +152,14 @@ public class BungeeServerTracker {
runAsyncPinger(); runAsyncPinger();
} else { } else {
for (String server : trackedServers.keySet()) { for (String server : trackedServers.keySet()) {
BungeeChannel.getInstance().askPlayerCount(server); bungeeChannel.askPlayerCount(server);
} }
} }
}, 1, refreshSeconds * 20L); }, 1, refreshSeconds * 20L);
} }
private static void runAsyncPinger() { private void runAsyncPinger() {
Bukkit.getScheduler().runTaskAsynchronously(HolographicDisplays.getInstance(), () -> { Bukkit.getScheduler().runTaskAsynchronously(HolographicDisplays.getInstance(), () -> {
for (ServerAddress serverAddress : Configuration.pingerServers) { for (ServerAddress serverAddress : Configuration.pingerServers) {
BungeeServerInfo serverInfo = getOrCreateServerInfo(serverAddress.getName()); BungeeServerInfo serverInfo = getOrCreateServerInfo(serverAddress.getName());

View File

@ -37,6 +37,8 @@ public class PlaceholdersManager {
private static final Pattern ANIMATION_PATTERN = makePlaceholderWithArgsPattern("animation"); private static final Pattern ANIMATION_PATTERN = makePlaceholderWithArgsPattern("animation");
private static final Pattern WORLD_PATTERN = makePlaceholderWithArgsPattern("world"); private static final Pattern WORLD_PATTERN = makePlaceholderWithArgsPattern("world");
private static BungeeServerTracker bungeeServerTracker;
private static Pattern makePlaceholderWithArgsPattern(String prefix) { private static Pattern makePlaceholderWithArgsPattern(String prefix) {
return Pattern.compile("(\\{" + Pattern.quote(prefix) + ":)(.+?)(\\})"); return Pattern.compile("(\\{" + Pattern.quote(prefix) + ":)(.+?)(\\})");
} }
@ -46,7 +48,9 @@ public class PlaceholdersManager {
} }
public static void startRefreshTask(Plugin plugin) { public static void startRefreshTask(Plugin plugin, BungeeServerTracker bungeeServerTracker) {
PlaceholdersManager.bungeeServerTracker = bungeeServerTracker;
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> { Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
for (Placeholder placeholder : PlaceholdersRegistry.getPlaceholders()) { for (Placeholder placeholder : PlaceholdersRegistry.getPlaceholders()) {
@ -167,7 +171,7 @@ public class PlaceholdersManager {
} }
final String serverName = extractArgumentFromPlaceholder(matcher); final String serverName = extractArgumentFromPlaceholder(matcher);
BungeeServerTracker.track(serverName); // Track this server. bungeeServerTracker.track(serverName); // Track this server.
if (serverName.contains(",")) { if (serverName.contains(",")) {
String[] split = serverName.split(","); String[] split = serverName.split(",");
@ -181,14 +185,14 @@ public class PlaceholdersManager {
bungeeReplacers.put(matcher.group(), () -> { bungeeReplacers.put(matcher.group(), () -> {
int count = 0; int count = 0;
for (String serverToTrack : serversToTrack) { for (String serverToTrack : serversToTrack) {
count += BungeeServerTracker.getPlayersOnline(serverToTrack); count += bungeeServerTracker.getPlayersOnline(serverToTrack);
} }
return String.valueOf(count); return String.valueOf(count);
}); });
} else { } else {
// Normal, single tracked server. // Normal, single tracked server.
bungeeReplacers.put(matcher.group(), () -> { bungeeReplacers.put(matcher.group(), () -> {
return String.valueOf(BungeeServerTracker.getPlayersOnline(serverName)); return String.valueOf(bungeeServerTracker.getPlayersOnline(serverName));
}); });
} }
} }
@ -201,11 +205,11 @@ public class PlaceholdersManager {
} }
final String serverName = extractArgumentFromPlaceholder(matcher); final String serverName = extractArgumentFromPlaceholder(matcher);
BungeeServerTracker.track(serverName); // Track this server. bungeeServerTracker.track(serverName); // Track this server.
// Add it to tracked servers. // Add it to tracked servers.
bungeeReplacers.put(matcher.group(), () -> { bungeeReplacers.put(matcher.group(), () -> {
return BungeeServerTracker.getMaxPlayers(serverName); return bungeeServerTracker.getMaxPlayers(serverName);
}); });
} }
@ -217,11 +221,11 @@ public class PlaceholdersManager {
} }
final String serverName = extractArgumentFromPlaceholder(matcher); final String serverName = extractArgumentFromPlaceholder(matcher);
BungeeServerTracker.track(serverName); // Track this server. bungeeServerTracker.track(serverName); // Track this server.
// Add it to tracked servers. // Add it to tracked servers.
bungeeReplacers.put(matcher.group(), () -> { bungeeReplacers.put(matcher.group(), () -> {
return BungeeServerTracker.getMotd1(serverName); return bungeeServerTracker.getMotd1(serverName);
}); });
} }
@ -233,11 +237,11 @@ public class PlaceholdersManager {
} }
final String serverName = extractArgumentFromPlaceholder(matcher); final String serverName = extractArgumentFromPlaceholder(matcher);
BungeeServerTracker.track(serverName); // Track this server. bungeeServerTracker.track(serverName); // Track this server.
// Add it to tracked servers. // Add it to tracked servers.
bungeeReplacers.put(matcher.group(), () -> { bungeeReplacers.put(matcher.group(), () -> {
return BungeeServerTracker.getMotd2(serverName); return bungeeServerTracker.getMotd2(serverName);
}); });
} }
@ -249,11 +253,11 @@ public class PlaceholdersManager {
} }
final String serverName = extractArgumentFromPlaceholder(matcher); final String serverName = extractArgumentFromPlaceholder(matcher);
BungeeServerTracker.track(serverName); // Track this server. bungeeServerTracker.track(serverName); // Track this server.
// Add it to tracked servers. // Add it to tracked servers.
bungeeReplacers.put(matcher.group(), () -> { bungeeReplacers.put(matcher.group(), () -> {
return BungeeServerTracker.getOnlineStatus(serverName); return bungeeServerTracker.getOnlineStatus(serverName);
}); });
} }

View File

@ -19,11 +19,17 @@ import java.util.concurrent.TimeUnit;
public class BungeeCleanupTask implements Runnable { public class BungeeCleanupTask implements Runnable {
private static final long MAX_INACTIVITY = TimeUnit.MINUTES.toMillis(10); private static final long MAX_INACTIVITY = TimeUnit.MINUTES.toMillis(10);
private final BungeeServerTracker bungeeServerTracker;
public BungeeCleanupTask(BungeeServerTracker bungeeServerTracker) {
this.bungeeServerTracker = bungeeServerTracker;
}
@Override @Override
public void run() { public void run() {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
Iterator<Entry<String, BungeeServerInfo>> iter = BungeeServerTracker.getTrackedServers().entrySet().iterator(); Iterator<Entry<String, BungeeServerInfo>> iter = bungeeServerTracker.getTrackedServers().entrySet().iterator();
while (iter.hasNext()) { while (iter.hasNext()) {
Entry<String, BungeeServerInfo> next = iter.next(); Entry<String, BungeeServerInfo> next = iter.next();