Skip to content

general code improvements, reduce fetch interval from 60 seconds to 1 seconds #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>com.helpchat</groupId>
<artifactId>RedisBungeeExpansion</artifactId>
<version>2.0.1</version>
<version>2.0.3</version>
<packaging>jar</packaging>

<name>RedisBungeeExpansion</name>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,39 @@

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;
import me.clip.placeholderapi.expansion.Taskable;
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<String, Integer> 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<String> readServers = new HashSet<>();
private final ConcurrentHashMap<String, Integer> 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<String> srvs = getStringList("tracked_servers");

if (srvs != null && !srvs.isEmpty()) {
if (!srvs.isEmpty()) {
for (String s : srvs) {
servers.put(s, 0);
}
Expand All @@ -74,7 +59,7 @@ public String getAuthor() {

@Override
public String getVersion() {
return "2.0.1";
return "2.0.3";
}

@Override
Expand Down Expand Up @@ -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);
Expand All @@ -125,75 +110,80 @@ 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;
}

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")) {
Expand All @@ -202,25 +192,20 @@ 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) {
return;
}

for (String server : serverList) {

if (!servers.containsKey(server)) {
servers.put(server, 0);
}
}
}

} catch (Exception e) {
} catch (Exception ignored) {
}
}
}