package com.dsh105.holoapi.hook;
import com.dsh105.commodus.ServerUtil;
import com.dsh105.holoapi.config.Settings;
import com.dsh105.holoapi.util.MiscUtil;
import net.minecraft.util.io.netty.buffer.ByteBuf;
import net.minecraft.util.io.netty.buffer.Unpooled;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
import java.util.HashMap;
import java.util.Map;
public class BungeeProvider implements PluginMessageListener, Runnable {
private final Plugin plugin;
private final Map<String, Integer> playerCounts = new HashMap<String, Integer>();
private boolean disabled = false;
public BungeeProvider(Plugin plugin) {
this.plugin = plugin;
if (!Settings.USE_BUNGEE.getValue()) {
disabled = true;
return; // BungeeCord is disabled
}
// Register BungeeCord channels
plugin.getServer().getMessenger().registerIncomingPluginChannel(plugin, "BungeeCord", this);
plugin.getServer().getMessenger().registerOutgoingPluginChannel(plugin, "BungeeCord");
// Register our repeating task to get player counts
plugin.getServer().getScheduler().runTaskTimer(plugin, this, 100L, 100L); // Run at five-second intervals
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] bytes) {
ByteBuf buf = Unpooled.wrappedBuffer(bytes);
String operation = MiscUtil.readPrefixedString(buf);
if (operation.equals("GetServers")) {
String[] serverList = MiscUtil.readPrefixedString(buf).split(", ");
for (String server : serverList) {
requestPlayerCount(server);
}
} else if (operation.equals("PlayerCount")) {
String server = MiscUtil.readPrefixedString(buf);
int playerCount = buf.readInt();
playerCounts.put(server, playerCount);
}
buf.release();
}
private void requestPlayerCount(String serverName) {
if (ServerUtil.getOnlinePlayers().size() == 0) {
return; // No players online; we can't send this request yet.
}
ByteBuf buf = Unpooled.buffer();
MiscUtil.writePrefixedString(buf, "PlayerCount");
MiscUtil.writePrefixedString(buf, serverName);
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
ServerUtil.getOnlinePlayer(0).sendPluginMessage(plugin, "BungeeCord", bytes);
buf.release();
}
// Request the server list.
// Receiving the server list will trigger player count requests
@Override
public void run() {
if (ServerUtil.getOnlinePlayers().size() == 0) {
return;
}
ByteBuf buf = Unpooled.buffer();
MiscUtil.writePrefixedString(buf, "GetServers");
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
ServerUtil.getOnlinePlayer(0).sendPluginMessage(plugin, "BungeeCord", bytes);
buf.release();
}
public int getPlayerCount(String server) {
if (disabled) {
return 0;
}
if (server.equalsIgnoreCase("all")) { // Special case for all servers
int total = 0;
for (int num : playerCounts.values()) {
total += num;
}
return total;
}
if (playerCounts.containsKey(server)) {
return playerCounts.get(server);
}
return 0;
}
}