diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueHolder.java b/api/src/main/java/us/ajg0702/queue/api/QueueHolder.java new file mode 100644 index 00000000..a3ceb66a --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/QueueHolder.java @@ -0,0 +1,6 @@ +package us.ajg0702.queue.api; + +public interface QueueHolder { + boolean isAvailable(); + +} \ No newline at end of file diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/placeholders/PlaceholderExpansion.java b/spigot/src/main/java/us/ajg0702/queue/spigot/placeholders/PlaceholderExpansion.java index 374024cc..f4d1eaee 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/placeholders/PlaceholderExpansion.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/placeholders/PlaceholderExpansion.java @@ -30,6 +30,7 @@ public PlaceholderExpansion(SpigotMain plugin) { placeholders.add(new Queued(plugin)); placeholders.add(new QueuedFor(plugin)); placeholders.add(new Status(plugin)); + placeholders.add(new StatusPlayer(plugin)); } diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/placeholders/placeholders/StatusPlayer.java b/spigot/src/main/java/us/ajg0702/queue/spigot/placeholders/placeholders/StatusPlayer.java new file mode 100644 index 00000000..8fe71e0f --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/placeholders/placeholders/StatusPlayer.java @@ -0,0 +1,59 @@ +package us.ajg0702.queue.spigot.placeholders.placeholders; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import us.ajg0702.queue.api.spigot.AjQueueSpigotAPI; +import us.ajg0702.queue.api.spigot.MessagedResponse; +import us.ajg0702.queue.spigot.SpigotMain; +import us.ajg0702.queue.spigot.placeholders.Placeholder; +import us.ajg0702.queue.spigot.utils.UUIDStringKey; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; +import java.util.regex.Matcher; + +public class StatusPlayer extends Placeholder { + public StatusPlayer(SpigotMain plugin) { + super(plugin); + } + + private final Map cache = new ConcurrentHashMap<>(); + + @Override + public String getRegex() { + return "status_(.*)_player"; + } + + @Override + public String parse(Matcher matcher, OfflinePlayer p) { + String queue = matcher.group(1); + UUIDStringKey key = new UUIDStringKey(p.getUniqueId(), queue); + + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + try { + String response = AjQueueSpigotAPI.getInstance() + .getServerStatusString(queue, p.getUniqueId()) + .get(30, TimeUnit.SECONDS); + + cache.put(key, response); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } catch (TimeoutException e) { + plugin.getLogger().log(Level.WARNING, "Timed out while trying to get placeholder data from proxy: ", e); + } + }); + + return cache.getOrDefault(key, "..."); + } + + @Override + public void cleanCache(Player player) { + cache.entrySet().removeIf(entry -> entry.getKey().getUuid().equals(player.getUniqueId())); + } +} diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/utils/UUIDStringKey.java b/spigot/src/main/java/us/ajg0702/queue/spigot/utils/UUIDStringKey.java new file mode 100644 index 00000000..4d22743c --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/utils/UUIDStringKey.java @@ -0,0 +1,36 @@ +package us.ajg0702.queue.spigot.utils; + +import java.util.Objects; +import java.util.UUID; + +public class UUIDStringKey { + + private final UUID uuid; + private final String string; + + public UUIDStringKey(UUID uuid, String string) { + this.uuid = uuid; + this.string = string; + } + + public UUID getUuid() { + return uuid; + } + + public String getString() { + return string; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof UUIDStringKey)) return false; + UUIDStringKey that = (UUIDStringKey) o; + return uuid.equals(that.uuid) && string.equals(that.string); + } + + @Override + public int hashCode() { + return Objects.hash(uuid, string); + } +}