diff --git a/README.md b/README.md
index bdab0e8..281f612 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# Bungeecord-Expansion
+
Expansion for bungeecord placeholders
-[](http://ci.extendedclip.com/job/Bungeecord-Expansion/)
+[](http://ci.extendedclip.com/job/Bungeecord-Expansion/)
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 69946af..64a9370 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,10 +1,10 @@
-
4.0.0
com.extendedclip.papi.bungeeexpansion
bungee-expansion
- 2.0-SNAPSHOT
+ 3.0-SNAPSHOT
PAPI-Expansion-Bungee
PlaceholderAPI expansion for bungeecord placeholders
@@ -29,13 +29,13 @@
org.spigotmc
spigot-api
- 1.15.2-R0.1-SNAPSHOT
+ 1.18-R0.1-SNAPSHOT
provided
me.clip
placeholderapi
- 2.10.6
+ 2.11.0
provided
@@ -58,5 +58,4 @@
-
\ No newline at end of file
diff --git a/src/main/java/com/extendedclip/papi/bungeeexpansion/BungeeExpansion.java b/src/main/java/com/extendedclip/papi/bungeeexpansion/BungeeExpansion.java
index 5170a40..049c802 100644
--- a/src/main/java/com/extendedclip/papi/bungeeexpansion/BungeeExpansion.java
+++ b/src/main/java/com/extendedclip/papi/bungeeexpansion/BungeeExpansion.java
@@ -13,6 +13,8 @@
import org.bukkit.entity.Player;
import org.bukkit.plugin.messaging.PluginMessageListener;
import org.bukkit.scheduler.BukkitTask;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.HashMap;
@@ -22,134 +24,145 @@
public final class BungeeExpansion extends PlaceholderExpansion implements PluginMessageListener, Taskable, Configurable {
- private static final String MESSAGE_CHANNEL = "BungeeCord";
- private static final String SERVERS_CHANNEL = "GetServers";
- private static final String PLAYERS_CHANNEL = "PlayerCount";
- private static final String CONFIG_INTERVAL = "check_interval";
-
- private static final Splitter SPLITTER = Splitter.on(",").trimResults();
-
-
- private final Map counts = new HashMap<>();
- private final AtomicReference cached = new AtomicReference<>();
-
-
- @Override
- public String getIdentifier() {
- return "bungee";
- }
-
- @Override
- public String getAuthor() {
- return "clip";
- }
-
- @Override
- public String getVersion() {
- return "2.0";
- }
-
- @Override
- public Map getDefaults() {
- return Collections.singletonMap(CONFIG_INTERVAL, 30);
- }
-
-
- @Override
- public String onRequest(final OfflinePlayer player, String identifier) {
- final int value;
-
- switch (identifier.toLowerCase()) {
- case "all":
- case "total":
- value = counts.values().stream().mapToInt(Integer::intValue).sum();
- break;
- default:
- value = counts.getOrDefault(identifier.toLowerCase(), 0);
- break;
- }
-
- return String.valueOf(value);
- }
-
- @Override
- public void start() {
- final BukkitTask task = Bukkit.getScheduler().runTaskTimer(getPlaceholderAPI(), () -> {
-
- if (counts.isEmpty()) {
- sendServersChannelMessage();
- }
- else {
- counts.keySet().forEach(this::sendPlayersChannelMessage);
- }
-
- }, 20L * 2L, 20L * getLong(CONFIG_INTERVAL, 30));
-
-
- final BukkitTask prev = cached.getAndSet(task);
- if (prev != null) {
- prev.cancel();
- } else {
- Bukkit.getMessenger().registerOutgoingPluginChannel(getPlaceholderAPI(), MESSAGE_CHANNEL);
- Bukkit.getMessenger().registerIncomingPluginChannel(getPlaceholderAPI(), MESSAGE_CHANNEL, this);
- }
- }
-
- @Override
- public void stop() {
- final BukkitTask prev = cached.getAndSet(null);
- if (prev == null) {
- return;
- }
-
- prev.cancel();
- counts.clear();
-
- Bukkit.getMessenger().unregisterOutgoingPluginChannel(getPlaceholderAPI(), MESSAGE_CHANNEL);
- Bukkit.getMessenger().unregisterIncomingPluginChannel(getPlaceholderAPI(), MESSAGE_CHANNEL, this);
- }
-
-
- @Override
- public void onPluginMessageReceived(final String channel, final Player player, final byte[] message) {
- if (!MESSAGE_CHANNEL.equals(channel)) {
- return;
- }
-
- //noinspection UnstableApiUsage
- final ByteArrayDataInput in = ByteStreams.newDataInput(message);
- switch (in.readUTF()) {
- case PLAYERS_CHANNEL:
- counts.put(in.readUTF(), in.readInt());
- break;
- case SERVERS_CHANNEL:
- SPLITTER.split(in.readUTF()).forEach(serverName -> counts.putIfAbsent(serverName, 0));
- break;
- }
- }
-
-
- private void sendServersChannelMessage() {
- sendMessage(SERVERS_CHANNEL, out -> { });
- }
-
- private void sendPlayersChannelMessage(final String serverName) {
- sendMessage(PLAYERS_CHANNEL, out -> out.writeUTF(serverName));
- }
-
- private void sendMessage(final String channel, final Consumer consumer) {
- final Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
- if (player == null) {
- return;
- }
-
- //noinspection UnstableApiUsage
- final ByteArrayDataOutput out = ByteStreams.newDataOutput();
- out.writeUTF(channel);
-
- consumer.accept(out);
-
- player.sendPluginMessage(getPlaceholderAPI(), MESSAGE_CHANNEL, out.toByteArray());
- }
+ private static final String MESSAGE_CHANNEL = "BungeeCord";
+
+ // BungeeCord Subchannels
+ private static final String SERVER_SUBCHANNEL = "GetServer";
+ private static final String SERVERS_SUBCHANNEL = "GetServers";
+ private static final String PLAYERS_SUBCHANNEL = "PlayerCount";
+
+ private static final String CONFIG_INTERVAL = "check_interval";
+ private static final Splitter SPLITTER = Splitter.on(",").trimResults();
+
+ private final Map counts = new HashMap<>();
+ private final AtomicReference cached = new AtomicReference<>();
+
+ private String serverName = "";
+
+ @Override
+ public @NotNull String getIdentifier() {
+ return "bungee";
+ }
+
+ @Override
+ public @NotNull String getAuthor() {
+ return "clip";
+ }
+
+ @Override
+ public @NotNull String getVersion() {
+ return "3.0";
+ }
+
+ @Override
+ public Map getDefaults() {
+ return Collections.singletonMap(CONFIG_INTERVAL, 30);
+ }
+
+ @Override
+ public String onRequest(final OfflinePlayer player, @NotNull String identifier) {
+ switch (identifier) {
+ case "count":
+ return Integer.toString(counts.getOrDefault(serverName, 0));
+
+ case "server_name":
+ return serverName.isEmpty() ? "" : serverName;
+ }
+
+ if (identifier.startsWith("count_")) {
+ final int value;
+ switch (identifier) {
+ case "count_all":
+ case "count_total":
+ value = counts.values().stream().mapToInt(Integer::intValue).sum();
+ break;
+
+ default:
+ String serverName = identifier.substring(identifier.indexOf('_') + 1);
+ value = counts.getOrDefault(serverName, 0);
+ break;
+ }
+ return Integer.toString(value);
+ }
+ return null;
+ }
+
+ @Override
+ public void start() {
+ final BukkitTask task = Bukkit.getScheduler().runTaskTimer(getPlaceholderAPI(), () -> {
+ if (counts.isEmpty()) {
+ sendServersSubchannelMessage();
+ } else {
+ counts.keySet().forEach(this::sendPlayersSubchannelMessage);
+ }
+ }, 20L * 2L, 20L * getLong(CONFIG_INTERVAL, 30));
+
+ final BukkitTask prev = cached.getAndSet(task);
+ if (prev != null) {
+ prev.cancel();
+ } else {
+ Bukkit.getMessenger().registerOutgoingPluginChannel(getPlaceholderAPI(), MESSAGE_CHANNEL);
+ Bukkit.getMessenger().registerIncomingPluginChannel(getPlaceholderAPI(), MESSAGE_CHANNEL, this);
+ }
+
+ sendServerSubchannelMessage();
+ }
+
+ @Override
+ public void stop() {
+ final BukkitTask prev = cached.getAndSet(null);
+ if (prev == null) return;
+
+ prev.cancel();
+ counts.clear();
+
+ Bukkit.getMessenger().unregisterOutgoingPluginChannel(getPlaceholderAPI(), MESSAGE_CHANNEL);
+ Bukkit.getMessenger().unregisterIncomingPluginChannel(getPlaceholderAPI(), MESSAGE_CHANNEL, this);
+ }
+
+ @Override
+ public void onPluginMessageReceived(final @NotNull String channel, final @NotNull Player player, final byte[] message) {
+ if (!MESSAGE_CHANNEL.equals(channel)) return;
+
+ //noinspection UnstableApiUsage
+ final ByteArrayDataInput in = ByteStreams.newDataInput(message);
+ switch (in.readUTF()) {
+ case PLAYERS_SUBCHANNEL:
+ counts.put(in.readUTF(), in.readInt());
+ break;
+
+ case SERVER_SUBCHANNEL:
+ serverName = in.readUTF();
+ break;
+
+ case SERVERS_SUBCHANNEL:
+ SPLITTER.split(in.readUTF()).forEach(serverName -> counts.putIfAbsent(serverName, 0));
+ break;
+ }
+ }
+
+ private void sendServerSubchannelMessage() {
+ sendChanncelMessage(SERVER_SUBCHANNEL, null);
+ }
+
+ private void sendServersSubchannelMessage() {
+ sendChanncelMessage(SERVERS_SUBCHANNEL, null);
+ }
+
+ private void sendPlayersSubchannelMessage(@NotNull final String serverName) {
+ sendChanncelMessage(PLAYERS_SUBCHANNEL, out -> out.writeUTF(serverName));
+ }
+
+ private void sendChanncelMessage(@NotNull final String channel, @Nullable final Consumer consumer) {
+ final Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
+ if (player == null) return;
+
+ final ByteArrayDataOutput out = ByteStreams.newDataOutput();
+ out.writeUTF(channel);
+
+ if (consumer != null) consumer.accept(out);
+
+ player.sendPluginMessage(getPlaceholderAPI(), MESSAGE_CHANNEL, out.toByteArray());
+ }
}
\ No newline at end of file