From cdbf09dade956228e8097fc1bdb5ed8564ea8fbc Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 31 May 2021 15:29:51 +0000 Subject: [PATCH 01/56] lemme just try this rq --- build.gradle.kts | 3 --- 1 file changed, 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0d8408c..b9b3dfb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -65,9 +65,6 @@ publishing { name = "Job-Token" value = System.getenv("CI_JOB_TOKEN") } - authentication { - getCredentials(HttpHeaderCredentials::class) - } } } } From 9168a1f11baf25208b232ab56e1e339c939dd208 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Wed, 2 Jun 2021 01:51:51 +0000 Subject: [PATCH 02/56] Rollback --- build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index b9b3dfb..0d8408c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -65,6 +65,9 @@ publishing { name = "Job-Token" value = System.getenv("CI_JOB_TOKEN") } + authentication { + getCredentials(HttpHeaderCredentials::class) + } } } } From f96ae8ea9fb50a750dbd30ef3f91087e1df1dbb4 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 14 Jun 2021 09:57:45 -0700 Subject: [PATCH 03/56] Oh, ajq+ is open source now --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 2ecd4f2..2d1c59f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,4 @@ ajQueue is (as far as I can tell) the best queue plugin out there (even better t This is the source code for ajQueue. If you make changes, open a merge request and ill probably approve it, as long as its not dumb :p ## My dumb code -If you say my code is ugly, fix it and open a merge reguest before making fun of it ;) - -## ajQueuePlus -The source code for ajQueuePlus will probably stay private. \ No newline at end of file +If you say my code is ugly, fix it and open a merge reguest before making fun of it ;) \ No newline at end of file From 2d94105d19c6144faa02a0ec8080be248abdda85 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 24 Jun 2021 18:44:23 -0700 Subject: [PATCH 04/56] whoops, i need those --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 24f0451..ca43195 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -57,7 +57,7 @@ tasks.shadowJar { publishing { publications { create("mavenJava") { - artifact(tasks["jar"]) + artifact(tasks["shadowJar"]) } } From 232bcdea09f86f0f9f6ed539d636f548ddf2195e Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 2 Jul 2021 10:01:28 -0700 Subject: [PATCH 05/56] wip --- .gitignore | 2 +- api/build.gradle.kts | 40 ++ .../us/ajg0702/queue/api/QueueManager.java | 16 + .../queue/api/players/AdaptedPlayer.java | 23 + .../queue/api/players/QueuePlayer.java | 4 + .../ajg0702/queue/api/queues/QueueServer.java | 121 ++++ .../us/ajg0702/queue/api/util/Handle.java | 5 + build.gradle.kts | 25 +- common/build.gradle.kts | 39 ++ settings.gradle.kts | 5 +- .../java/us/ajg0702/queue/AliasManager.java | 11 - src/main/java/us/ajg0702/queue/Logic.java | 13 - src/main/java/us/ajg0702/queue/Main.java | 355 ---------- src/main/java/us/ajg0702/queue/Manager.java | 648 ------------------ .../java/us/ajg0702/queue/QueueServer.java | 248 ------- .../ajg0702/queue/commands/LeaveCommand.java | 75 -- .../ajg0702/queue/commands/ListCommand.java | 59 -- .../ajg0702/queue/commands/ManageCommand.java | 267 -------- .../ajg0702/queue/commands/MoveCommand.java | 51 -- .../us/ajg0702/queue/spigot/Commands.java | 64 -- .../java/us/ajg0702/queue/spigot/Config.java | 59 -- .../java/us/ajg0702/queue/spigot/Main.java | 183 ----- .../us/ajg0702/queue/spigot/Placeholders.java | 214 ------ .../spigot/QueueScoreboardActivator.java | 28 - .../ajg0702/queue/spigot/utils/ActionBar.java | 71 -- .../queue/spigot/utils/VersionSupport.java | 32 - src/main/resources/bungee.yml | 4 - src/main/resources/config.yml | 174 ----- src/main/resources/plugin.yml | 13 - src/test/java/RegexTest.java | 49 -- 30 files changed, 269 insertions(+), 2629 deletions(-) create mode 100644 api/build.gradle.kts create mode 100644 api/src/main/java/us/ajg0702/queue/api/QueueManager.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/util/Handle.java create mode 100644 common/build.gradle.kts delete mode 100644 src/main/java/us/ajg0702/queue/AliasManager.java delete mode 100644 src/main/java/us/ajg0702/queue/Logic.java delete mode 100644 src/main/java/us/ajg0702/queue/Main.java delete mode 100644 src/main/java/us/ajg0702/queue/Manager.java delete mode 100644 src/main/java/us/ajg0702/queue/QueueServer.java delete mode 100644 src/main/java/us/ajg0702/queue/commands/LeaveCommand.java delete mode 100644 src/main/java/us/ajg0702/queue/commands/ListCommand.java delete mode 100644 src/main/java/us/ajg0702/queue/commands/ManageCommand.java delete mode 100644 src/main/java/us/ajg0702/queue/commands/MoveCommand.java delete mode 100644 src/main/java/us/ajg0702/queue/spigot/Commands.java delete mode 100644 src/main/java/us/ajg0702/queue/spigot/Config.java delete mode 100644 src/main/java/us/ajg0702/queue/spigot/Main.java delete mode 100644 src/main/java/us/ajg0702/queue/spigot/Placeholders.java delete mode 100644 src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java delete mode 100644 src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java delete mode 100644 src/main/java/us/ajg0702/queue/spigot/utils/VersionSupport.java delete mode 100644 src/main/resources/bungee.yml delete mode 100644 src/main/resources/config.yml delete mode 100644 src/main/resources/plugin.yml delete mode 100644 src/test/java/RegexTest.java diff --git a/.gitignore b/.gitignore index 4c72aca..c09a764 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ dependency-reduced-pom.xml .gradle build .DS_Store -.nosync \ No newline at end of file +.nosync diff --git a/api/build.gradle.kts b/api/build.gradle.kts new file mode 100644 index 0000000..75be208 --- /dev/null +++ b/api/build.gradle.kts @@ -0,0 +1,40 @@ +plugins { + `java-library` + `maven-publish` +} + +group = "us.ajg0702.queue.api" + +repositories { + mavenCentral() +} + +dependencies { + compileOnly("net.kyori:adventure-api:4.8.1") + compileOnly("com.google.guava:guava:30.1.1-jre") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["jar"]) + } + } + + repositories { + + val mavenUrl = "https://repo.ajg0702.us/releases" + + if(!System.getenv("REPO_TOKEN").isNullOrEmpty()) { + maven { + url = uri(mavenUrl) + name = "ajRepo" + + credentials { + username = "plugins" + password = System.getenv("REPO_TOKEN") + } + } + } + } +} \ No newline at end of file diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java new file mode 100644 index 0000000..4b46e37 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -0,0 +1,16 @@ +package us.ajg0702.queue.api; + +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.queues.QueueServer; + +public interface QueueManager { + + /** + * Adds a player to a queue + * @param player The player to be added + * @param server The server or group to add the player to + * @return True if adding was successfull, false if not. + */ + public boolean addToQueue(AdaptedPlayer player, QueueServer server); + +} diff --git a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java new file mode 100644 index 0000000..0b5b50a --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java @@ -0,0 +1,23 @@ +package us.ajg0702.queue.api.players; + +import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.util.Handle; + +/** + * Represents a cross-platform player + */ +public interface AdaptedPlayer extends Handle { + + /** + * Send a player a message from a Component + * @param message The message to send + */ + void sendMessage(Component message); + + /** + * Send a player a message from a string + * Converted to Component internally + * @param message The message to send + */ + void sendMessage(String message); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java new file mode 100644 index 0000000..937cf83 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java @@ -0,0 +1,4 @@ +package us.ajg0702.queue.api.players; + +public interface QueuePlayer { +} diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java new file mode 100644 index 0000000..dd11580 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -0,0 +1,121 @@ +package us.ajg0702.queue.api.queues; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; + +import java.util.List; +import java.util.UUID; + +/** + * Represents a server or a group that can be queued for + */ +public interface QueueServer { + + /** + * Get the players who are queued. + * @return The players who are queued + */ + ImmutableList getQueue(); + + /** + * Get the status of the server as a string + * @param p The player that you are checking for. Used for checking restricted servers + * @return The status of the server as a string + */ + String getStatusString(AdaptedPlayer p); + + /** + * Get the status of the server as a string. + * Does not check if the player has access using restricted mode. May show online if it is restricted + * @return The status of the server as a string + */ + String getStatusString(); + + /** + * Sends a server ping and uses the response to update online status, player count status, and whitelist status + */ + void updatePing(); + + /** + * Gets the time the server has been offline, in miliseconds + * @return The number of miliseconds the server has been offline for + */ + int getOfflineTime(); + + /** + * Gets how long since the last person was sent + * @return The number of miliseconds since the last person was sent + */ + int getLastSentTime(); + + + + /** + * Gets if the server is whitelisted or not + * @return True if whitelisted, false if not + */ + boolean isWhitelisted(); + + /** + * Sets if the server is whitelisted or not + */ + void setWhitelisted(boolean whitelisted); + + /** + * Gets the list of players who are whitelisted + * @return The list of player UUIDs who are whitelisted + */ + ImmutableList getWhitelistedPlayers(); + + /** + * Sets the list of UUIDs that are whitelisted + */ + void setWhitelistedPlayers(List whitelistedPlayers); + + /** + * Checks if the server is joinable by a player + * @param p The player to see if they can join + * @return If the server is joinable + */ + boolean isJoinable(AdaptedPlayer p); + + /** + * Pauses or unpauses a server + * @param paused true = paused, false = unpaused + */ + void setPaused(boolean paused); + + /** + * Checks if the server is paused + * @return True if the server is paused, false if its not + */ + boolean isPaused(); + + /** + * Checks if the server is online + * @return True if the server is online, false if not + */ + boolean isOnline(); + + /** + * Checks if the server went online within the time set in the config + * @return If the sevrer just came online + */ + boolean justWentOnline(); + + /** + * Checks if the server is full + * @return If the server is full + */ + boolean isFull(); + + /** + * elliot is bad + * @return true because elliot is bad + */ + @SuppressWarnings("unused") + default boolean elliot_is_bad() { + return true; + } +} diff --git a/api/src/main/java/us/ajg0702/queue/api/util/Handle.java b/api/src/main/java/us/ajg0702/queue/api/util/Handle.java new file mode 100644 index 0000000..4210519 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/util/Handle.java @@ -0,0 +1,5 @@ +package us.ajg0702.queue.api.util; + +public interface Handle { + Object getHandle(); +} diff --git a/build.gradle.kts b/build.gradle.kts index 24f0451..58aab0f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,8 +4,21 @@ plugins { `maven-publish` } -group = "us.ajg0702" -version = "1.9.8" +allprojects { + version = "2.0.0" + group = "us.ajg0702" + + tasks.withType().configureEach { + useJUnitPlatform() + + ignoreFailures = false + failFast = true + maxParallelForks = (Runtime.getRuntime().availableProcessors() - 1).takeIf { it > 0 } ?: 1 + + reports.html.isEnabled = false + reports.junitXml.isEnabled = false + } +} repositories { mavenCentral() @@ -23,17 +36,11 @@ repositories { dependencies { testImplementation("junit:junit:4.12") - testImplementation("net.kyori:adventure-text-serializer-bungeecord:4.0.0-SNAPSHOT") - testImplementation("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") - compileOnly("com.github.MyzelYam:PremiumVanishAPI:2.0.3") - compileOnly("net.md-5:bungeecord-api:1.14-SNAPSHOT") - compileOnly(group = "org.spigotmc", name = "spigot", version = "1.16.5-R0.1-SNAPSHOT") compileOnly("me.clip:placeholderapi:2.10.4") compileOnly("net.kyori:adventure-text-serializer-bungeecord:4.0.0-SNAPSHOT") implementation("us.ajg0702:ajUtils:1.0.4") - implementation("org.bstats:bstats-bungeecord:2.2.1") implementation("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") } @@ -51,7 +58,7 @@ tasks.shadowJar { relocate("us.ajg0702.utils", "us.ajg0702.queue.utils") relocate("org.bstats", "us.ajg0702.bstats") relocate("net.kyori", "us.ajg0702.queue.kyori") - archiveFileName.set("${baseName}-${version}.${extension}") + archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}.${archiveExtension.get()}") } publishing { diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 0000000..4d3b28f --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,39 @@ +plugins { + `java-library` + `maven-publish` +} + +group = "us.ajg0702.queue.api" + +repositories { + mavenCentral() +} + +dependencies { + compileOnly("net.kyori:adventure-api:4.8.1") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["jar"]) + } + } + + repositories { + + val mavenUrl = "https://repo.ajg0702.us/releases" + + if(!System.getenv("REPO_TOKEN").isNullOrEmpty()) { + maven { + url = uri(mavenUrl) + name = "ajRepo" + + credentials { + username = "plugins" + password = System.getenv("REPO_TOKEN") + } + } + } + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 874f8e2..cac7c00 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1,4 @@ -rootProject.name = "ajQueue" \ No newline at end of file +rootProject.name = "ajQueue" + +include(":api") +include(":common") \ No newline at end of file diff --git a/src/main/java/us/ajg0702/queue/AliasManager.java b/src/main/java/us/ajg0702/queue/AliasManager.java deleted file mode 100644 index c857153..0000000 --- a/src/main/java/us/ajg0702/queue/AliasManager.java +++ /dev/null @@ -1,11 +0,0 @@ -package us.ajg0702.queue; - -public class AliasManager { - public AliasManager(Main pl) {} - public String getAlias(String server) { - return server; - } - public String getServer(String alias) { - return alias; - } -} diff --git a/src/main/java/us/ajg0702/queue/Logic.java b/src/main/java/us/ajg0702/queue/Logic.java deleted file mode 100644 index 7ff4629..0000000 --- a/src/main/java/us/ajg0702/queue/Logic.java +++ /dev/null @@ -1,13 +0,0 @@ -package us.ajg0702.queue; - -import java.util.List; - -import net.md_5.bungee.api.connection.ProxiedPlayer; - -public class Logic { - - static boolean isp = false; - - public static void priorityLogic(List list, String s, ProxiedPlayer p) {} - -} diff --git a/src/main/java/us/ajg0702/queue/Main.java b/src/main/java/us/ajg0702/queue/Main.java deleted file mode 100644 index d7e4c61..0000000 --- a/src/main/java/us/ajg0702/queue/Main.java +++ /dev/null @@ -1,355 +0,0 @@ -package us.ajg0702.queue; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.PlayerDisconnectEvent; -import net.md_5.bungee.api.event.PluginMessageEvent; -import net.md_5.bungee.api.event.ServerKickEvent; -import net.md_5.bungee.api.event.ServerSwitchEvent; -import net.md_5.bungee.api.plugin.Listener; -import net.md_5.bungee.api.plugin.Plugin; -import net.md_5.bungee.event.EventHandler; -import us.ajg0702.queue.commands.LeaveCommand; -import us.ajg0702.queue.commands.ListCommand; -import us.ajg0702.queue.commands.ManageCommand; -import us.ajg0702.queue.commands.MoveCommand; -import us.ajg0702.utils.bungee.*; - -public class Main extends Plugin implements Listener { - - static Main plugin = null; - - public double timeBetweenPlayers = 5.0; - - BungeeStats metrics; - - BungeeMessages msgs; - - BungeeConfig config; - - Manager man; - - boolean isp; - - MoveCommand moveCommand; - - public AliasManager aliases; - - @Override - public void onEnable() { - plugin = this; - - config = new BungeeConfig(this); - checkConfig(); - - LinkedHashMap d = new LinkedHashMap<>(); - - - d.put("status.offline.base", "&c{SERVER} is {STATUS}. &7You are in position &f{POS}&7 of &f{LEN}&7."); - - d.put("status.offline.offline", "offline"); - d.put("status.offline.restarting", "restarting"); - d.put("status.offline.full", "full"); - d.put("status.offline.restricted", "restricted"); - d.put("status.offline.paused", "paused"); - - d.put("status.online.base", "&7You are in position &f{POS}&7 of &f{LEN}&7. Estimated time: {TIME}"); - d.put("status.left-last-queue", "&aYou left the last queue you were in."); - d.put("status.now-in-queue", "&aYou are now queued for {SERVER}! &7You are in position &f{POS}&7 of &f{LEN}&7.\n&7Type &f/leavequeue&7 or &fclick here&7 to leave the queue!"); - d.put("status.now-in-empty-queue", ""); - d.put("status.sending-now", "&aSending you to &f{SERVER} &anow.."); - - d.put("errors.server-not-exist", "&cThe server {SERVER} does not exist!"); - d.put("errors.already-queued", "&cYou are already queued for that server!"); - d.put("errors.player-only", "&cThis command can only be executed as a player!"); - d.put("errors.already-connected", "&cYou are already connected to this server!"); - d.put("errors.cant-join-paused", "&cYou cannot join the queue for {SERVER} because it is paused."); - d.put("errors.deny-joining-from-server", "&cYou are not allowed to join queues from this server!"); - - d.put("commands.leave-queue", "&aYou left the queue for {SERVER}!"); - d.put("commands.reload", "&aConfig and messages reloaded successfully!"); - d.put("commands.joinqueue.usage", "&cUsage: /joinqueue "); - - d.put("noperm", "&cYou do not have permission to do this!"); - - d.put("format.time.mins", "{m}m {s}s"); - d.put("format.time.secs", "{s} seconds"); - - d.put("list.format", "&b{SERVER} &7({COUNT}): {LIST}"); - d.put("list.playerlist", "&9{NAME}&7, "); - d.put("list.total", "&7Total players in queues: &f{TOTAL}"); - d.put("list.none", "&7None"); - - d.put("spigot.actionbar.online", "&7You are queued for &f{SERVER}&7. You are in position &f{POS}&7 of &f{LEN}&7. Estimated time: {TIME}"); - d.put("spigot.actionbar.offline", "&7You are queued for &f{SERVER}&7. &7You are in position &f{POS}&7 of &f{LEN}&7."); - - d.put("send", "&aAdded &f{PLAYER}&a to the queue for &f{SERVER}"); - d.put("remove", "&aRemoved &f{PLAYER} from all queues they were in."); - - d.put("placeholders.queued.none", "None"); - d.put("placeholders.position.none", "None"); - - d.put("commands.leave.more-args", "&cPlease specify which queue you want to leave! &7You are in these queues: {QUEUES}"); - d.put("commands.leave.queues-list-format", "&f{NAME}&7, "); - d.put("commands.leave.not-queued", "&cYou are not queued for that server! &7You are in these queues: {QUEUES}"); - d.put("commands.leave.no-queues", "&cYou are not queued!"); - - d.put("commands.pause.more-args", "&cUsage: /ajqueue pause [on/off]"); - d.put("commands.pause.no-server", "&cThat server does not exist!"); - d.put("commands.pause.success", "&aThe queue for &f{SERVER} &ais now {PAUSED}"); - d.put("commands.pause.paused.true", "&epaused"); - d.put("commands.pause.paused.false", "&aun-paused"); - - d.put("commands.send.player-not-found", "&cThat player could not be found. Make sure they are online!"); - - d.put("commands.listqueues.header", "&9Queues:"); - d.put("commands.listqueues.format", "{COLOR}{NAME}&7: {COUNT} queued"); - - d.put("max-tries-reached", "&cUnable to connect to {SERVER}. Max retries reached."); - d.put("auto-queued", "&aYou've been auto-queued for {SERVER} because you were kicked."); - - msgs = BungeeMessages.getInstance(this, d); - - aliases = new AliasManager(this); - - moveCommand = new MoveCommand(this); - this.getProxy().getPluginManager().registerCommand(this, moveCommand); - this.getProxy().getPluginManager().registerCommand(this, new ManageCommand(this)); - this.getProxy().getPluginManager().registerCommand(this, new LeaveCommand(this)); - this.getProxy().getPluginManager().registerCommand(this, new ListCommand(this)); - - this.getProxy().getPluginManager().registerListener(this, this); - - getProxy().registerChannel("ajqueue:tospigot"); - getProxy().registerChannel("ajqueue:tobungee"); - - timeBetweenPlayers = config.getDouble("wait-time"); - - isp = Logic.isp; - - man = Manager.getInstance(this); - - - metrics = new BungeeStats(this, 7404); - metrics.addCustomChart(new BungeeStats.SimplePie("premium", () -> isp+"")); - - } - - public boolean isp() { - return isp; - } - - - - public void checkConfig() { - if(config == null) { - getLogger().warning("Config is null!"); - } - List svs = getConfig().getStringList("queue-servers"); - for(String s : svs) { - if(!s.contains(":")) { - getLogger().warning("The queue-servers section in the config has been set up incorrectly! Please read the comment above the setting and make sure you have a queue server and a destination server separated by a colon (:)"); - break; - } - } - } - - public BungeeConfig getConfig() { - return config; - } - - public static BaseComponent[] formatMessage(String text) { - return TextComponent.fromLegacyText(net.md_5.bungee.api.ChatColor.translateAlternateColorCodes('&', text)); - } - - - @EventHandler - public void moveServer(ServerSwitchEvent e) { - ProxiedPlayer p = e.getPlayer(); - List alreadyqueued = man.findPlayerInQueue(p); - for(QueueServer ser : alreadyqueued) { - List queue = ser.getQueue(); - int pos = queue.indexOf(p); - if((pos == 0 && ser.getInfos().contains(p.getServer().getInfo())) || config.getBoolean("remove-player-on-server-switch")) { - queue.remove(p); - ser.setLastSentTime(System.currentTimeMillis()); - Manager.getInstance().sendingAttempts.remove(p); - } - } - - String servername = e.getPlayer().getServer().getInfo().getName(); - List svs = config.getStringList("queue-servers"); - for(String s : svs) { - if(!s.contains(":")) continue; - String[] parts = s.split(":"); - String from = parts[0]; - String to = parts[1]; - if(from.equalsIgnoreCase(servername)) { - man.addToQueue(p, to); - } - } - } - - @EventHandler - public void onLeave(PlayerDisconnectEvent e) { - ProxiedPlayer p = e.getPlayer(); - //if(p.hasPermission("ajqueue.stay-queued-on-leave")) return; - List servers = man.findPlayerInQueue(p); - for(QueueServer server : servers) { - server.getQueue().remove(p); - } - man.sendingNowAntiSpam.remove(p); - } - - @EventHandler - public void onFailedMove(ServerKickEvent e) { - final ProxiedPlayer p = e.getPlayer(); - List queuedServers = man.findPlayerInQueue(p); - - - if(!queuedServers.contains(man.getServer(e.getKickedFrom().getName())) && config.getBoolean("auto-add-to-queue-on-kick")) { - - StringBuilder plainReason = new StringBuilder(); - for(BaseComponent b : e.getKickReasonComponent()) { - plainReason.append(b.toPlainText()); - } - - List reasons = config.getStringList("auto-add-kick-reasons"); - boolean shouldqueue = false; - for(String reason : reasons) { - if(plainReason.toString().toLowerCase().contains(reason.toLowerCase())) { - shouldqueue = true; - break; - } - } - if(shouldqueue || reasons.isEmpty()) { - plugin.getProxy().getScheduler().schedule(this, () -> { - if(!p.isConnected()) return; - - String toName = e.getKickedFrom().getName(); - p.sendMessage(msgs.getBC("auto-queued", "SERVER:"+toName)); - man.addToQueue(p, toName); - }, (long) (config.getDouble("auto-add-to-queue-on-kick-delay")*1000), TimeUnit.MILLISECONDS); - return; - } - - } - - - for(QueueServer server : queuedServers) { - if(!(server.getInfos().contains(e.getKickedFrom()))) continue; - if(server.getQueue().indexOf(p) != 0) continue; - List kickreasons = config.getStringList("kick-reasons"); - //getLogger().info(e.getKickReasonComponent()); - StringBuilder plainReason = new StringBuilder(); - for(BaseComponent b : e.getKickReasonComponent()) { - plainReason.append(b.toPlainText()); - } - for(String reason : kickreasons) { - if(plainReason.toString().toLowerCase().contains(reason.toLowerCase())) { - server.getQueue().remove(p); - } - } - if(config.getBoolean("send-fail-debug")) { - StringBuilder r = new StringBuilder(); - for(BaseComponent b : e.getKickReasonComponent()) { - r.append(b.toPlainText()); - } - getLogger().warning("Failed to send "+p.getName()+" to "+e.getKickedFrom().getName()+" because "+r); - } - } - } - - - @EventHandler - public void onMessage(PluginMessageEvent e) { - //getLogger().info("Recieved message of "+e.getTag()); - if(e.getTag().equals("ajqueue:tospigot")) { - e.setCancelled(true); - return; - } - if(!e.getTag().equals("ajqueue:tobungee")) return; - if(!(e.getReceiver() instanceof ProxiedPlayer)) return; - e.setCancelled(true); - DataInputStream in = new DataInputStream(new ByteArrayInputStream(e.getData())); - try { - String subchannel = in.readUTF(); - ProxiedPlayer player = (ProxiedPlayer) e.getReceiver(); - - - if(subchannel.equals("queue")) { - String data = in.readUTF(); - String[] args = new String[1]; - args[0] = data; - moveCommand.execute(player, args); - //man.addToQueue(player, data); - - } - if(subchannel.equals("massqueue")) { - String data = in.readUTF(); - String[] parts = data.split(","); - for(String part : parts) { - String[] pparts = part.split(":"); - if(pparts.length < 2) continue; - String pname = pparts[0]; - String pserver = pparts[1]; - ProxiedPlayer p = ProxyServer.getInstance().getPlayer(pname); - String[] args = new String[1]; - args[0] = pserver; - moveCommand.execute(p, args); - } - } - if(subchannel.equals("queuename")) { - BungeeUtils.sendCustomData(player, "queuename", aliases.getAlias(man.getQueuedName(player))); - } - if(subchannel.equals("position")) { - QueueServer server = man.getSingleServer(player); - String pos = msgs.getString("placeholders.position.none"); - if(server != null) { - pos = server.getQueue().indexOf(player)+1+""; - } - BungeeUtils.sendCustomData(player, "position", pos); - } - if(subchannel.equals("positionof")) { - QueueServer server = man.getSingleServer(player); - String pos = msgs.getString("placeholders.position.none"); - if(server != null) { - pos = server.getQueue().size()+""; - } - BungeeUtils.sendCustomData(player, "positionof", pos); - } - if(subchannel.equals("inqueue")) { - QueueServer server = man.getSingleServer(player); - BungeeUtils.sendCustomData(player, "inqueue", (server != null)+""); - } - if(subchannel.equals("queuedfor")) { - String srv = in.readUTF(); - QueueServer server = man.findServer(srv); - if(server == null) return; - BungeeUtils.sendCustomData(player, "queuedfor", srv, server.getQueue().size()+""); - } - if(subchannel.equals("leavequeue")) { - String arg = ""; - try { - arg = in.readUTF(); - } catch(Exception ignored) {} - getProxy().getPluginManager().dispatchCommand(player, "leavequeue"+arg); - } - - } catch (IOException e1) { - getLogger().warning("An error occured while reading data from spigot side:"); - e1.printStackTrace(); - } - } - -} diff --git a/src/main/java/us/ajg0702/queue/Manager.java b/src/main/java/us/ajg0702/queue/Manager.java deleted file mode 100644 index 1014659..0000000 --- a/src/main/java/us/ajg0702/queue/Manager.java +++ /dev/null @@ -1,648 +0,0 @@ -package us.ajg0702.queue; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.ServerPing; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import us.ajg0702.utils.GenUtils; -import us.ajg0702.utils.bungee.BungeeMessages; -import us.ajg0702.utils.bungee.BungeeUtils; - -public class Manager { - - static Manager INSTANCE = null; - public static Manager getInstance(Main pl) { - if(INSTANCE == null) { - INSTANCE = new Manager(pl); - } - return INSTANCE; - } - public static Manager getInstance() { - return INSTANCE; - } - - BungeeMessages msgs; - - - Main pl; - private Manager(Main pl) { - this.pl = pl; - msgs = BungeeMessages.getInstance(); - reloadIntervals(); - if(!pl.config.getBoolean("wait-to-load-servers")) { - pl.getProxy().getScheduler().schedule(pl, this::reloadServers, 0, TimeUnit.MILLISECONDS); - } else { - pl.getProxy().getScheduler().schedule(pl, this::reloadServers, pl.config.getInt("wait-to-load-servers-delay"), TimeUnit.MILLISECONDS); - } - } - - /* - * Returns all servers - */ - public List getServers() { - return servers; - } - - /** - * Returns the name of all servers and groups - * @return The names of all servers and groups - */ - public List getServerNames() { - List names = new ArrayList<>(); - for(QueueServer s : servers) { - names.add(s.getName()); - } - return names; - } - - - - int sendId = -1; - int updateId = -1; - int messagerId = -1; - int actionbarId = -1; - int srvRefId = -1; - int queueEventId = -1; - /** - * Clears all intervals and re-makes them - */ - public void reloadIntervals() { - if(sendId != -1) { - try { - pl.getProxy().getScheduler().cancel(sendId); - } catch(IllegalArgumentException ignored) {} - sendId = -1; - } - if(updateId != -1) { - try { - pl.getProxy().getScheduler().cancel(updateId); - } catch(IllegalArgumentException ignored) {} - updateId = -1; - } - if(messagerId != -1) { - try { - pl.getProxy().getScheduler().cancel(messagerId); - } catch(IllegalArgumentException ignored) {} - messagerId = -1; - } - if(actionbarId != -1) { - try { - pl.getProxy().getScheduler().cancel(actionbarId); - } catch(IllegalArgumentException ignored) {} - actionbarId = -1; - } - if(srvRefId != -1) { - try { - pl.getProxy().getScheduler().cancel(srvRefId); - } catch(IllegalArgumentException ignored) {} - srvRefId = -1; - } - if(queueEventId != -1) { - try { - pl.getProxy().getScheduler().cancel(queueEventId); - } catch(IllegalArgumentException ignored) {} - queueEventId = -1; - } - - queueEventId = pl.getProxy().getScheduler().schedule(pl, this::sendQueueEvents, 2, 2, TimeUnit.SECONDS).getId(); - - sendId = pl.getProxy().getScheduler().schedule(pl, this::sendPlayers, 2, Math.round(pl.timeBetweenPlayers*1000), TimeUnit.MILLISECONDS).getId(); - - updateId = pl.getProxy().getScheduler().schedule(pl, this::updateServers, 0, Math.max(Math.round(pl.timeBetweenPlayers), 2), TimeUnit.SECONDS).getId(); - //pl.getLogger().info("Time: "+pl.timeBetweenPlayers); - - messagerId = pl.getProxy().getScheduler().schedule(pl, this::sendMessages, 0, pl.getConfig().getInt("message-time"), TimeUnit.SECONDS).getId(); - actionbarId = pl.getProxy().getScheduler().schedule(pl, this::sendActionBars, 0, 2, TimeUnit.SECONDS).getId(); - - if(pl.config.getInt("reload-servers-interval") > 0) { - srvRefId = pl.getProxy().getScheduler().schedule(pl, this::updateServers, pl.config.getInt("reload-servers-interval"), pl.config.getInt("reload-servers-interval"), TimeUnit.SECONDS).getId(); - } - } - - /** - * Get the name of the server the player is queued for. - * If multiple servers are queued for, it will use the multi-server-queue-pick option in the config - * @param p The player - * @return The name of the server, the placeholder none message if not queued - */ - public String getQueuedName(ProxiedPlayer p) { - List queued = findPlayerInQueue(p); - if(queued.size() <= 0) { - return msgs.getString("placeholders.queued.none"); - } - QueueServer selected = queued.get(0); - - if(pl.config.getString("multi-server-queue-pick").equalsIgnoreCase("last")) { - selected = queued.get(queued.size()-1); - } - - return selected.getName(); - } - - /** - * Get a single server the player is queued for. Depends on the multi-server-queue-pick option in the config - * @param p The player - * @return The server that was chosen that the player is queued for. - */ - public QueueServer getSingleServer(ProxiedPlayer p) { - List queued = findPlayerInQueue(p); - if(queued.size() <= 0) { - return null; - } - QueueServer selected = queued.get(0); - - if(pl.config.getString("multi-server-queue-pick").equalsIgnoreCase("last")) { - selected = queued.get(queued.size()-1); - } - return selected; - } - - - - - List servers = new ArrayList<>(); - /** - * Checks servers that are in bungeecord and adds any it doesnt - * know about. - * - * Also creates/edits server groups - */ - public synchronized void reloadServers() { - if(pl.config == null) { - pl.getLogger().warning("[MAN] Config is null"); - } - Map svs = ProxyServer.getInstance().getServers(); - for(String name : svs.keySet()) { - if(findServer(name) != null) continue; - ServerInfo info = svs.get(name); - //pl.getLogger().info("Adding server "+name); - servers.add(new QueueServer(name, info)); - } - - List groupsraw = pl.config.getStringList("server-groups"); - for(String groupraw : groupsraw) { - if(groupraw.isEmpty()) { - pl.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); - continue; - } - - String groupname = groupraw.split(":")[0]; - String[] serversraw = groupraw.split(":")[1].split(","); - - if(getServer(groupname) != null) { - pl.getLogger().warning("The name of a group ('"+groupname+"') cannot be the same as the name of a server!"); - continue; - } - - List servers = new ArrayList<>(); - - for(String serverraw : serversraw) { - ServerInfo si = svs.get(serverraw); - if(si == null) { - pl.getLogger().warning("Could not find server named '"+serverraw+"' in servergroup '"+groupname+"'!"); - continue; - } - servers.add(si); - } - - if(servers.size() == 0) { - pl.getLogger().warning("Server group '"+groupname+"' has no servers! Ignoring it."); - continue; - } - - this.servers.add(new QueueServer(groupname, servers)); - } - } - - /** - * Sends actionbar updates to all players in all queues with their - * position in the queue and time remaining - */ - public synchronized void sendActionBars() { - if(!pl.getConfig().getBoolean("send-actionbar")) return; - - for(ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) { - QueueServer s = this.getSingleServer(p); - - if(s == null) continue; - List plys = s.getQueue(); - int pos = plys.indexOf(p)+1; - if(pos == 0) { - plys.remove(p); - continue; - } - - int len = plys.size(); - if(!s.isJoinable(p)) { - - String status = s.getStatusString(p); - - - p.sendMessage(ChatMessageType.ACTION_BAR, msgs.getBC("spigot.actionbar.offline", - "POS:"+pos, - "LEN:"+len, - "SERVER:"+pl.aliases.getAlias(s.getName()), - "STATUS:"+status)); - } else { - int time = (int) Math.round(pos*pl.timeBetweenPlayers); - int min = (int) Math.floor((time) / (60.0)); - int sec = (int) Math.floor((time % (60.0))); - String timeStr; - if(min <= 0) { - timeStr = msgs.getString("format.time.secs") - .replaceAll("\\{m}", "0") - .replaceAll("\\{s}", sec+""); - } else { - timeStr = msgs.getString("format.time.mins") - .replaceAll("\\{m}", min+"") - .replaceAll("\\{s}", sec+""); - } - p.sendMessage(ChatMessageType.ACTION_BAR, msgs.getBC("spigot.actionbar.online", - "POS:"+pos, - "LEN:"+len, - "SERVER:"+pl.aliases.getAlias(s.getName()), - "TIME:"+timeStr)); - } - } - - } - - - public synchronized void sendQueueEvents() { - for (QueueServer s : servers) { - for (ProxiedPlayer player : s.getQueue()) { - if (player == null) continue; - if (!player.isConnected()) continue; - BungeeUtils.sendCustomData(player, "inqueueevent", "true"); - } - } - } - - /** - * Sends the message to the player updating them on their position in the queue - * along with their time remaining - */ - public synchronized void sendMessages() { - for(QueueServer s : servers) { - List plys = s.getQueue(); - Iterator it = plys.iterator(); - while(it.hasNext()) { - ProxiedPlayer ply = it.next(); - int pos = plys.indexOf(ply)+1; - if(pos == 0) { - it.remove(); - continue; - } - sendMessage(ply, s); - } - } - } - /** - * Sends a status message to a player - * @param ply The player to send the message to - * @param s The QueueServer the message should be about - */ - public synchronized void sendMessage(ProxiedPlayer ply, QueueServer s) { - List plys = s.getQueue(); - int pos = plys.indexOf(ply)+1; - if(pos == 0) return; - int len = plys.size(); - if(!s.isJoinable(ply)) { - - String status = s.getStatusString(ply); - - if(status.isEmpty()) return; - - ply.sendMessage(msgs.getBC("status.offline.base", - "STATUS:"+status, - "POS:"+pos, - "LEN:"+len, - "SERVER:"+pl.aliases.getAlias(s.getName()) - )); - } else { - if(msgs.getString("spigot.actionbar.offline").isEmpty()) return; - int time = (int) Math.round(pos*pl.timeBetweenPlayers); - int min = (int) Math.floor((time) / (60.0)); - int sec = (int) Math.floor((time % (60.0))); - String timeStr; - if(min <= 0) { - timeStr = msgs.getString("format.time.secs") - .replaceAll("\\{m}", "0") - .replaceAll("\\{s}", sec+""); - } else { - timeStr = msgs.getString("format.time.mins") - .replaceAll("\\{m}", min+"") - .replaceAll("\\{s}", sec+""); - } - ply.sendMessage(msgs.getBC("status.online.base", - "TIME:"+timeStr, - "POS:"+pos, - "LEN:"+len, - "SERVER:"+pl.aliases.getAlias(s.getName()) - )); - } - } - - /** - * Find a server by name - * @param name Name of the server - * @return The server if it exists (otherwise null) - */ - public QueueServer findServer(String name) { - for(QueueServer server : servers) { - if(server == null) continue; - if(server.getName().equalsIgnoreCase(name)) { - return server; - } - } - return null; - } - - /** - * Updates info about servers. - */ - public synchronized void updateServers() { - for (QueueServer server : servers) { - server.update(); - } - } - - /** - * Gets the ideal server in a server group. - * @param s The group to check - * @param p The player to check - * @return the ideal server - */ - public ServerInfo getIdealServer(QueueServer s, ProxiedPlayer p) { - HashMap serverInfos = s.getLastPings(); - ServerInfo selected = null; - int selectednum = 0; - if(serverInfos.keySet().size() == 1) { - selected = serverInfos.keySet().iterator().next(); - } else { - for(ServerInfo si : serverInfos.keySet()) { - ServerPing sp = serverInfos.get(si); - if(sp == null) continue; - if(sp.getPlayers() == null) continue; - int online = sp.getPlayers().getOnline(); - if(selected == null) { - selected = si; - selectednum = online; - continue; - } - if(selectednum > online && findServer(si.getName()).isJoinable(p)) { - selected = si; - selectednum = online; - } - } - } - if(selected == null && serverInfos.size() > 0) { - selected = serverInfos.keySet().iterator().next(); - } - if(selected == null) { - pl.getLogger().warning("Unable to find ideal server, using random server from group."); - int r = GenUtils.randomInt(0, s.getInfos().size()-1); - selected = s.getInfos().get(r); - } - return selected; - } - - /** - * Attempts to send the first player in all queues - */ - public void sendPlayers() { - sendPlayers(null); - } - - HashMap sendingNowAntiSpam = new HashMap<>(); - HashMap sendingAttempts = new HashMap<>(); - - /** - * Attempts to send the first player in this queue - * @param server The server to send the first player in the queue. null for all servers. - */ - public void sendPlayers(String server) { - for(QueueServer s : servers) { - String name = s.getName(); - if(server != null && !server.equals(name)) continue; - if(!s.isOnline()) continue; - if(s.getQueue().size() <= 0) continue; - - if(pl.config.getBoolean("send-all-when-back-online") && s.justWentOnline() && s.isOnline()) { - - - for(ProxiedPlayer p : s.getQueue()) { - - if(s.isFull() && !p.hasPermission("ajqueue.joinfull")) continue; - - ServerInfo selected = getIdealServer(s, p); - if(selected == null) { - pl.getLogger().severe("Could not find ideal server for server/group '"+s.getName()+"'!"); - continue; - } - - p.sendMessage(msgs.getBC("status.sending-now", "SERVER:"+pl.aliases.getAlias(name))); - p.connect(selected); - } - return; - } - - ProxiedPlayer nextplayer = s.getQueue().get(0); - if(nextplayer == null) { - if(s.getQueue().size() > 0) { - s.getQueue().remove(0); - } - continue; - } - - if(!s.canAccess(nextplayer)) continue; - - - if(s.getQueue().size() <= 0) continue; - while(!nextplayer.isConnected()) { - s.getQueue().remove(nextplayer); - if(s.getQueue().size() <= 0) break; - nextplayer = s.getQueue().get(0); - } - while(nextplayer.getServer().getInfo().getName().equals(s.getName())) { - s.getQueue().remove(nextplayer); - if(s.getQueue().size() <= 0) break; - nextplayer = s.getQueue().get(0); - } - if(s.getQueue().size() <= 0) continue; - if(s.isFull() && !nextplayer.hasPermission("ajqueue.joinfull")) continue; - - if(pl.config.getBoolean("enable-bypasspaused-permission")) { - if(s.isPaused() && !nextplayer.hasPermission("ajqueue.bypasspaused")) continue; - } else if(s.isPaused()) { continue; } - - - int tries = sendingAttempts.get(nextplayer) == null ? 0 : sendingAttempts.get(nextplayer); - int maxTries = pl.config.getInt("max-tries"); - if(tries >= maxTries && maxTries > 0) { - s.getQueue().remove(nextplayer); - sendingAttempts.remove(nextplayer); - nextplayer.sendMessage(msgs.getBC("max-tries-reached", "SERVER:"+pl.aliases.getAlias(s.getName()))); - continue; - } - tries++; - sendingAttempts.put(nextplayer, tries); - - if(!sendingNowAntiSpam.containsKey(nextplayer)) { - sendingNowAntiSpam.put(nextplayer, (long) 0); - } - if(System.currentTimeMillis() - sendingNowAntiSpam.get(nextplayer) >= 5000) { - nextplayer.sendMessage(msgs.getBC("status.sending-now", "SERVER:"+pl.aliases.getAlias(s.getName()))); - sendingNowAntiSpam.put(nextplayer, System.currentTimeMillis()); - } - - - - ServerInfo selected = getIdealServer(s, nextplayer); - if(selected == null) { - pl.getLogger().severe("Could not find ideal server for server/group '"+s.getName()+"'!"); - continue; - } - nextplayer.connect(selected); - } - } - - /** - * Add a player to the queue for a server - * @param p The player - * @param s The name of the server - */ - public synchronized void addToQueue(ProxiedPlayer p, String s) { - if(p == null || s == null) return; - QueueServer server = findServer(s); - if(server == null) { - p.sendMessage(msgs.getBC("errors.server-not-exist")); - return; - } - if(!p.isConnected()) return; - - if(pl.config.getBoolean("joinfrom-server-permission") && !p.hasPermission("ajqueue.joinfrom."+p.getServer().getInfo().getName())) { - p.sendMessage(msgs.getBC("errors.deny-joining-from-server")); - return; - } - - if(server.isPaused() && pl.config.getBoolean("prevent-joining-paused")) { - p.sendMessage(msgs.getBC("errors.cant-join-paused", "SERVER:"+pl.aliases.getAlias(server.getName()))); - return; - } - - if(p.getServer().getInfo().getName().equals(s)) { - p.sendMessage(msgs.getBC("errors.already-connected", "SERVER:"+pl.aliases.getAlias(server.getName()))); - return; - } - - List beforeQueues = findPlayerInQueue(p); - if(beforeQueues.size() > 0) { - if(beforeQueues.contains(server)) { - p.sendMessage(msgs.getBC("errors.already-queued")); - return; - } - if(!pl.config.getBoolean("allow-multiple-queues")) { - p.sendMessage(msgs.getBC("status.left-last-queue", "SERVER:"+pl.aliases.getAlias(server.getName()))); - for(QueueServer ser : beforeQueues) { - ser.getQueue().remove(p); - } - } - } - - List list = server.getQueue(); - if(list.contains(p)) { - int pos = list.indexOf(p)+1; - int len = list.size(); - p.sendMessage(msgs.getBC("errors.already-queued", - "POS:"+pos, - "LEN:"+len - )); - return; - } - if(pl.isp) { - Logic.priorityLogic(server.getQueue(), s, p); - } else { - if((p.hasPermission("ajqueue.priority") || p.hasPermission("ajqueue.serverpriority."+s)) && list.size() > 0) { - //p.sendMessage(Main.formatMessage("in priority")); - int i = 0; - for(ProxiedPlayer ply : list) { - if(!(ply.hasPermission("ajqueue.priority") || ply.hasPermission("ajqueue.serverpriority."+s))) { - //p.sendMessage(Main.formatMessage("Adding beind: "+i)); - list.add(i, p); - break; - } - i++; - } - //p.sendMessage(Main.formatMessage("after loop")); - if(list.size() == 0) { - list.add(p); - } else if(!list.contains(p)) { - list.add(p); - } - } else { - //p.sendMessage(Main.formatMessage("normal add")); - list.add(p); - } - } - int pos = list.indexOf(p)+1; - int len = list.size(); - - - boolean sendInstant = pl.config.getStringList("send-instantly").contains(server.getName()) || server.isJoinable(p); - boolean sendInstantp = list.size() <= 1 && server.canAccess(p); - boolean timeGood = !pl.config.getBoolean("check-last-player-sent-time") || System.currentTimeMillis() - server.getLastSentTime() > Math.floor(pl.getConfig().getDouble("wait-time") * 1000); - - if((sendInstant && (sendInstantp && timeGood))) { - sendPlayers(s); - //p.sendMessage(Main.formatMessage("sending instant")); - BaseComponent[] m = msgs.getBC("status.now-in-empty-queue", "POS:"+pos, "LEN:"+len, "SERVER:"+pl.aliases.getAlias(s)); - if(TextComponent.toPlainText(m).length() > 0) { - p.sendMessage(m); - } - } else { - p.sendMessage(msgs.getBC("status.now-in-queue", - "POS:"+pos, - "LEN:"+len, - "SERVER:"+pl.aliases.getAlias(server.getName()), - "SERVERNAME:"+server.getName() - )); - } - //p.sendMessage(Main.formatMessage(sendInstant+" && ("+sendInstantp+" && " + timeGood+")")); - - BungeeUtils.sendCustomData(p, "position", pos+""); - BungeeUtils.sendCustomData(p, "positionof", len+""); - BungeeUtils.sendCustomData(p, "queuename", pl.aliases.getAlias(s)); - BungeeUtils.sendCustomData(p, "inqueue", "true"); - BungeeUtils.sendCustomData(p, "inqueueevent", "true"); - } - - /** - * Finds which servers the player is queued for - * @param p The player to search for - * @return The servers the player is queued for. - */ - public List findPlayerInQueue(ProxiedPlayer p) { - List srs = new ArrayList<>(); - for(QueueServer s : servers) { - if(s.getQueue().contains(p)) { - srs.add(s); - } - } - return srs; - } - - public QueueServer getServer(String name) { - return findServer(name); - } -} diff --git a/src/main/java/us/ajg0702/queue/QueueServer.java b/src/main/java/us/ajg0702/queue/QueueServer.java deleted file mode 100644 index 6e51bc0..0000000 --- a/src/main/java/us/ajg0702/queue/QueueServer.java +++ /dev/null @@ -1,248 +0,0 @@ -package us.ajg0702.queue; - -import java.util.*; - -import net.md_5.bungee.api.Callback; -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.ServerPing; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import us.ajg0702.utils.bungee.BungeeConfig; -import us.ajg0702.utils.bungee.BungeeMessages; - -public class QueueServer { - - String name; - List servers; - - public QueueServer(String name, ServerInfo info) { - init(name, Collections.singletonList(info)); - } - public QueueServer(String name, List infos) { - init(name, infos); - } - private void init(String name, List infos) { - if(Manager.getInstance() == null || Main.plugin.getConfig() == null) { - ProxyServer.getInstance().getLogger() - .warning("[ajQueue] Something is loading a QueueServer too early! The plugin hasnt fully loaded yet!"); - } - this.name = name; - this.servers = infos; - update(); - } - - public void setInfos(List infos) { - servers = infos; - } - - public String getName() { - return name; - } - public List getInfos() { - return servers; - } - - int offlineTime = 0; - boolean online = false; - int playercount = 0; - int maxplayers = 0; - long lastUpdate = -1; - HashMap pings = new HashMap<>(); - public void update() { - pings = new HashMap<>(); - for(final ServerInfo info : getInfos()) { - if(Main.plugin.getConfig().getBoolean("pinger-debug")) { - Main.plugin.getLogger().info("[pinger] ["+info.getName()+"] sending ping"); - } - info.ping((result, error) -> { - if(Manager.getInstance() == null || Main.plugin.getConfig() == null) { - ProxyServer.getInstance().getLogger() - .warning("[ajQueue] Something used update() too early! The plugin hasnt fully loaded yet!"); - return; - } - boolean online = error == null; - BungeeConfig config = Main.plugin.getConfig(); - - if(config.getBoolean("pinger-debug")) { - if(error != null) { - ProxyServer.getInstance().getLogger().info("[ajQueue] [pinger] ["+name+"] Status: offline. Error: "); - error.printStackTrace(); - } else { - ProxyServer.getInstance().getLogger().info("[ajQueue] [pinger] ["+name+"] Status: online. motd: " - +result.getDescriptionComponent()+" players:"+result.getPlayers()); - } - } - - - pings.put(info, online ? result : null); - if(pings.size() == servers.size()) allDonePing(); - }); - } - } - - public String getStatusString(ProxiedPlayer p) { - BungeeMessages msgs = Main.plugin.msgs; - - if(getOfflineTime() > Main.plugin.getConfig().getInt("offline-time")) { - return msgs.getString("status.offline.offline"); - } - - if(!isOnline()) { - return msgs.getString("status.offline.restarting"); - } - - if(isPaused()) { - return msgs.getString("status.offline.paused"); - } - - if(isFull()) { - return msgs.getString("status.offline.full"); - } - - if(p != null && !canAccess(p)) { - return msgs.getString("status.offline.restricted"); - } - - - return "Online"; - } - - public HashMap getLastPings() { - return pings; - } - - private void allDonePing() { - int onlineCount = 0; - playercount = 0; - maxplayers = 0; - for(ServerInfo info : pings.keySet()) { - ServerPing ping = pings.get(info); - if(ping == null) { - continue; - } - onlineCount++; - playercount += ping.getPlayers().getOnline(); - maxplayers += ping.getPlayers().getMax(); - } - online = onlineCount > 0; - - if(lastUpdate == -1) { - lastUpdate = System.currentTimeMillis(); - offlineTime = 0; - } else { - int timesincelast = (int) Math.round((System.currentTimeMillis() - lastUpdate*1.0)/1000); - lastUpdate = System.currentTimeMillis(); - if(!online) { - offlineTime += timesincelast; - } else { - offlineTime = 0; - } - } - } - - public int getOfflineTime() { - return offlineTime; - } - long lastOffline = 0; - public boolean isOnline() { - BungeeConfig config = Main.plugin.getConfig(); - if(System.currentTimeMillis()-lastOffline <= (config.getInt("wait-after-online")*1000) && online) { - return false; - } - if(!online) { - lastOffline = System.currentTimeMillis(); - } - return online; - } - - public boolean justWentOnline() { - BungeeConfig config = Main.plugin.getConfig(); - return System.currentTimeMillis()-lastOffline <= (config.getDouble("wait-time")) && online; - } - - public boolean isFull() { - return playercount >= maxplayers; - } - - - List queue = new ArrayList<>(); - public synchronized List getQueue() { - return queue; - } - - /** - * If the player can access the server. (Bungeecord's restricted servers) - * @param ply The player - * @return if the player can join based on bungeecord's restricted servers system - */ - public boolean canAccess(ProxiedPlayer ply) { - if(ply == null) return true; - boolean ca = false; - for(ServerInfo si : servers) { - if(si.canAccess(ply)) { - ca = true; - break; - } - } - return ca; - } - - - long lastSent = 0; - public long getLastSentTime() { - return lastSent; - } - public void setLastSentTime(long newLastSent) { - lastSent = newLastSent; - } - - - boolean whitelisted = false; - List whitelistedplayers = new ArrayList<>(); - public void setWhitelisted(boolean b) { - whitelisted = b; - } - public void setWhitelistedPlayers(List plys) { - whitelistedplayers = plys; - } - public boolean getWhitelisted() { - return whitelisted; - } - public boolean isWhitelisted() { - return whitelisted; - } - public List getWhitelistedPlayers() { - return whitelistedplayers; - } - - /** - * If the server is joinable as a player - * @param p The player - * @return If the player can join the server - */ - public boolean isJoinable(ProxiedPlayer p) { - return (!whitelisted || whitelistedplayers.contains(p.getName())) && - this.isOnline() && - this.canAccess(p) && - !this.isFull() && - !this.isPaused(); - - } - public String getJoinableDebug(ProxiedPlayer p) { - return "whitelist: "+(!whitelisted || whitelistedplayers.contains(p.getName())) + "\n" + - "online: "+this.isOnline() +"\n"+ - "canaccess: "+this.canAccess(p) +"\n"+ - "full: "+ !this.isFull() +"\n"+ - "paused: "+!this.isPaused()+"\n"+ - "- joinable: "+isJoinable(p); - } - - - boolean paused = false; - public boolean isPaused() { - return paused; - } - public void setPaused(boolean to) { - paused = to; - } -} diff --git a/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java b/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java deleted file mode 100644 index 87e9521..0000000 --- a/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java +++ /dev/null @@ -1,75 +0,0 @@ -package us.ajg0702.queue.commands; - -import java.util.List; - -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; -import us.ajg0702.queue.Main; -import us.ajg0702.queue.Manager; -import us.ajg0702.queue.QueueServer; -import us.ajg0702.utils.bungee.BungeeMessages; - -public class LeaveCommand extends Command { - Main plugin; - BungeeMessages msgs; - public LeaveCommand(Main pl) { - super("leavequeue", null, "leaveq"); - this.plugin = pl; - msgs = BungeeMessages.getInstance(); - - } - @Override - public void execute(CommandSender sender, String[] args) { - if(!(sender instanceof ProxiedPlayer)) { - sender.sendMessage(msgs.getBC("errors.player-only")); - return; - } - Manager man = Manager.getInstance(); - ProxiedPlayer p = (ProxiedPlayer) sender; - List servers = man.findPlayerInQueue(p); - - if(servers.size() == 0) { - p.sendMessage(msgs.getBC("commands.leave.no-queues")); - return; - } - - if(servers.size() == 1) { - servers.get(0).getQueue().remove(p); - p.sendMessage(msgs.getBC("commands.leave-queue", "SERVER:"+plugin.aliases.getAlias(servers.get(0).getName()))); - return; - } - - - if(args.length <= 0) { - p.sendMessage(msgs.getBC("commands.leave.more-args", "QUEUES:"+getQueueList(servers))); - return; - } - - String leaving = args[0]; - QueueServer leavingsrv = man.getServer(leaving); - if(leavingsrv == null) { - p.sendMessage(msgs.getBC("commands.leave.not-queued", "QUEUES:"+getQueueList(servers))); - return; - } - if(leavingsrv.getQueue().indexOf(p) == -1) { - p.sendMessage(msgs.getBC("commands.leave.not-queued", "QUEUES:"+getQueueList(servers))); - return; - } - - leavingsrv.getQueue().remove(p); - p.sendMessage(msgs.getBC("commands.leave-queue", "SERVER:"+plugin.aliases.getAlias(leavingsrv.getName()))); - - } - - private String getQueueList(List servers) { - StringBuilder queueList = new StringBuilder(); - for(QueueServer server : servers) { - queueList.append(msgs.getString("commands.leave.queues-list-format").replaceAll("\\{NAME\\}", server.getName())); - } - if(queueList.length() > 2) { - queueList = new StringBuilder(queueList.substring(0, queueList.length() - 2)); - } - return queueList.toString(); - } -} diff --git a/src/main/java/us/ajg0702/queue/commands/ListCommand.java b/src/main/java/us/ajg0702/queue/commands/ListCommand.java deleted file mode 100644 index 1d53230..0000000 --- a/src/main/java/us/ajg0702/queue/commands/ListCommand.java +++ /dev/null @@ -1,59 +0,0 @@ -package us.ajg0702.queue.commands; - -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; -import us.ajg0702.queue.Main; -import us.ajg0702.queue.Manager; -import us.ajg0702.queue.QueueServer; -import us.ajg0702.utils.bungee.BungeeMessages; - -import java.util.ArrayList; -import java.util.Arrays; - -public class ListCommand extends Command { - Main pl; - BungeeMessages msgs; - - public ListCommand(Main pl) { - super("listqueues", null, "listq"); - this.pl = pl; - msgs = BungeeMessages.getInstance(); - } - - @Override - public void execute(CommandSender sender, String[] args) { - if(!sender.hasPermission("ajqueue.listqueues")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - - ProxiedPlayer spp = null; - if(sender instanceof ProxiedPlayer) { - spp = (ProxiedPlayer) sender; - } - - ArrayList m = new ArrayList<>(Arrays.asList(msgs.getBC("commands.listqueues.header"))); - for(QueueServer s : Manager.getInstance().getServers()) { - String color = "&a"; - if(!s.isOnline()) { - color = "&c"; - } else if(!s.isJoinable(spp)) { - color = "&e"; - } - - m.addAll(Arrays.asList(TextComponent.fromLegacyText("\n"))); - m.addAll(Arrays.asList(msgs.getBC("commands.listqueues.format", - "COLOR:" + msgs.color(color), - "NAME:" + s.getName(), - "COUNT:" + s.getQueue().size(), - "STATUS:" + s.getStatusString(spp) - ))); - } - - sender.sendMessage(m.toArray(new BaseComponent[m.size()-1])); - - } -} diff --git a/src/main/java/us/ajg0702/queue/commands/ManageCommand.java b/src/main/java/us/ajg0702/queue/commands/ManageCommand.java deleted file mode 100644 index 5262a4b..0000000 --- a/src/main/java/us/ajg0702/queue/commands/ManageCommand.java +++ /dev/null @@ -1,267 +0,0 @@ -package us.ajg0702.queue.commands; - -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.PatternReplacementResult; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.config.ServerInfo; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; -import net.md_5.bungee.api.plugin.TabExecutor; -import us.ajg0702.queue.Main; -import us.ajg0702.queue.Manager; -import us.ajg0702.queue.QueueServer; -import us.ajg0702.utils.bungee.BungeeMessages; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -public class ManageCommand extends Command implements TabExecutor { - - Main pl; - BungeeMessages msgs; - - public ManageCommand(Main pl) { - super("ajqueue", null, "ajq"); - this.pl = pl; - msgs = BungeeMessages.getInstance(); - } - - - - @Override - public void execute(CommandSender sender, String[] args) { - if(args.length == 1) { - if(args[0].equalsIgnoreCase("reload")) { - if(!sender.hasPermission("ajqueue.reload")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - msgs.reload(); - pl.getConfig().reload(); - pl.timeBetweenPlayers = pl.getConfig().getDouble("wait-time"); - Manager.getInstance().reloadIntervals(); - Manager.getInstance().reloadServers(); - pl.checkConfig(); - sender.sendMessage(msgs.getBC("commands.reload")); - return; - - } - if(args[0].equalsIgnoreCase("list")) { - if(!sender.hasPermission("ajqueue.list")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - int total = 0; - for(QueueServer server : Manager.getInstance().getServers()) { - - Component msg = msgs.getComponent("list.format", - "SERVER:"+server.getName() - ); - Component playerList = Component.empty(); - List players = server.getQueue(); - boolean none = true; - for(ProxiedPlayer p : players) { - playerList = playerList.append(msgs.getComponent("list.playerlist", - "NAME:" + p.getDisplayName() - )); - none = false; - } - if(none) { - playerList = playerList.append(msgs.getComponent("list.none")); - playerList = playerList.append(Component.text(", ")); - } - Component finalPlayerList = playerList; - msg = msg.replaceText(b -> b.match(Pattern.compile("\\{LIST}")).replacement(finalPlayerList)); - char[] commaCountString = PlainTextComponentSerializer.plainText().serialize(msg).toCharArray(); - int commas = 0; - for(Character fChar : commaCountString) { - if(fChar == ',') commas++; - } - - int finalCommas = commas; - msg = msg.replaceText(b -> b.match(",(?!.*,)").replacement("").condition((r, c, re) -> { - if(c == finalCommas) { - return PatternReplacementResult.REPLACE; - } - return PatternReplacementResult.CONTINUE; - })); - total += players.size(); - msg = msg.replaceText(b -> b.match(Pattern.compile("\\{COUNT}")).replacement(players.size()+"")); - sender.sendMessage(msgs.getBC(msg)); - } - sender.sendMessage(msgs.getBC("list.total", "TOTAL:"+total)); - return; - } - if(args[0].equalsIgnoreCase("p")) { - sender.sendMessage(Main.formatMessage(pl.isp()+"")); - return; - } - if(args[0].equalsIgnoreCase("statusdebug")) { - QueueServer s = Manager.getInstance().getSingleServer((ProxiedPlayer) sender); - if(s == null) return; - sender.sendMessage(Main.formatMessage(s.getJoinableDebug((ProxiedPlayer) sender))); - } - if(args[0].equalsIgnoreCase("send")) { - if(!sender.hasPermission("ajqueue.send")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - sender.sendMessage(Main.formatMessage("/ajQueue send ")); - return; - } - if(args[0].equalsIgnoreCase("version")) { - sender.sendMessage(Main.formatMessage(pl.getDescription().getVersion())); - return; - } - if(args[0].equalsIgnoreCase("pause")) { - if(!sender.hasPermission("ajqueue.pause")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - sender.sendMessage(msgs.getBC("commands.pause.more-args")); - return; - } - } - if(args.length == 2) { - if(args[0].equalsIgnoreCase("pause")) { - if(!sender.hasPermission("ajqueue.pause")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - if(!Manager.getInstance().getServerNames().contains(args[1])) { - sender.sendMessage(msgs.getBC("errors.server-not-exist", "SERVER:"+args[1])); - return; - } - QueueServer srv = Manager.getInstance().findServer(args[1]); - if(srv == null) { - sender.sendMessage(msgs.getBC("commands.pause.no-server", "SERVER:"+args[1])); - return; - } - srv.setPaused(!srv.isPaused()); - sender.sendMessage(msgs.getBC("commands.pause.success", - "SERVER:"+srv.getName(), - "PAUSED:"+msgs.getString("commands.pause.paused."+srv.isPaused()) - )); - return; - } - if(args[0].equalsIgnoreCase("send")) { - if(!sender.hasPermission("ajqueue.send")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - sender.sendMessage(Main.formatMessage("/ajQueue send ")); - return; - } - } - if(args.length == 3) { - if(args[0].equalsIgnoreCase("pause")) { - if(!sender.hasPermission("ajqueue.pause")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - if(!Manager.getInstance().getServerNames().contains(args[1])) { - sender.sendMessage(msgs.getBC("commands.pause.no-server", "SERVER:"+args[1])); - return; - } - QueueServer srv = Manager.getInstance().findServer(args[1]); - if(srv == null) { - sender.sendMessage(msgs.getBC("commands.pause.no-server", "SERVER:"+args[1])); - return; - } - srv.setPaused(args[2].equalsIgnoreCase("on") || args[2].equalsIgnoreCase("true")); - sender.sendMessage(msgs.getBC("commands.pause.success", - "SERVER:"+srv.getName(), - "PAUSED:"+msgs.getString("commands.pause.paused."+srv.isPaused()) - )); - return; - } - if(args[0].equalsIgnoreCase("send")) { - if(!sender.hasPermission("ajqueue.send")) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - - if(Manager.getInstance().getServer(args[2]) == null) { - sender.sendMessage(msgs.getBC("errors.server-not-exist", "SERVER:"+args[2])); - return; - } - - List playerNames = getNameList(true); - if(playerNames.contains(args[1].toLowerCase())) { - - ProxiedPlayer ply = pl.getProxy().getPlayer(args[1]); - Manager.getInstance().addToQueue(ply, args[2]); - sender.sendMessage(msgs.getBC("send", - "PLAYER:"+ply.getDisplayName(), - "SERVER:"+args[2]) - ); - return; - } else if(pl.getProxy().getServers().containsKey(args[1])) { - - ServerInfo from = pl.getProxy().getServerInfo(args[1]); - if(from == null) { - sender.sendMessage(msgs.getBC("errors.server-not-exist", "SERVER:"+args[1])); - return; - } - List players = new ArrayList<>(from.getPlayers()); - for(ProxiedPlayer ply : players) { - Manager.getInstance().addToQueue(ply, args[2]); - } - - sender.sendMessage(msgs.getBC("send", "PLAYER:"+args[1], "SERVER:"+args[2])); - return; - - } else { - sender.sendMessage(msgs.getBC("commands.send.player-not-found")); - return; - } - } - } - - sender.sendMessage(Main.formatMessage("/ajqueue ")); - } - - private List getNameList(boolean lowercase) { - List playerNames = new ArrayList<>(); - for(ProxiedPlayer ply : pl.getProxy().getPlayers()) { - if(ply == null || !ply.isConnected()) continue; - if(lowercase) { - playerNames.add(ply.getName().toLowerCase()); - } else { - playerNames.add(ply.getName()); - } - } - return playerNames; - } - - @Override - public Iterable onTabComplete(CommandSender sender, String[] args) { - if(args.length == 1) { - return Arrays.asList("reload", "list", "send", "pause"); - } - if(args.length == 2) { - if(args[0].equalsIgnoreCase("send")) { - List options = new ArrayList<>(pl.getProxy().getServers().keySet()); - options.addAll(getNameList(false)); - return options; - } - if(args[0].equalsIgnoreCase("pause")) { - return Manager.getInstance().getServerNames(); - } - } - if(args.length == 3) { - if(args[0].equalsIgnoreCase("send")) { - return Manager.getInstance().getServerNames(); - } - if(args[0].equalsIgnoreCase("pause")) { - return Arrays.asList("on", "off", "true", "false"); - } - } - return new ArrayList<>(); - } -} diff --git a/src/main/java/us/ajg0702/queue/commands/MoveCommand.java b/src/main/java/us/ajg0702/queue/commands/MoveCommand.java deleted file mode 100644 index c8a3873..0000000 --- a/src/main/java/us/ajg0702/queue/commands/MoveCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -package us.ajg0702.queue.commands; - -import java.util.ArrayList; - -import net.md_5.bungee.api.CommandSender; -import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Command; -import net.md_5.bungee.api.plugin.TabExecutor; -import us.ajg0702.queue.Main; -import us.ajg0702.queue.Manager; -import us.ajg0702.utils.bungee.BungeeMessages; - -public class MoveCommand extends Command implements TabExecutor { - Main plugin; - BungeeMessages msgs; - public MoveCommand(Main pl) { - super("move", null, "queue", "server", "joinqueue", "joinq"); - this.plugin = pl; - msgs = BungeeMessages.getInstance(); - } - - @Override - public void execute(CommandSender sender, String[] args) { - if(!(sender instanceof ProxiedPlayer)) { - sender.sendMessage(msgs.getBC("errors.player-only")); - return; - } - ProxiedPlayer p = (ProxiedPlayer) sender; - - if(args.length > 0) { - if(plugin.getConfig().getBoolean("require-permission") && !p.hasPermission("ajqueue.queue."+args[0])) { - sender.sendMessage(msgs.getBC("noperm")); - return; - } - Manager.getInstance().addToQueue(p, args[0]); - } else { - sender.sendMessage(msgs.getBC("commands.joinqueue.usage")); - } - } - - @Override - public Iterable onTabComplete(CommandSender sender, String[] args) { - if(!plugin.getConfig().getBoolean("tab-complete-queues")) { - return new ArrayList<>(); - } - if(args.length == 1) { - return Manager.getInstance().getServerNames(); - } - return new ArrayList<>(); - } -} diff --git a/src/main/java/us/ajg0702/queue/spigot/Commands.java b/src/main/java/us/ajg0702/queue/spigot/Commands.java deleted file mode 100644 index 356fd41..0000000 --- a/src/main/java/us/ajg0702/queue/spigot/Commands.java +++ /dev/null @@ -1,64 +0,0 @@ -package us.ajg0702.queue.spigot; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -public class Commands implements CommandExecutor { - - Main pl; - public Commands(Main pl) { - this.pl = pl; - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - Player player = null; - if(sender instanceof Player) { - player = (Player) sender; - } - if(command.getName().equals("leavequeue")) { - if(player == null) return true; - StringBuilder arg = new StringBuilder(); - for(String a : args) { - arg.append(" "); - arg.append(a); - } - pl.sendMessage(player, "leavequeue", arg.toString()); - return true; - } - if(args.length < 1) return false; - - String srvname = args[0]; - - if(args.length > 1) { - pl.getLogger().info("Sending "+args[0]+" to queue"); - if(!sender.hasPermission("ajqueue.send")) { - sender.sendMessage(color("&cYou do not have permission to do this!")); - return true; - } - Player tply = Bukkit.getPlayer(args[0]); - if(tply == null) { - sender.sendMessage(color("&cCannot find that player!")); - return true; - } - player = tply; - srvname = args[1]; - } - if(pl.config.getBoolean("send-queue-commands-in-batches")) { - pl.queuebatch.put(player, srvname); - } else { - pl.sendMessage(player, "queue", srvname); - } - - return true; - } - - public String color(String txt) { - return ChatColor.translateAlternateColorCodes('&', txt); - } - -} diff --git a/src/main/java/us/ajg0702/queue/spigot/Config.java b/src/main/java/us/ajg0702/queue/spigot/Config.java deleted file mode 100644 index 26281f4..0000000 --- a/src/main/java/us/ajg0702/queue/spigot/Config.java +++ /dev/null @@ -1,59 +0,0 @@ -package us.ajg0702.queue.spigot; - -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.Files; - -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.java.JavaPlugin; - -public class Config { - File f; - YamlConfiguration yml; - - JavaPlugin pl; - - - public boolean getBoolean(String key) { - return yml.getBoolean(key); - } - - public Config(JavaPlugin pl) { - this.pl = pl; - f = new File(pl.getDataFolder(), "config.yml"); - if(!f.exists()) { - if(!Files.exists(pl.getDataFolder().toPath())) { - try { - Files.createDirectory(pl.getDataFolder().toPath()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - try { - PrintWriter writer = new PrintWriter(pl.getDataFolder()+File.separator+"config.yml", "UTF-8"); - String[] lines = getDefaultConfig().split("\n"); - for(String line : lines) { - writer.println(line); - - } - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - yml = YamlConfiguration.loadConfiguration(f); - } - - public String getDefaultConfig() { - return "# This is the config for the spigot side.\n" - + "# You can find more settings in the config of bungee.\n" - + "\n\n" - + "# Should we send queue requests from commands in batches?\n" - + "# Enable this if you have issues with players sometimes not executing commands correctly\n" - + "# Note though that it could delay queue commands by up to 1 second!\n" - + "send-queue-commands-in-batches: false"; - } -} diff --git a/src/main/java/us/ajg0702/queue/spigot/Main.java b/src/main/java/us/ajg0702/queue/spigot/Main.java deleted file mode 100644 index cc2cb14..0000000 --- a/src/main/java/us/ajg0702/queue/spigot/Main.java +++ /dev/null @@ -1,183 +0,0 @@ -package us.ajg0702.queue.spigot; - -import java.util.HashMap; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.plugin.messaging.PluginMessageListener; - -import com.google.common.io.ByteArrayDataInput; -import com.google.common.io.ByteArrayDataOutput; -import com.google.common.io.ByteStreams; - -import us.ajg0702.queue.spigot.utils.VersionSupport; - -public class Main extends JavaPlugin implements PluginMessageListener,Listener { - - boolean papi = false; - Placeholders placeholders; - - Config config; - - public void onEnable() { - getServer().getMessenger().registerIncomingPluginChannel(this, "ajqueue:tospigot", this); - getServer().getMessenger().registerOutgoingPluginChannel(this, "ajqueue:tobungee"); - - this.getCommand("move").setExecutor(new Commands(this)); - this.getCommand("leavequeue").setExecutor(new Commands(this)); - - Bukkit.getPluginManager().registerEvents(this, this); - - papi = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; - - if(papi) { - placeholders = new Placeholders(this); - placeholders.register(); - getLogger().info("Registered PlaceholderAPI placeholders"); - } - - Bukkit.getScheduler().runTaskTimer(this, new Runnable() { - public void run() { - if(Bukkit.getOnlinePlayers().size() <= 0 || queuebatch.size() <= 0) return; - String msg = ""; - for(Player p : queuebatch.keySet()) { - if(p == null || !p.isOnline()) continue; - msg += p.getName()+":"+queuebatch.get(p)+","; - } - if(msg.length() > 1) { - msg = msg.substring(0, msg.length()-1); - } - queuebatch.clear(); - sendMessage("massqueue", msg); - } - }, 2*20, 20); - - config = new Config(this); - - getLogger().info("Spigot side enabled! v"+getDescription().getVersion()); - } - - HashMap queuebatch = new HashMap<>(); - - @Override - public void onPluginMessageReceived(String channel, Player player, byte[] message) { - if (!channel.equals("ajqueue:tospigot")) return; - - ByteArrayDataInput in = ByteStreams.newDataInput(message); - - String subchannel = in.readUTF(); - - if(subchannel.equals("actionbar")) { - String playername = in.readUTF(); - Player p = Bukkit.getPlayer(playername); - if(p == null) return; - - String data = in.readUTF(); - final String text = data.split(";time=")[0]; - //getLogger().info("recieved actionbar for "+player.getName()+": "+text); - VersionSupport.sendActionBar(p, text); - - /*QueueActionbarUpdateEvent e = new QueueActionbarUpdateEvent(p); - Bukkit.getPluginManager().callEvent(e);*/ - return; - } - if(subchannel.equals("inqueueevent")) { - String playername = in.readUTF(); - Player p = Bukkit.getPlayer(playername); - if(p == null) return; - QueueScoreboardActivator e = new QueueScoreboardActivator(p); - Bukkit.getPluginManager().callEvent(e); - } - if(subchannel.equals("queuename") && papi) { - String playername = in.readUTF(); - Player p = Bukkit.getPlayer(playername); - if(p == null) return; - if(!p.isOnline()) return; - - String data = in.readUTF(); - HashMap phs = placeholders.responseCache.get(p); - if(phs == null) phs = new HashMap<>(); - phs.put("queued", data); - placeholders.responseCache.put(p, phs); - } - if(subchannel.equals("position") && papi) { - String playername = in.readUTF(); - Player p = Bukkit.getPlayer(playername); - if(p == null) return; - if(!p.isOnline()) return; - - String data = in.readUTF(); - HashMap phs = placeholders.responseCache.get(p); - if(phs == null) phs = new HashMap<>(); - phs.put("position", data); - placeholders.responseCache.put(p, phs); - } - if(subchannel.equals("positionof") && papi) { - String playername = in.readUTF(); - Player p = Bukkit.getPlayer(playername); - if(p == null) return; - if(!p.isOnline()) return; - - String data = in.readUTF(); - HashMap phs = placeholders.responseCache.get(p); - if(phs == null) phs = new HashMap<>(); - phs.put("of", data); - placeholders.responseCache.put(p, phs); - } - if(subchannel.equals("inqueue") && papi) { - String playername = in.readUTF(); - Player p = Bukkit.getPlayer(playername); - if(p == null) return; - if(!p.isOnline()) return; - - String data = in.readUTF(); - HashMap phs = placeholders.responseCache.get(p); - if(phs == null) phs = new HashMap<>(); - phs.put("inqueue", data); - placeholders.responseCache.put(p, phs); - } - if(subchannel.equals("queuedfor")) { - String playername = in.readUTF(); - String queuename = in.readUTF(); - - Player p = Bukkit.getPlayer(playername); - if(p == null) return; - if(!p.isOnline()) return; - - int number = Integer.valueOf(in.readUTF()); - HashMap phs = placeholders.responseCache.get(p); - if(phs == null) phs = new HashMap<>(); - phs.put("queuedfor_"+queuename, number+""); - placeholders.responseCache.put(p, phs); - } - } - - - public void sendMessage(Player player, String subchannel, String data) { - //getLogger().info("Sending message. "+subchannel+" "+data); - ByteArrayDataOutput out = ByteStreams.newDataOutput(); - out.writeUTF(subchannel); - out.writeUTF(data); - - player.sendPluginMessage(this, "ajqueue:tobungee", out.toByteArray()); - } - - public void sendMessage(String subchannel, String data) { - ByteArrayDataOutput out = ByteStreams.newDataOutput(); - out.writeUTF(subchannel); - out.writeUTF(data); - - Bukkit.getOnlinePlayers().iterator().next() - .sendPluginMessage(this, "ajqueue:tobungee", out.toByteArray()); - } - - @EventHandler - public void onLeave(PlayerQuitEvent e) { - if(!papi) return; - placeholders.cleanCache(); - } -} diff --git a/src/main/java/us/ajg0702/queue/spigot/Placeholders.java b/src/main/java/us/ajg0702/queue/spigot/Placeholders.java deleted file mode 100644 index 0e7fedc..0000000 --- a/src/main/java/us/ajg0702/queue/spigot/Placeholders.java +++ /dev/null @@ -1,214 +0,0 @@ -package us.ajg0702.queue.spigot; - -import java.util.ConcurrentModificationException; -import java.util.HashMap; -import java.util.Iterator; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import me.clip.placeholderapi.expansion.PlaceholderExpansion; - -/** - * This class will be registered through the register-method in the - * plugins onEnable-method. - */ -public class Placeholders extends PlaceholderExpansion { - - private Main plugin; - - /** - * Since we register the expansion inside our own plugin, we - * can simply use this method here to get an instance of our - * plugin. - * - * @param plugin - * The instance of our plugin. - */ - public Placeholders(Main plugin){ - this.plugin = plugin; - } - - /** - * Because this is an internal class, - * you must override this method to let PlaceholderAPI know to not unregister your expansion class when - * PlaceholderAPI is reloaded - * - * @return true to persist through reloads - */ - @Override - public boolean persist(){ - return true; - } - - /** - * Because this is a internal class, this check is not needed - * and we can simply return {@code true} - * - * @return Always true since it's an internal class. - */ - @Override - public boolean canRegister(){ - return true; - } - - /** - * The name of the person who created this expansion should go here. - *
For convienience do we return the author from the plugin.yml - * - * @return The name of the author as a String. - */ - @Override - public String getAuthor(){ - return plugin.getDescription().getAuthors().toString(); - } - - /** - * The placeholder identifier should go here. - *
This is what tells PlaceholderAPI to call our onRequest - * method to obtain a value if a placeholder starts with our - * identifier. - *
This must be unique and can not contain % or _ - * - * @return The identifier in {@code %_%} as String. - */ - @Override - public String getIdentifier(){ - return "ajqueue"; - } - - /** - * This is the version of the expansion. - *
You don't have to use numbers, since it is set as a String. - * - * For convienience do we return the version from the plugin.yml - * - * @return The version as a String. - */ - @Override - public String getVersion(){ - return plugin.getDescription().getVersion(); - } - - HashMap> responseCache = new HashMap<>(); - - public void cleanCache() { - Iterator it = responseCache.keySet().iterator(); - while(it.hasNext()) { - Player p = it.next(); - if(p == null) { - it.remove(); - continue; - } - if(!p.isOnline()) { - it.remove(); - } - } - } - - /** - * This is the method called when a placeholder with our identifier - * is found and needs a value. - *
We specify the value identifier in this method. - *
Since version 2.9.1 can you use OfflinePlayers in your requests. - * - * @param player - * A org.bukkit.PkPlayer Player. - * @param identifier - * A String containing the identifier/value. - * - * @return possibly-null String of the requested identifier. - */ - @Override - public String onPlaceholderRequest(Player player, final String identifier){ - //Bukkit.getLogger().info("itentifier: "+identifier); - - - if(player == null) return "No player"; - - - String noc = "_nocache"; - if(identifier.length() > noc.length()) { - int olen = identifier.length()-noc.length(); - if(identifier.indexOf(noc) == olen) { - String idfr = identifier.substring(0, olen); - return this.parsePlaceholder(player, idfr); - } - } - - Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { - public void run() { - HashMap playerCache; - if(responseCache.containsKey(player)) { - playerCache = responseCache.get(player); - } else { - playerCache = new HashMap(); - } - if(playerCache.size() > 75) { - try { - playerCache.remove(playerCache.keySet().toArray()[0]); - } catch(ConcurrentModificationException e) { - Bukkit.getScheduler().runTask(plugin, new Runnable() { - public void run() { - playerCache.remove(playerCache.keySet().toArray()[0]); - } - }); - } - } - String resp = parsePlaceholder(player, identifier); - if(resp == null) return; - playerCache.put(identifier, resp); - responseCache.put(player, playerCache); - } - }); - - - if(responseCache.containsKey(player)) { - HashMap playerCache = responseCache.get(player); - if(playerCache.containsKey(identifier)) { - return playerCache.get(identifier); - } - } else { - if(identifier.equalsIgnoreCase("queued")) { - return "None"; - } - if(identifier.equalsIgnoreCase("position") || identifier.equalsIgnoreCase("of")) { - return "None"; - } - if(identifier.equalsIgnoreCase("inqueue")) { - return "false"; - } - if(identifier.matches("queuedfor_*.*")) { - return "0"; - } - } - - - return null; - } - - private String parsePlaceholder(Player player, String identifier) { - if(identifier.equalsIgnoreCase("queued")) { - plugin.sendMessage(player, "queuename", ""); - return null; - } - if(identifier.equalsIgnoreCase("position")) { - plugin.sendMessage(player, "position", ""); - return null; - } - if(identifier.equalsIgnoreCase("of")) { - plugin.sendMessage(player, "positionof", ""); - return null; - } - if(identifier.equalsIgnoreCase("inqueue")) { - plugin.sendMessage(player, "inqueue", ""); - return null; - } - if(identifier.matches("queuedfor_*.*")) { - plugin.sendMessage(player, "queuedfor", identifier.split("_")[1]); - return null; - } - - - return null; - } -} diff --git a/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java b/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java deleted file mode 100644 index 9c621b0..0000000 --- a/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java +++ /dev/null @@ -1,28 +0,0 @@ -package us.ajg0702.queue.spigot; - -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; - -public class QueueScoreboardActivator extends Event { - private static final HandlerList HANDLERS = new HandlerList(); - - public HandlerList getHandlers() { - return HANDLERS; - } - - public static HandlerList getHandlerList() { - return HANDLERS; - } - - Player ply; - - public QueueScoreboardActivator(Player p) { - this.ply = p; - } - - public Player getPlayer() { - return ply.getPlayer(); - } - -} diff --git a/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java b/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java deleted file mode 100644 index 57e8652..0000000 --- a/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java +++ /dev/null @@ -1,71 +0,0 @@ -package us.ajg0702.queue.spigot.utils; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -/** - * A cross-version actionbar class - * @author Based on ActionBarAPI from https://github.com/ConnorLinfoot - * - */ -public class ActionBar { - - private static String version; - private static boolean old; - - public static void send(Player player, String message) { - if(player == null) return; - if(!player.isOnline()) return; - - version = Bukkit.getServer().getClass().getPackage().getName(); - version = version.substring(version.lastIndexOf(".") + 1); - - old = version.equalsIgnoreCase("v1_8_R1") || version.startsWith("v1_7_"); - - try { - Class craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + version + ".entity.CraftPlayer"); - Object craftPlayer = craftPlayerClass.cast(player); - Object packet; - Class packetPlayOutChatClass = Class.forName("net.minecraft.server." + version + ".PacketPlayOutChat"); - Class packetClass = Class.forName("net.minecraft.server." + version + ".Packet"); - if (old) { - Class chatSerializerClass = Class.forName("net.minecraft.server." + version + ".ChatSerializer"); - Class iChatBaseComponentClass = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent"); - Method m3 = chatSerializerClass.getDeclaredMethod("a", String.class); - Object cbc = iChatBaseComponentClass.cast(m3.invoke(chatSerializerClass, "{\"text\": \"" + message + "\"}")); - packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, byte.class}).newInstance(cbc, (byte) 2); - } else { - Class chatComponentTextClass = Class.forName("net.minecraft.server." + version + ".ChatComponentText"); - Class iChatBaseComponentClass = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent"); - try { - Class chatMessageTypeClass = Class.forName("net.minecraft.server." + version + ".ChatMessageType"); - Object[] chatMessageTypes = chatMessageTypeClass.getEnumConstants(); - Object chatMessageType = null; - for (Object o : chatMessageTypes) { - if (o.toString().equals("GAME_INFO")) { - chatMessageType = o; - } - } - Object chatCompontentText = chatComponentTextClass.getConstructor(new Class[]{String.class}).newInstance(message); - packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, chatMessageTypeClass}).newInstance(chatCompontentText, chatMessageType); - } catch (ClassNotFoundException e) { - Object chatCompontentText = chatComponentTextClass.getConstructor(new Class[]{String.class}).newInstance(message); - packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, byte.class}).newInstance(chatCompontentText, (byte) 2); - } - } - Method craftPlayerHandleMethod = craftPlayerClass.getDeclaredMethod("getHandle"); - Object craftPlayerHandle = craftPlayerHandleMethod.invoke(craftPlayer); - Field playerConnectionField = craftPlayerHandle.getClass().getDeclaredField("playerConnection"); - Object playerConnection = playerConnectionField.get(craftPlayerHandle); - Method sendPacketMethod = playerConnection.getClass().getDeclaredMethod("sendPacket", packetClass); - sendPacketMethod.invoke(playerConnection, packet); - - } catch (Exception e) { - e.printStackTrace(); - } - } - -} \ No newline at end of file diff --git a/src/main/java/us/ajg0702/queue/spigot/utils/VersionSupport.java b/src/main/java/us/ajg0702/queue/spigot/utils/VersionSupport.java deleted file mode 100644 index ff3c551..0000000 --- a/src/main/java/us/ajg0702/queue/spigot/utils/VersionSupport.java +++ /dev/null @@ -1,32 +0,0 @@ -package us.ajg0702.queue.spigot.utils; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; - -public class VersionSupport { - - public static String getVersion() { - return Bukkit.getVersion().split("\\(MC: ")[1].split("\\)")[0]; - } - public static int getMinorVersion() { - return Integer.parseInt(getVersion().split("\\.")[1]); - } - - /** - * Send the player an actionbar message - * @param ply The {@link org.bukkit.entity.Player Player} to send the actionbar to - * @param message The message to send in the actionbar. - */ - public static void sendActionBar(Player ply, String message) { - // Use spigot version if available, otherwise use packets. - if(getMinorVersion() >= 11) { - ply.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(message)); - } else if(getMinorVersion() >= 8) { - ActionBar.send(ply, message); - } - } - -} diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml deleted file mode 100644 index 0c8d560..0000000 --- a/src/main/resources/bungee.yml +++ /dev/null @@ -1,4 +0,0 @@ -name: ajQueue -version: "@VERSION@" -main: us.ajg0702.queue.Main -author: ajgeiss0702 \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml deleted file mode 100644 index c3cf109..0000000 --- a/src/main/resources/config.yml +++ /dev/null @@ -1,174 +0,0 @@ -# Dont touch this number please -config-version: 21 - -# The time the server will wait between sending people in the queue -# Default: 5 -wait-time: 5 - -# The time that a server has to be offline to be marked as offline instead of restarting -# Default: 120 -offline-time: 120 - -# The time the server will wait between sending players update messages on what position they are in the queue. -# Default: 10 -message-time: 10 - -# If a player is in a server, you can have the plugin make them automatically join a queue for another server -# Example with the default values: Player joins survivalqueue server, they will auto-join the queue for survival -queue-servers: -- 'survivalqueue:survival' - -# Should the plugin send an actionbar to the player? -# The actionbar contains some info such as which server they are queued for, what position they are in, estimated time remaining, etc. -send-actionbar: true - -# What kick reasons should cause the player to be removed from the queue? -# For example, if one of the below kick reasons is 'banned' and the player gets kicked when trying to connect to -# a server in a queue with a message saying "You are banned from this server!" then it will kick them from the queue too. -kick-reasons: -- 'banned' -- 'blacklisted' - - -# Should we remove a player from the queue if they move servers? -# If they join another queue, they will be removed from the previous one no matter what -# This is more meant for if you have multiple lobbies if you want to let the player switch -# between them without losing their queue position -# Default: false -remove-player-on-server-switch: false - - -# Should we wait until the server is done loading to load the servers? -# Enable this if you have a plugin that adds servers to the server list during startup. -# Default: false -wait-to-load-servers: false - -# How long should we wait after the server finishes loading to load the server list? -# Only works if the above is enabled. -# This is in miliseconds so 1000 = 1 second -# Default: 500 -wait-to-load-servers-delay: 500 - - -# How often (in seconds) we should check for new servers to add queues for. -# If you dynamicly add servers, set this to something other than 0. -# To disable, set to 0 -reload-servers-interval: 0 - - -# Should we require permissions for players to be able to join queues? -# If enabled, players will be required to have the permission ajqueue.queue. -# Default: false -require-permission: false - - -# Should we let players join more than one queue? -# If enabled, players will be able to be in multiple queues at once. -# Default: true -allow-multiple-queues: true - -# If the player is queued for multiple servers, which server should we pick to use in things like placeholders and actionbars -# Options are first and last -# Default: last -multi-server-queue-pick: last - - -# THIS FEATURE IS ONLY AVAILABLE ON ajQueuePlus (https://www.spigotmc.org/resources/ajqueueplus.79123/) -# This will show players a different name than the actual bungeecord server name -# for example, instead of showing players "event-a", this option can make it appear as "Event A" -# With this example, you would use this: - "event-a:Event A" -# Note that currently players still have to use the normal names in queue commands and leave commands -# Format: "realname:Alias" -server-aliases: -- "event-a:Event A" - - -# How long should we wait after a server is online before sending players? -# The server will still show up as offline or restarting until this amount of time after its up -# Meant to let your server 'cool down' after lag from starting up -# In seconds -# Default: 1 -wait-after-online: 1 - - -# This is for helping with finding issues with the server pinged -# This will spam the console when enabled -# When this enabled, if servers are offline then it will spam errors. You can ignore them. -# Default: false -pinger-debug: false - - -# When a queue is paused, should we prevent players from joining it? -# Default: false -prevent-joining-paused: false - -# When a server goes back online, should we send all players in the queue instantly? -# Default: false -send-all-when-back-online: false - -# Require a permission for players to be able to join a queue from a server -# If enabled, players will need the permission ajqueue.joinfrom. to join queues. -# Replace with the name of the server -# Default: false -joinfrom-server-permission: false - -# Server groups are a group of servers that you can queue for. It will send you to the server that is the least full. -# If all servers in the group are full, it will act the same as it would when a single server is full. -# Same if all servers are offline. It will only send players to servers that are online. -# Format: "groupname:server1,server2,etc" -server-groups: -- "lobbys:lobby-1,lobby-2,lobby-3" - - -# Should we allow tab-completing in the /queue command? -# Default: true -tab-complete-queues: true - -# Should we have no wait time for these servers? -# If the server is joinable, the plugin will attempt to send players who join these queues as soon as they join. -# If the server is not immidiatly joinable, they will have to wait for the normal wait-time -# This also works with group -# NOTE: Server names are caps sensitive -send-instantly: -- "lobbys" - -# Should we log to the bungeecord console when a player fails to get sent to a server from the queue? -# Enable this if you are having an issue with one player stopping the queue -# Default: false -send-fail-debug: false - -# After how many (unsuccessfull) attempts of sending the player should we remove them from the queue? -# Set to -1 to disable -# Default: 10 -max-tries: 10 - -# Should we enable the ajqueue.bypasspaused permission? -# If enabled, anyone with the permission ajqueue.bypasspaused will be able to join paused servers -# Default: false -enable-bypasspaused-permission: false - -# Should we check to make sure that people dont get sent quicker than wait-time? -# Default: true -check-last-player-sent-time: true - -# Should we send debug info to the console when priority queue is used? -# This will print several lines to the console when a player joins a queue, -# so you should probably only use this for debugging purposes -# Default: false -priority-queue-debug: false - -# When a player is kicked from a server, should we automatically add that player to the queue? -# You will still need to use another plugin to make sure the player doesnt get kicked from bungee completly. -# Default: false -auto-add-to-queue-on-kick: false -# The delay for the above option. -# In seconds, decimals supported. -auto-add-to-queue-on-kick-delay: 1 - -# With what kick reasons should we auto-add the player to the queue -# This wont work if auto-add-to-queue-on-kick is disabled. -# If you set it to [], then all kick messages will cause the player to be added to the queue -# This works on contains, so you dont have to include the whole kick message, just a few words. -auto-add-kick-reasons: -- "restarting" -- "closed" \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml deleted file mode 100644 index 81632df..0000000 --- a/src/main/resources/plugin.yml +++ /dev/null @@ -1,13 +0,0 @@ -main: us.ajg0702.queue.spigot.Main -version: "@VERSION@" -api-version: 1.13 -author: ajgeiss0702 -name: ajQueue -softdepend: [PlaceholderAPI] -commands: - move: - aliases: [server, queue, joinq, joinqueue] - description: Queue for a server - leavequeue: - aliases: [leaveq] - description: Leaves a queue \ No newline at end of file diff --git a/src/test/java/RegexTest.java b/src/test/java/RegexTest.java deleted file mode 100644 index 674bccf..0000000 --- a/src/test/java/RegexTest.java +++ /dev/null @@ -1,49 +0,0 @@ -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.PatternReplacementResult; -import net.kyori.adventure.text.TextReplacementConfig; -import net.kyori.adventure.text.serializer.plain.PlainComponentSerializer; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -public class RegexTest { - @Test - public void regex() throws Exception { - Component msg = Component.text("&b{SERVER} &7({COUNT}): {LIST}"); - Component playerList = Component.empty(); - List players = Arrays.asList("bot01", "bot02", "bot03", "bot04", "bot05", "bot06"); - for(String p : players) { - playerList = playerList.append(Component.text("&9"+p+"&7, ")); - } - Component finalPlayerList = playerList; - msg = msg.replaceText(b -> b.match(Pattern.compile("\\{LIST}")).replacement(finalPlayerList)); - char[] commaCountString = PlainTextComponentSerializer.plainText().serialize(msg).toCharArray(); - int commas = 0; - for(Character fChar : commaCountString) { - if(fChar == ',') commas++; - } - - int finalCommas = commas; - msg = msg.replaceText(b -> b.match(",(?!.*,)").replacement("").condition((r, c, re) -> { - if(c == finalCommas) { - return PatternReplacementResult.REPLACE; - } - return PatternReplacementResult.CONTINUE; - })); - msg = msg.replaceText(b -> b.match(Pattern.compile("\\{COUNT}")).replacement(players.size()+"")); - - - String f = PlainTextComponentSerializer.plainText().serialize(msg); - System.out.println(f); - int c = 0; - for(Character fChar : f.toCharArray()) { - if(fChar == ',') c++; - } - if(c != 5) { - throw new Exception("Wrong comma count! Had "+c+" when expected 5"); - } - } -} From c8562e0018caba3e70a44562ef8aa9dc8bbf1ed5 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 2 Jul 2021 10:53:09 -0700 Subject: [PATCH 06/56] should finish api --- .../us/ajg0702/queue/api/AliasManager.java | 17 +++++++++++++ .../main/java/us/ajg0702/queue/api/Logic.java | 22 +++++++++++++++++ .../us/ajg0702/queue/api/QueueManager.java | 24 ++++++++++++++++++- .../queue/api/players/QueuePlayer.java | 15 ++++++++++++ .../ajg0702/queue/api/queues/QueueServer.java | 16 +++++++++++++ common/build.gradle.kts | 2 ++ 6 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 api/src/main/java/us/ajg0702/queue/api/AliasManager.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/Logic.java diff --git a/api/src/main/java/us/ajg0702/queue/api/AliasManager.java b/api/src/main/java/us/ajg0702/queue/api/AliasManager.java new file mode 100644 index 0000000..4ca19c7 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/AliasManager.java @@ -0,0 +1,17 @@ +package us.ajg0702.queue.api; + +public interface AliasManager { + /** + * Gets an alias from the server/group's name + * @param server The original name of the server + * @return The set alias (set in the config) + */ + String getAlias(String server); + + /** + * Gets the name of the server/group from an alias + * @param alias The alias + * @return The name of the server/group + */ + String getServer(String alias); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/Logic.java b/api/src/main/java/us/ajg0702/queue/api/Logic.java new file mode 100644 index 0000000..aea8b29 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/Logic.java @@ -0,0 +1,22 @@ +package us.ajg0702.queue.api; + +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; + +import java.util.List; + +public interface Logic { + /** + * Returns if the plugin is premium or not + * @return True if premium, false if not + */ + boolean isPremium(); + + /** + * The priority logic that is executed if the plugin is premium. + * @param list The current queue + * @param server The server/group name that is being queued for + * @param player The player that is being queued + */ + void priorityLogic(List list, String server, AdaptedPlayer player); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java index 4b46e37..c9d4bc7 100644 --- a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -1,5 +1,6 @@ package us.ajg0702.queue.api; +import com.google.common.collect.ImmutableList; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.queues.QueueServer; @@ -11,6 +12,27 @@ public interface QueueManager { * @param server The server or group to add the player to * @return True if adding was successfull, false if not. */ - public boolean addToQueue(AdaptedPlayer player, QueueServer server); + boolean addToQueue(AdaptedPlayer player, QueueServer server); + + /** + * Adds a player to a queue + * @param player The player to be added + * @param serverName The name of the server or group to add the player too + * @return True if adding was successfull, false if not. + */ + boolean addToQueue(AdaptedPlayer player, String serverName); + + /** + * Gets a list of QueueServers (servers and groups) + * @return A list of QueueServerss + */ + ImmutableList getServers(); + + /** + * Gets a list of QueueServer (servers and groups) names + * @return A list of QueueServer names + */ + ImmutableList getServerNames(); + } diff --git a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java index 937cf83..1c73a6c 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java @@ -1,4 +1,19 @@ package us.ajg0702.queue.api.players; +import javax.annotation.Nullable; +import java.util.UUID; + public interface QueuePlayer { + /** + * Returns the player's UUID + * @return the player's UUID + */ + UUID getUniqueId(); + + /** + * Get the player this represents. + * Can be null because the player could not be online + * @return The player if they are online, null otherwise + */ + @Nullable AdaptedPlayer getPlayer(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java index dd11580..43bfdcc 100644 --- a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -110,6 +110,22 @@ public interface QueueServer { */ boolean isFull(); + /** + * Removes a player from the queue + * @param player The player to remove + */ + void removePlayer(QueuePlayer player); + + /** + * Adds a player to a queue + * NOTE: It is reccomended to use QueueManager#addToQueue + * @param player The QueuePlayer that is being added + */ + void addPlayer(QueuePlayer player); + + + + /** * elliot is bad * @return true because elliot is bad diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 4d3b28f..501b3db 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -11,6 +11,8 @@ repositories { dependencies { compileOnly("net.kyori:adventure-api:4.8.1") + + implementation("us.ajg0702:ajQueue:") } publishing { From e10251048bfc8718953e1a92ae6a87a035dbfdab Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 3 Jul 2021 08:27:42 -0700 Subject: [PATCH 07/56] wip --- .../us/ajg0702/queue/api/QueueManager.java | 21 ++++++++++++++ common/build.gradle.kts | 3 +- .../queue/common/QueueManagerImpl.java | 28 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java index c9d4bc7..324b640 100644 --- a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -34,5 +34,26 @@ public interface QueueManager { */ ImmutableList getServerNames(); + /** + * Get a single server the player is queued for. Depends on the multi-server-queue-pick option in the config + * @param player The player + * @return The server that was chosen that the player is queued for. + */ + QueueServer getSingleServer(AdaptedPlayer player); + /** + * Get the name of the server the player is queued for. + * If multiple servers are queued for, it will use the multi-server-queue-pick option in the config + * @param player The player + * @return The name of the server, the placeholder none message if not queued + */ + String getQueuedName(AdaptedPlayer player); + + /** + * Checks servers that are in bungeecord and adds any it doesnt + * know about. + * + * Also creates/edits server groups + */ + void reloadServers(); } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 501b3db..8400e02 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -11,8 +11,9 @@ repositories { dependencies { compileOnly("net.kyori:adventure-api:4.8.1") + compileOnly("com.google.guava:guava:30.1.1-jre") - implementation("us.ajg0702:ajQueue:") + implementation(project(":api")) } publishing { diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java new file mode 100644 index 0000000..a721102 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -0,0 +1,28 @@ +package us.ajg0702.queue.common; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.QueueManager; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.queues.QueueServer; + +public class QueueManagerImpl implements QueueManager { + @Override + public boolean addToQueue(AdaptedPlayer player, QueueServer server) { + return false; + } + + @Override + public boolean addToQueue(AdaptedPlayer player, String serverName) { + return false; + } + + @Override + public ImmutableList getServers() { + return null; + } + + @Override + public ImmutableList getServerNames() { + return null; + } +} From 726bb42bc85b5f1c2b3dcc5e001276634c486253 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 5 Jul 2021 20:32:23 -0700 Subject: [PATCH 08/56] progress --- api/build.gradle.kts | 2 +- .../main/java/us/ajg0702/queue/api/Logic.java | 3 +- .../us/ajg0702/queue/api/QueueManager.java | 54 +++++ .../queue/api/players/AdaptedPlayer.java | 27 +++ .../queue/api/players/QueuePlayer.java | 34 +++ .../ajg0702/queue/api/queues/QueueServer.java | 44 +++- build.gradle.kts | 7 +- common/build.gradle.kts | 2 + .../ajg0702/queue/common/PlatformMethods.java | 13 + .../us/ajg0702/queue/common/QueueMain.java | 49 ++++ .../queue/common/QueueManagerImpl.java | 227 +++++++++++++++++- .../ajg0702/queue/common/ServerBuilder.java | 9 + .../queue/common/players/QueuePlayerImpl.java | 68 ++++++ 13 files changed, 527 insertions(+), 12 deletions(-) create mode 100644 common/src/main/java/us/ajg0702/queue/common/PlatformMethods.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/QueueMain.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/ServerBuilder.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 75be208..10b331c 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -10,7 +10,7 @@ repositories { } dependencies { - compileOnly("net.kyori:adventure-api:4.8.1") + implementation("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") } diff --git a/api/src/main/java/us/ajg0702/queue/api/Logic.java b/api/src/main/java/us/ajg0702/queue/api/Logic.java index aea8b29..6019d67 100644 --- a/api/src/main/java/us/ajg0702/queue/api/Logic.java +++ b/api/src/main/java/us/ajg0702/queue/api/Logic.java @@ -2,6 +2,7 @@ package us.ajg0702.queue.api; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; import java.util.List; @@ -18,5 +19,5 @@ public interface Logic { * @param server The server/group name that is being queued for * @param player The player that is being queued */ - void priorityLogic(List list, String server, AdaptedPlayer player); + QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player); } diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java index 324b640..a54f73d 100644 --- a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -2,6 +2,7 @@ package us.ajg0702.queue.api; import com.google.common.collect.ImmutableList; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; public interface QueueManager { @@ -56,4 +57,57 @@ public interface QueueManager { * Also creates/edits server groups */ void reloadServers(); + + /** + * Sends queue status action bars to players in queues + */ + void sendActionBars(); + + /** + * Tell the spigot sides to call the queue scoreboard event + */ + void sendQueueEvents(); + + /** + * Sends chat queue status messages to players in queues + */ + void sendMessages(); + + /** + * Send a chat queue status message to a specific player in a specific queue + * @param player The player that is in the queue + */ + void sendMessage(QueuePlayer player); + + /** + * Find a server by its name + * @param name The name to look for + * @return The QueueServer if found, null if not + */ + QueueServer findServer(String name); + + /** + * Attempts to send the first player in all queues to the server they are queued for + */ + void sendPlayers(); + + /** + * Attempts to send the first player in a specific queue + * @param server The queue that we should try to send. + */ + void sendPlayers(QueueServer server); + + /** + * Finds QueuePlayers that represent this player + * @param p The player to look up + * @return A list of QueuePlayers that represent this player + */ + ImmutableList findPlayerInQueues(AdaptedPlayer p); + + /** + * Gets all of the queues the player is currently queued for + * @param p The player + * @return A list of QueueServers that this player is queued for + */ + ImmutableList getPlayerQueues(AdaptedPlayer p); } diff --git a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java index 0b5b50a..c4e87ec 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java @@ -3,11 +3,19 @@ package us.ajg0702.queue.api.players; import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.util.Handle; +import java.util.UUID; + /** * Represents a cross-platform player */ public interface AdaptedPlayer extends Handle { + /** + * Check if the plauer is currently connected + * @return True if connected, false if not + */ + boolean isConnected(); + /** * Send a player a message from a Component * @param message The message to send @@ -20,4 +28,23 @@ public interface AdaptedPlayer extends Handle { * @param message The message to send */ void sendMessage(String message); + + /** + * Checks if the player has a certain permission + * @param permission The permission to check + * @return True if they have the permission, false if not + */ + boolean hasPermission(String permission); + + /** + * Gets the name of the server the player is currently on + * @return The name of the server + */ + String getServerName(); + + /** + * Gets the player's unique id (UUID) + * @return The player's uuid + */ + UUID getUniqueId(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java index 1c73a6c..41aafae 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java @@ -1,19 +1,53 @@ package us.ajg0702.queue.api.players; +import us.ajg0702.queue.api.queues.QueueServer; + import javax.annotation.Nullable; import java.util.UUID; public interface QueuePlayer { + /** * Returns the player's UUID * @return the player's UUID */ UUID getUniqueId(); + /** + * Gets the server or group this player is queued for + * @return The QueueServer this player is queued for + */ + QueueServer getQueueServer(); + + /** + * Gets the player's position in the queue + * @return The player's position. 1 being 1st, 2 being 2nd, etc + */ + int getPosition(); + /** * Get the player this represents. * Can be null because the player could not be online * @return The player if they are online, null otherwise */ @Nullable AdaptedPlayer getPlayer(); + + /** + * Sets the player that this represents. + * Will throw IllegalArgumentException if the player's uuid does not match the original. + * @param player The player to add + */ + void setPlayer(AdaptedPlayer player); + + /** + * Gets the highest priority level the player has. + * In free ajQueue, no priority is 0 and priority is 1 + * @return The priority level of this player for this server + */ + int getPriority(); + + /** + * Gets if this player has priority + */ + boolean hasPriority(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java index 43bfdcc..f984cbf 100644 --- a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -117,12 +117,52 @@ public interface QueueServer { void removePlayer(QueuePlayer player); /** - * Adds a player to a queue + * Removes a player from the queue + * @param player The player to remove + */ + void removePlayer(AdaptedPlayer player); + + /** + * Adds a player to the end of the queue * NOTE: It is reccomended to use QueueManager#addToQueue - * @param player The QueuePlayer that is being added + * @param player The QueuePlayer t add */ void addPlayer(QueuePlayer player); + /** + * Adds a player to the specified position in the queue + * NOTE: It is reccomended to use QueueManager#addToQueue + * @param player The QueuePlayer to add + * @param position The position to add them + */ + void addPlayer(QueuePlayer player, int position); + + /** + * Sends the first player in the queue to the server + */ + void sendPlayer(); + + /** + * Gets the name of the server/group + * @return The name of the server/group + */ + String getName(); + + + /** + * If the player can access the server. (Bungeecord's restricted servers) + * If on a platform that doesnt have restricted servers, this will always return true. + * @param ply The player + * @return True if the player can join based on bungeecord's restricted servers system + */ + boolean canAccess(AdaptedPlayer ply); + + /** + * The alias of this server. For displaying. + * @return The alias of this server + */ + String getAlias(); + diff --git a/build.gradle.kts b/build.gradle.kts index 58aab0f..57fe8bd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,11 +37,7 @@ repositories { dependencies { testImplementation("junit:junit:4.12") - compileOnly("me.clip:placeholderapi:2.10.4") - compileOnly("net.kyori:adventure-text-serializer-bungeecord:4.0.0-SNAPSHOT") - - implementation("us.ajg0702:ajUtils:1.0.4") - implementation("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") + implementation(project(":common")) } @@ -58,6 +54,7 @@ tasks.shadowJar { relocate("us.ajg0702.utils", "us.ajg0702.queue.utils") relocate("org.bstats", "us.ajg0702.bstats") relocate("net.kyori", "us.ajg0702.queue.kyori") + relocate("org.spongepowered.configurate", "us.ajg0702.queue.configurate") archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}.${archiveExtension.get()}") } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 8400e02..6f89f31 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -7,11 +7,13 @@ group = "us.ajg0702.queue.api" repositories { mavenCentral() + maven { url = uri("https://repo.ajg0702.us") } } dependencies { compileOnly("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") + compileOnly("us.ajg0702:ajUtils:1.1.4") implementation(project(":api")) } diff --git a/common/src/main/java/us/ajg0702/queue/common/PlatformMethods.java b/common/src/main/java/us/ajg0702/queue/common/PlatformMethods.java new file mode 100644 index 0000000..76733ac --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/PlatformMethods.java @@ -0,0 +1,13 @@ +package us.ajg0702.queue.common; + +public interface PlatformMethods { + /** + * BungeeUtils.sendCustomData(p, "position", pos+""); + * BungeeUtils.sendCustomData(p, "positionof", len+""); + * BungeeUtils.sendCustomData(p, "queuename", pl.aliases.getAlias(s)); + * BungeeUtils.sendCustomData(p, "inqueue", "true"); + * BungeeUtils.sendCustomData(p, "inqueueevent", "true"); + */ + void sendJoinQueueChannelMessages(); + +} diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java new file mode 100644 index 0000000..a273be9 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -0,0 +1,49 @@ +package us.ajg0702.queue.common; + +import us.ajg0702.queue.api.AliasManager; +import us.ajg0702.queue.api.Logic; +import us.ajg0702.utils.common.Config; +import us.ajg0702.utils.common.Messages; + +import java.util.logging.Logger; + +public class QueueMain { + private Config config; + public Config getConfig() { + return config; + } + + private Messages messages; + public Messages getMessages() { + return messages; + } + + private AliasManager aliasManager; + public AliasManager getAliasManager() { + return aliasManager; + } + + private Logic logic; + public Logic getLogic() { + return logic; + } + + public boolean isPremium() { + return getLogic().isPremium(); + } + + private PlatformMethods platformMethods; + public PlatformMethods getPlatformMethods() { + return platformMethods; + } + + private Logger logger; + public Logger getLogger() { + return logger; + } + + private ServerBuilder serverBuilder; + public ServerBuilder getServerBuilder() { + return serverBuilder; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index a721102..78d9d46 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -3,26 +3,247 @@ package us.ajg0702.queue.common; import com.google.common.collect.ImmutableList; import us.ajg0702.queue.api.QueueManager; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.common.players.QueuePlayerImpl; +import us.ajg0702.utils.bungee.BungeeUtils; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; public class QueueManagerImpl implements QueueManager { + + private List servers; + + private final QueueMain main; + private final Messages msgs; + + public QueueManagerImpl(QueueMain main) { + this.main = main; + this.msgs = main.getMessages(); + } + @Override public boolean addToQueue(AdaptedPlayer player, QueueServer server) { - return false; + if(player == null || server == null) { + return false; + } + if(!player.isConnected()) return false; + + if(main.getConfig().getBoolean("joinfrom-server-permission") && !player.hasPermission("ajqueue.joinfrom."+player.getServerName())) { + player.sendMessage(msgs.getComponent("errors.deny-joining-from-server")); + return false; + } + + if(server.isPaused() && main.getConfig().getBoolean("prevent-joining-paused")) { + player.sendMessage(msgs.getComponent("errors.cant-join-paused", "SERVER:"+server.getAlias())); + return false; + } + + if(player.getServerName().equals(server.getName())) { + player.sendMessage(msgs.getComponent("errors.already-connected", "SERVER:"+server.getAlias())); + return false; + } + + ImmutableList beforeQueues = getPlayerQueues(player); + if(beforeQueues.size() > 0) { + if(beforeQueues.contains(server)) { + player.sendMessage(msgs.getComponent("errors.already-queued")); + return false; + } + if(!main.getConfig().getBoolean("allow-multiple-queues")) { + player.sendMessage(msgs.getComponent("status.left-last-queue", "SERVER:"+server.getAlias())); + for(QueueServer ser : beforeQueues) { + ser.removePlayer(player); + } + } + } + + ImmutableList list = server.getQueue(); + QueuePlayer queuePlayer; + if(main.isPremium()) { + queuePlayer = main.getLogic().priorityLogic(server, player); + } else { + int priority = player.hasPermission("ajqueue.priority") || + player.hasPermission("ajqueue.serverpriority."+server.getName()) ? 1 : 0; + queuePlayer = new QueuePlayerImpl(player, server, priority); + if( + priority == 1 && + server.getQueue().size() > 0 + ) { + int i = 0; + for(QueuePlayer ply : list) { + if(!ply.hasPriority()) { + server.addPlayer(queuePlayer, i); + break; + } + i++; + } + } + + if(!list.contains(queuePlayer)) { + server.addPlayer(queuePlayer); + } + } + + list = server.getQueue(); + + int pos = queuePlayer.getPosition(); + int len = list.size(); + + boolean sendInstant = main.getConfig().getStringList("send-instantly").contains(server.getName()) || server.isJoinable(p); + boolean sendInstantp = list.size() <= 1 && server.canAccess(player); + boolean timeGood = !main.getConfig().getBoolean("check-last-player-sent-time") || System.currentTimeMillis() - server.getLastSentTime() > Math.floor(main.getConfig().getDouble("wait-time") * 1000); + + if((sendInstant && (sendInstantp && timeGood))) { + sendPlayers(server); + if(!msgs.isEmpty("status.now-in-empty-queue")) { + player.sendMessage(msgs.getComponent("status.now-in-empty-queue", + "POS:"+pos, + "LEN:"+len, + "SERVER:"+server.getAlias())); + } + } else { + player.sendMessage(msgs.getComponent("status.now-in-queue", + "POS:"+pos, + "LEN:"+len, + "SERVER:"+server.getAlias(), + "SERVERNAME:"+server.getName() + )); + } + + main.getPlatformMethods().sendJoinQueueChannelMessages(); + return true; } @Override public boolean addToQueue(AdaptedPlayer player, String serverName) { - return false; + QueueServer server = findServer(serverName); + if(server == null) return false; + return addToQueue(player, server); } @Override public ImmutableList getServers() { - return null; + return ImmutableList.copyOf(servers); } @Override public ImmutableList getServerNames() { + List names = new ArrayList<>(); + for(QueueServer s : servers) { + names.add(s.getName()); + } + return ImmutableList.copyOf(names); + } + + @Override + public QueueServer getSingleServer(AdaptedPlayer player) { + ImmutableList queued = findPlayerInQueues(player); + if(queued.size() <= 0) { + return null; + } + QueueServer selected = queued.get(0).getQueueServer(); + + if(main.getConfig().getString("multi-server-queue-pick").equalsIgnoreCase("last")) { + selected = queued.get(queued.size()-1).getQueueServer(); + } + return selected; + } + + @Override + public String getQueuedName(AdaptedPlayer player) { + return getSingleServer(player).getName(); + } + + @Override + public void reloadServers() { + if(main.getConfig() == null) { + main.getLogger().severe("[MAN] Config is null"); + } + + servers.clear(); + + servers.addAll(main.getServerBuilder().getServers()); + + List groupsraw = main.getConfig().getStringList("server-groups"); + for(String groupraw : groupsraw) { + if(groupraw.isEmpty()) { + main.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); + continue; + } + + String groupname = groupraw.split(":")[0]; + String[] serversraw = groupraw.split(":")[1].split(","); + + if(findServer(groupname) != null) { + main.getLogger().warning("The name of a group ('"+groupname+"') cannot be the same as the name of a server!"); + continue; + } + + + for(String serverraw : serversraw) { + ServerInfo si = svs.get(serverraw); + if(si == null) { + pl.getLogger().warning("Could not find server named '"+serverraw+"' in servergroup '"+groupname+"'!"); + continue; + } + servers.add(si); + } + + if(servers.size() == 0) { + pl.getLogger().warning("Server group '"+groupname+"' has no servers! Ignoring it."); + continue; + } + + this.servers.add(new QueueServer(groupname, servers)); + } + } + + @Override + public void sendActionBars() { + + } + + @Override + public void sendQueueEvents() { + + } + + @Override + public void sendMessages() { + + } + + @Override + public void sendMessage(QueuePlayer player) { + + } + + @Override + public QueueServer findServer(String name) { + return null; + } + + @Override + public void sendPlayers() { + + } + + @Override + public void sendPlayers(QueueServer server) { + + } + + @Override + public ImmutableList findPlayerInQueues(AdaptedPlayer p) { + return null; + } + + @Override + public ImmutableList getPlayerQueues(AdaptedPlayer p) { return null; } } diff --git a/common/src/main/java/us/ajg0702/queue/common/ServerBuilder.java b/common/src/main/java/us/ajg0702/queue/common/ServerBuilder.java new file mode 100644 index 0000000..bfc03dd --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/ServerBuilder.java @@ -0,0 +1,9 @@ +package us.ajg0702.queue.common; + +import us.ajg0702.queue.api.queues.QueueServer; + +import java.util.List; + +public interface ServerBuilder { + List getServers(); +} diff --git a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java new file mode 100644 index 0000000..523a623 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java @@ -0,0 +1,68 @@ +package us.ajg0702.queue.common.players; + +import org.jetbrains.annotations.Nullable; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; + +import java.util.UUID; + +public class QueuePlayerImpl implements QueuePlayer { + + + private AdaptedPlayer player; + private final QueueServer server; + + private final int highestPriority; + + private final UUID uuid; + + public QueuePlayerImpl(AdaptedPlayer player, QueueServer server, int highestPriority) { + this.player = player; + this.server = server; + + this.highestPriority = highestPriority; + + uuid = player.getUniqueId(); + } + + @Override + public UUID getUniqueId() { + return uuid; + } + + @Override + public QueueServer getQueueServer() { + return server; + } + + @Override + public int getPosition() { + return getQueueServer().getQueue().indexOf(this)+1; + } + + @Nullable + @Override + public AdaptedPlayer getPlayer() { + if(!player.isConnected()) return null; + return player; + } + + @Override + public void setPlayer(AdaptedPlayer player) { + if(!player.getUniqueId().equals(getUniqueId())) { + throw new IllegalArgumentException("UUIDs do not match"); + } + this.player = player; + } + + @Override + public int getPriority() { + return highestPriority; + } + + @Override + public boolean hasPriority() { + return highestPriority > 0; + } +} From ff9a2965c11047939405dea077de2f15f8bb0072 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Tue, 6 Jul 2021 17:31:21 -0700 Subject: [PATCH 09/56] lots of progress --- .../ajg0702/queue/api}/PlatformMethods.java | 12 +- .../us/ajg0702/queue/api/QueueManager.java | 4 +- .../us/ajg0702/queue/api/ServerBuilder.java | 12 + .../queue/api/players/AdaptedPlayer.java | 13 ++ .../ajg0702/queue/api/queues/QueueServer.java | 27 +++ .../queue/api/server/AdaptedServer.java | 30 +++ .../queue/api/server/AdaptedServerInfo.java | 11 + .../queue/api/server/AdaptedServerPing.java | 29 +++ common/build.gradle.kts | 2 +- .../us/ajg0702/queue/common/QueueMain.java | 9 + .../queue/common/QueueManagerImpl.java | 221 ++++++++++++++++-- .../ajg0702/queue/common/ServerBuilder.java | 9 - .../queue/common/players/QueuePlayerImpl.java | 2 +- .../queue/common/queues/QueueServerImpl.java | 197 ++++++++++++++++ 14 files changed, 543 insertions(+), 35 deletions(-) rename {common/src/main/java/us/ajg0702/queue/common => api/src/main/java/us/ajg0702/queue/api}/PlatformMethods.java (54%) create mode 100644 api/src/main/java/us/ajg0702/queue/api/ServerBuilder.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerInfo.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java delete mode 100644 common/src/main/java/us/ajg0702/queue/common/ServerBuilder.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java diff --git a/common/src/main/java/us/ajg0702/queue/common/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java similarity index 54% rename from common/src/main/java/us/ajg0702/queue/common/PlatformMethods.java rename to api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index 76733ac..b6581bb 100644 --- a/common/src/main/java/us/ajg0702/queue/common/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -1,4 +1,6 @@ -package us.ajg0702.queue.common; +package us.ajg0702.queue.api; + +import us.ajg0702.queue.api.players.AdaptedPlayer; public interface PlatformMethods { /** @@ -10,4 +12,12 @@ public interface PlatformMethods { */ void sendJoinQueueChannelMessages(); + /** + * Sends a plugin message on the plugin messaging channel + * @param player The player to send the message through + * @param channel The (sub)channel + * @param data The data + */ + void sendPluginMessage(AdaptedPlayer player, String channel, String... data); + } diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java index a54f73d..a86267a 100644 --- a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -75,9 +75,9 @@ public interface QueueManager { /** * Send a chat queue status message to a specific player in a specific queue - * @param player The player that is in the queue + * @param queuePlayer The player that is in the queue */ - void sendMessage(QueuePlayer player); + void sendMessage(QueuePlayer queuePlayer); /** * Find a server by its name diff --git a/api/src/main/java/us/ajg0702/queue/api/ServerBuilder.java b/api/src/main/java/us/ajg0702/queue/api/ServerBuilder.java new file mode 100644 index 0000000..178d05a --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/ServerBuilder.java @@ -0,0 +1,12 @@ +package us.ajg0702.queue.api; + +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; + +import java.util.List; + +public interface ServerBuilder { + List getServers(); + + QueueServer buildGroup(String name, List servers); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java index c4e87ec..2db0e3b 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java @@ -1,6 +1,7 @@ package us.ajg0702.queue.api.players; import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.util.Handle; import java.util.UUID; @@ -22,6 +23,12 @@ public interface AdaptedPlayer extends Handle { */ void sendMessage(Component message); + /** + * Sends an actionbar message to the player + * @param message The message to send + */ + void sendActionBar(Component message); + /** * Send a player a message from a string * Converted to Component internally @@ -47,4 +54,10 @@ public interface AdaptedPlayer extends Handle { * @return The player's uuid */ UUID getUniqueId(); + + /** + * Sends the player to a different server. + * Does not use the queue. + */ + void connect(AdaptedServer server); } diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java index f984cbf..1fd4f0e 100644 --- a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.api.queues; import com.google.common.collect.ImmutableList; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.server.AdaptedServer; import java.util.List; import java.util.UUID; @@ -163,7 +164,33 @@ public interface QueueServer { */ String getAlias(); + /** + * Get the servers that this QueueServer represents + * @return A list of servers that this QueueServer represents + */ + ImmutableList getServers(); + /** + * Gets the names of the servers in this group + * @return A list of names + */ + ImmutableList getServerNames(); + + + /** + * Returns if this server is a group + * @return True if this server is a group + */ + boolean isGroup(); + + /** + * Finds the player in this queue and returns the representative QueuePlayer + * @return The QueuePlayer representing the player, null if not found + */ + QueuePlayer findPlayer(AdaptedPlayer player); + + + AdaptedServer getIdealServer(AdaptedPlayer player); /** diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java new file mode 100644 index 0000000..dfa7b4b --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java @@ -0,0 +1,30 @@ +package us.ajg0702.queue.api.server; + +import us.ajg0702.queue.api.players.AdaptedPlayer; + +import java.util.concurrent.CompletableFuture; + +public interface AdaptedServer { + + /** + * Gets the ServerInfo for this server + * @return The AdaptedServerInfo for this server + */ + AdaptedServerInfo getServerInfo(); + + /** + * Pings the server and gets info back + * @return A CompletableFuture with the ServerPing + */ + CompletableFuture ping(); + + /** + * If the player can access the server + * Uses bungeecord's restricted server feature + * Will always return true on other platforms + * @param player The player to check + * @return False if the server is restricted and the player does not have permission to join. + */ + boolean canAccess(AdaptedPlayer player); + +} diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerInfo.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerInfo.java new file mode 100644 index 0000000..81be1bb --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerInfo.java @@ -0,0 +1,11 @@ +package us.ajg0702.queue.api.server; + +public interface AdaptedServerInfo { + + /** + * Gets the name of the server + * @return The name of the server + */ + String getName(); + +} diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java new file mode 100644 index 0000000..1ed42e2 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java @@ -0,0 +1,29 @@ +package us.ajg0702.queue.api.server; + +import net.kyori.adventure.text.Component; + +public interface AdaptedServerPing { + /** + * Gets the component of the description (aka MOTD) + * @return A compoent of the description + */ + Component getDescriptionComponent(); + + /** + * Gets the description stripped of any color or styling + * @return The description, but no colors + */ + String getPlainDescription(); + + /** + * Gets the number of players currently online + * @return The number of players online + */ + int getPlayerCount(); + + /** + * Gets the maximum number of players that can join. + * @return The maximum number of players that can join + */ + int getMaxPlayers(); +} diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 6f89f31..b967a59 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -13,7 +13,7 @@ repositories { dependencies { compileOnly("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.4") + compileOnly("us.ajg0702:ajUtils:1.1.5") implementation(project(":api")) } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index a273be9..4b635b1 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -2,12 +2,21 @@ package us.ajg0702.queue.common; import us.ajg0702.queue.api.AliasManager; import us.ajg0702.queue.api.Logic; +import us.ajg0702.queue.api.PlatformMethods; +import us.ajg0702.queue.api.ServerBuilder; import us.ajg0702.utils.common.Config; import us.ajg0702.utils.common.Messages; import java.util.logging.Logger; public class QueueMain { + + + private double timeBetweenPlayers; + public double getTimeBetweenPlayers() { + return timeBetweenPlayers; + } + private Config config; public Config getConfig() { return config; diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 78d9d46..1298bf2 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -5,13 +5,14 @@ import us.ajg0702.queue.api.QueueManager; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.api.server.AdaptedServerInfo; import us.ajg0702.queue.common.players.QueuePlayerImpl; import us.ajg0702.utils.bungee.BungeeUtils; import us.ajg0702.utils.common.Messages; +import us.ajg0702.utils.common.TimeUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; public class QueueManagerImpl implements QueueManager { @@ -93,7 +94,7 @@ public class QueueManagerImpl implements QueueManager { int pos = queuePlayer.getPosition(); int len = list.size(); - boolean sendInstant = main.getConfig().getStringList("send-instantly").contains(server.getName()) || server.isJoinable(p); + boolean sendInstant = main.getConfig().getStringList("send-instantly").contains(server.getName()) || server.isJoinable(player); boolean sendInstantp = list.size() <= 1 && server.canAccess(player); boolean timeGood = !main.getConfig().getBoolean("check-last-player-sent-time") || System.currentTimeMillis() - server.getLastSentTime() > Math.floor(main.getConfig().getDouble("wait-time") * 1000); @@ -175,75 +176,253 @@ public class QueueManagerImpl implements QueueManager { continue; } - String groupname = groupraw.split(":")[0]; + String groupName = groupraw.split(":")[0]; String[] serversraw = groupraw.split(":")[1].split(","); - if(findServer(groupname) != null) { - main.getLogger().warning("The name of a group ('"+groupname+"') cannot be the same as the name of a server!"); + if(findServer(groupName) != null) { + main.getLogger().warning("The name of a group ('"+groupName+"') cannot be the same as the name of a server!"); continue; } + List groupServers = new ArrayList<>(); for(String serverraw : serversraw) { - ServerInfo si = svs.get(serverraw); - if(si == null) { - pl.getLogger().warning("Could not find server named '"+serverraw+"' in servergroup '"+groupname+"'!"); + QueueServer found = findServer(serverraw); + if(found == null) { + main.getLogger().warning("Could not find server named '"+serverraw+"' in servergroup '"+groupName+"'!"); continue; } - servers.add(si); + if(found.isGroup()) continue; + + groupServers.add(found.getServers().get(0)); } if(servers.size() == 0) { - pl.getLogger().warning("Server group '"+groupname+"' has no servers! Ignoring it."); + main.getLogger().warning("Server group '"+groupName+"' has no servers! Ignoring it."); continue; } - this.servers.add(new QueueServer(groupname, servers)); + this.servers.add(main.getServerBuilder().buildGroup(groupName, groupServers)); } } @Override public void sendActionBars() { + if(!main.getConfig().getBoolean("send-actionbar")) return; + for(QueueServer server : servers) { + String status = server.getStatusString(); + for(QueuePlayer queuePlayer : server.getQueue()) { + if(!getSingleServer(queuePlayer.getPlayer()).equals(server)) continue; + + int pos = queuePlayer.getPosition(); + if(pos == 0) { + server.removePlayer(queuePlayer); + continue; + } + + AdaptedPlayer player = queuePlayer.getPlayer(); + if(player == null) continue; + + if(!server.isJoinable(player)) { + queuePlayer.getPlayer().sendActionBar(msgs.getComponent("spigot.actionbar.offline", + "POS:"+pos, + "LEN:"+server.getQueue().size(), + "SERVER:"+server.getAlias(), + "STATUS:"+status + )); + } else { + int time = (int) Math.round(pos * main.getTimeBetweenPlayers()); + player.sendActionBar(msgs.getComponent("spigot.actionbar.online", + "POS:"+pos, + "LEN:"+server.getQueue().size(), + "SERVER:"+server.getAlias(), + "TIME:"+ TimeUtils.timeString(time, msgs.getString("format.time.mins"), msgs.getString("format.time.secs")) + )); + } + } + } } @Override public void sendQueueEvents() { - + for (QueueServer s : servers) { + for (QueuePlayer queuePlayer : s.getQueue()) { + AdaptedPlayer player = queuePlayer.getPlayer(); + if (player == null || !player.isConnected()) continue; + main.getPlatformMethods().sendPluginMessage(player, "inqueueevent", "true"); + } + } } @Override public void sendMessages() { - + for(QueueServer server : servers) { + for(QueuePlayer queuePlayer : server.getQueue()) { + sendMessage(queuePlayer); + } + } } @Override - public void sendMessage(QueuePlayer player) { + public void sendMessage(QueuePlayer queuePlayer) { + AdaptedPlayer player = queuePlayer.getPlayer(); + if(player == null || !player.isConnected()) return; + QueueServer server = queuePlayer.getQueueServer(); + + int pos = queuePlayer.getPosition(); + int len = server.getQueue().size(); + + if(server.isJoinable(player)) { + String status = server.getStatusString(player); + + if(msgs.getString("status.offline.base").isEmpty()) return; + + player.sendMessage(msgs.getComponent("status.offline.base", + "STATUS:"+status, + "POS:"+pos, + "LEN:"+len, + "SERVER:"+server.getAlias() + )); + } else { + if(msgs.getString("status.online.base").isEmpty()) return; + int time = (int) Math.round(pos * main.getTimeBetweenPlayers()); + player.sendMessage(msgs.getComponent("status.online.base", + "TIME:" + TimeUtils.timeString(time, msgs.getString("format.time.mins"), msgs.getString("format.time.secs")), + "POS:"+pos, + "LEN:"+len, + "SERVER:"+server.getAlias() + )); + } } @Override public QueueServer findServer(String name) { + for(QueueServer server : servers) { + if(server == null) continue; + if(server.getName().equalsIgnoreCase(name)) { + return server; + } + } return null; } @Override public void sendPlayers() { - + sendPlayers(null); } - @Override - public void sendPlayers(QueueServer server) { + HashMap sendingNowAntiSpam = new HashMap<>(); + HashMap sendingAttempts = new HashMap<>(); + @Override + public void sendPlayers(QueueServer queueServer) { + List sendingServers; + if(queueServer == null) { + sendingServers = new ArrayList<>(servers); + } else { + sendingServers = Collections.singletonList(queueServer); + } + + for(QueueServer server : sendingServers) { + if(!server.isOnline()) continue; + if(server.getQueue().size() == 0) continue; + + if(main.getConfig().getBoolean("send-all-when-back-online") && server.justWentOnline() && server.isOnline()) { + for(QueuePlayer p : server.getQueue()) { + AdaptedPlayer player = p.getPlayer(); + if(player == null) continue; + + if(server.isFull() && !p.getPlayer().hasPermission("ajqueue.joinfull")) continue; + + AdaptedServer selected = server.getIdealServer(player); + if(selected == null) { + main.getLogger().severe("Could not find ideal server for server/group '"+server.getName()+"'!"); + continue; + } + + player.sendMessage(msgs.getComponent("status.sending-now", "SERVER:"+server.getAlias())); + player.connect(selected); + } + return; + } + + QueuePlayer nextQueuePlayer = server.getQueue().get(0); + AdaptedPlayer nextPlayer = nextQueuePlayer.getPlayer(); + + // If the first person int the queue is offline or already in the server, find the next online player in the queue + int i = 0; + while((nextPlayer == null || server.getServerNames().contains(nextPlayer.getServerName())) && i < server.getQueue().size()) { + if(nextPlayer != null) { // Remove them if they are already in the server + server.removePlayer(nextQueuePlayer); + } else { + i++; + } + nextQueuePlayer = server.getQueue().get(i); + nextPlayer = nextQueuePlayer.getPlayer(); + } + + if(nextPlayer == null) continue; // None of the players in the queue are online + + if(!server.canAccess(nextPlayer)) continue; + + if(server.isFull() && !nextPlayer.hasPermission("ajqueue.joinfull")) continue; + + if(main.getConfig().getBoolean("enable-bypasspaused-permission")) { + if(server.isPaused() && !nextPlayer.hasPermission("ajqueue.bypasspaused")) continue; + } else if(server.isPaused()) { continue; } + + + int tries = sendingAttempts.get(nextQueuePlayer) == null ? 0 : sendingAttempts.get(nextQueuePlayer); + int maxTries = main.getConfig().getInt("max-tries"); + if(tries >= maxTries && maxTries > 0) { + server.removePlayer(nextQueuePlayer); + sendingAttempts.remove(nextQueuePlayer); + nextPlayer.sendMessage(msgs.getComponent("max-tries-reached", "SERVER:"+server.getAlias())); + continue; + } + tries++; + sendingAttempts.put(nextQueuePlayer, tries); + + if(!sendingNowAntiSpam.containsKey(nextPlayer)) { + sendingNowAntiSpam.put(nextPlayer, (long) 0); + } + if(System.currentTimeMillis() - sendingNowAntiSpam.get(nextPlayer) >= 5000) { + nextPlayer.sendMessage(msgs.getComponent("status.sending-now", "SERVER:"+server.getAlias())); + sendingNowAntiSpam.put(nextPlayer, System.currentTimeMillis()); + } + + AdaptedServer selected = server.getIdealServer(nextPlayer); + if(selected == null) { + main.getLogger().severe("Could not find ideal server for server/group '"+server.getName()+"'"); + continue; + } + nextPlayer.connect(selected); + } } @Override public ImmutableList findPlayerInQueues(AdaptedPlayer p) { - return null; + List srs = new ArrayList<>(); + for(QueueServer s : servers) { + QueuePlayer player = s.findPlayer(p); + if(player != null) { + srs.add(player); + } + } + return ImmutableList.copyOf(srs); } @Override public ImmutableList getPlayerQueues(AdaptedPlayer p) { - return null; + List srs = new ArrayList<>(); + for(QueueServer s : servers) { + QueuePlayer player = s.findPlayer(p); + if(player != null) { + srs.add(s); + } + } + return ImmutableList.copyOf(srs); } } diff --git a/common/src/main/java/us/ajg0702/queue/common/ServerBuilder.java b/common/src/main/java/us/ajg0702/queue/common/ServerBuilder.java deleted file mode 100644 index bfc03dd..0000000 --- a/common/src/main/java/us/ajg0702/queue/common/ServerBuilder.java +++ /dev/null @@ -1,9 +0,0 @@ -package us.ajg0702.queue.common; - -import us.ajg0702.queue.api.queues.QueueServer; - -import java.util.List; - -public interface ServerBuilder { - List getServers(); -} diff --git a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java index 523a623..24e27de 100644 --- a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java @@ -50,7 +50,7 @@ public class QueuePlayerImpl implements QueuePlayer { @Override public void setPlayer(AdaptedPlayer player) { - if(!player.getUniqueId().equals(getUniqueId())) { + if(player != null && !player.getUniqueId().equals(getUniqueId())) { throw new IllegalArgumentException("UUIDs do not match"); } this.player = player; diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java new file mode 100644 index 0000000..d60f2c6 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -0,0 +1,197 @@ +package us.ajg0702.queue.common.queues; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.*; + +public class QueueServerImpl implements QueueServer { + + public QueueServerImpl(QueueMain main, AdaptedServer server) { + this(main, Collections.singletonList(server)); + } + + public QueueServerImpl(QueueMain main, List servers) { + this.servers = servers; + this.main = main; + } + + QueueMain main; + + private List servers; + + private final List queue = new ArrayList<>(); + + @Override + public ImmutableList getQueue() { + return ImmutableList.copyOf(queue); + } + + @Override + public String getStatusString(AdaptedPlayer p) { + Messages msgs = main.getMessages(); + + if(getOfflineTime() > main.getConfig().getInt("offline-time")) { + return msgs.getString("status.offline.offline"); + } + + if(!isOnline()) { + return msgs.getString("status.offline.restarting"); + } + + if(isPaused()) { + return msgs.getString("status.offline.paused"); + } + + if(isFull()) { + return msgs.getString("status.offline.full"); + } + + if(p != null && !canAccess(p)) { + return msgs.getString("status.offline.restricted"); + } + + + return "online"; + } + + @Override + public String getStatusString() { + return getStatusString(null); + } + + @Override + public void updatePing() { + + } + + @Override + public int getOfflineTime() { + return 0; + } + + @Override + public int getLastSentTime() { + return 0; + } + + @Override + public boolean isWhitelisted() { + return false; + } + + @Override + public void setWhitelisted(boolean whitelisted) { + + } + + @Override + public ImmutableList getWhitelistedPlayers() { + return null; + } + + @Override + public void setWhitelistedPlayers(List whitelistedPlayers) { + + } + + @Override + public boolean isJoinable(AdaptedPlayer p) { + return false; + } + + @Override + public void setPaused(boolean paused) { + + } + + @Override + public boolean isPaused() { + return false; + } + + @Override + public boolean isOnline() { + return false; + } + + @Override + public boolean justWentOnline() { + return false; + } + + @Override + public boolean isFull() { + return false; + } + + @Override + public void removePlayer(QueuePlayer player) { + + } + + @Override + public void removePlayer(AdaptedPlayer player) { + + } + + @Override + public void addPlayer(QueuePlayer player) { + + } + + @Override + public void addPlayer(QueuePlayer player, int position) { + + } + + @Override + public void sendPlayer() { + + } + + @Override + public String getName() { + return null; + } + + @Override + public boolean canAccess(AdaptedPlayer ply) { + return false; + } + + @Override + public String getAlias() { + return null; + } + + @Override + public ImmutableList getServers() { + return null; + } + + @Override + public ImmutableList getServerNames() { + return null; + } + + @Override + public boolean isGroup() { + return false; + } + + @Override + public QueuePlayer findPlayer(AdaptedPlayer player) { + return null; + } + + @Override + public AdaptedServer getIdealServer(AdaptedPlayer player) { + return null; + } +} From 18d0c72b89d35c8c0e67253969cf11010d3082b9 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 8 Jul 2021 10:29:06 -0700 Subject: [PATCH 10/56] Common should be done --- .../ajg0702/queue/api/queues/QueueServer.java | 15 +- .../queue/api/server/AdaptedServer.java | 6 + .../us/ajg0702/queue/common/QueueMain.java | 10 +- .../queue/common/queues/QueueServerImpl.java | 218 +++++++++++++++--- 4 files changed, 211 insertions(+), 38 deletions(-) diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java index 1fd4f0e..c0453a3 100644 --- a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -4,7 +4,9 @@ import com.google.common.collect.ImmutableList; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.api.server.AdaptedServerPing; +import java.util.HashMap; import java.util.List; import java.util.UUID; @@ -48,7 +50,7 @@ public interface QueueServer { * Gets how long since the last person was sent * @return The number of miliseconds since the last person was sent */ - int getLastSentTime(); + long getLastSentTime(); @@ -190,8 +192,19 @@ public interface QueueServer { QueuePlayer findPlayer(AdaptedPlayer player); + /** + * Gets the most ideal server in this group to join + * @param player The player that would be joining + * @return The ideal server to join + */ AdaptedServer getIdealServer(AdaptedPlayer player); + /** + * Gets the last server pings + * @return The last server pings for this server/group + */ + HashMap getLastPings(); + /** * elliot is bad diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java index dfa7b4b..4d311ca 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java @@ -12,6 +12,12 @@ public interface AdaptedServer { */ AdaptedServerInfo getServerInfo(); + /** + * Gets the server's name + * @return the server's name + */ + String getName(); + /** * Pings the server and gets info back * @return A CompletableFuture with the ServerPing diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 4b635b1..e9e8c6e 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -1,9 +1,6 @@ package us.ajg0702.queue.common; -import us.ajg0702.queue.api.AliasManager; -import us.ajg0702.queue.api.Logic; -import us.ajg0702.queue.api.PlatformMethods; -import us.ajg0702.queue.api.ServerBuilder; +import us.ajg0702.queue.api.*; import us.ajg0702.utils.common.Config; import us.ajg0702.utils.common.Messages; @@ -55,4 +52,9 @@ public class QueueMain { public ServerBuilder getServerBuilder() { return serverBuilder; } + + private QueueManager queueManager; + public QueueManager getQueueManager() { + return queueManager; + } } diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index d60f2c6..c24e9b4 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -5,28 +5,62 @@ import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.api.server.AdaptedServerInfo; +import us.ajg0702.queue.api.server.AdaptedServerPing; import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.GenUtils; import us.ajg0702.utils.common.Messages; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; public class QueueServerImpl implements QueueServer { - public QueueServerImpl(QueueMain main, AdaptedServer server) { - this(main, Collections.singletonList(server)); + private final String name; + + public QueueServerImpl(String name, QueueMain main, AdaptedServer server) { + this(name, main, Collections.singletonList(server)); } - public QueueServerImpl(QueueMain main, List servers) { + public QueueServerImpl(String name, QueueMain main, List servers) { + this.name = name; this.servers = servers; this.main = main; } - QueueMain main; + private final QueueMain main; - private List servers; + private HashMap pings = new HashMap<>(); + + private final List servers; private final List queue = new ArrayList<>(); + + private int playerCount; + private int maxPlayers; + + private boolean online; + + private boolean paused; + + + private long lastUpdate = 0; + + private int offlineTime = 0; + + private long lastSentTime = 0; + + private long lastOffline; + + + boolean whitelisted = false; + List whitelistedUUIDs = new ArrayList<>(); + + @Override public ImmutableList getQueue() { return ImmutableList.copyOf(queue); @@ -67,131 +101,249 @@ public class QueueServerImpl implements QueueServer { @Override public void updatePing() { + HashMap> pingsFutures = new HashMap<>(); + for(AdaptedServer server : servers) { + if(main.getConfig().getBoolean("pinger-debug")) { + main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] sending ping"); + } + pingsFutures.put(server, server.ping()); + } + int i = 0; + for(AdaptedServer server : pingsFutures.keySet()) { + CompletableFuture futurePing = pingsFutures.get(server); + AdaptedServerPing ping = null; + try { + ping = futurePing.get(5, TimeUnit.SECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + if(main.getConfig().getBoolean("pinger-debug")) { + main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] sending ping"); + } + } + + pings.put(server, ping); + i++; + if(i == servers.size()) { + int onlineCount = 0; + playerCount = 0; + maxPlayers = 0; + for(AdaptedServer pingedServer : pings.keySet()) { + AdaptedServerPing serverPing = pings.get(pingedServer); + if(serverPing == null) { + continue; + } + onlineCount++; + playerCount += serverPing.getPlayerCount(); + maxPlayers += serverPing.getMaxPlayers(); + } + online = onlineCount > 0; + + if(lastUpdate == -1) { + lastUpdate = System.currentTimeMillis(); + offlineTime = 0; + } else { + int timesincelast = (int) Math.round((System.currentTimeMillis() - lastUpdate*1.0)/1000); + lastUpdate = System.currentTimeMillis(); + if(!online) { + offlineTime += timesincelast; + } else { + offlineTime = 0; + } + } + } + } } @Override public int getOfflineTime() { - return 0; + return offlineTime; } @Override - public int getLastSentTime() { - return 0; + public long getLastSentTime() { + return lastSentTime; } @Override public boolean isWhitelisted() { - return false; + return whitelisted; } @Override public void setWhitelisted(boolean whitelisted) { - + this.whitelisted = whitelisted; } @Override public ImmutableList getWhitelistedPlayers() { - return null; + return ImmutableList.copyOf(whitelistedUUIDs); } @Override - public void setWhitelistedPlayers(List whitelistedPlayers) { - + public synchronized void setWhitelistedPlayers(List whitelistedPlayers) { + whitelistedUUIDs = whitelistedPlayers; } @Override public boolean isJoinable(AdaptedPlayer p) { - return false; + return (!whitelisted || whitelistedUUIDs.contains(p.getUniqueId())) && + this.isOnline() && + this.canAccess(p) && + !this.isFull() && + !this.isPaused(); } @Override - public void setPaused(boolean paused) { - + public synchronized void setPaused(boolean paused) { + this.paused = paused; } @Override public boolean isPaused() { - return false; + return paused; } @Override public boolean isOnline() { - return false; + if(System.currentTimeMillis()-lastOffline <= (main.getConfig().getInt("wait-after-online")*1000) && online) { + return false; + } + if(!online) { + lastOffline = System.currentTimeMillis(); + } + return online; } @Override public boolean justWentOnline() { - return false; + return System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && online; } @Override public boolean isFull() { - return false; + return playerCount >= maxPlayers; } @Override - public void removePlayer(QueuePlayer player) { - + public synchronized void removePlayer(QueuePlayer player) { + queue.remove(player); } @Override public void removePlayer(AdaptedPlayer player) { - + QueuePlayer queuePlayer = findPlayer(player); + if(queuePlayer == null) return; + removePlayer(queuePlayer); } @Override - public void addPlayer(QueuePlayer player) { - + public synchronized void addPlayer(QueuePlayer player) { + addPlayer(player, -1); } @Override public void addPlayer(QueuePlayer player, int position) { - + if(!player.getQueueServer().equals(this) || queue.contains(player)) return; + if(position > 0) { + queue.add(position, player); + } else { + queue.add(player); + } } @Override public void sendPlayer() { - + main.getQueueManager().sendPlayers(this); } @Override public String getName() { - return null; + return name; } @Override public boolean canAccess(AdaptedPlayer ply) { + if(ply == null) return true; + for(AdaptedServer si : servers) { + if(si.canAccess(ply)) { + return true; + } + } return false; } @Override public String getAlias() { - return null; + return main.getAliasManager().getAlias(getName()); } @Override public ImmutableList getServers() { - return null; + return ImmutableList.copyOf(servers); } @Override public ImmutableList getServerNames() { - return null; + List names = new ArrayList<>(); + for(AdaptedServer server : servers) { + names.add(server.getName()); + } + return ImmutableList.copyOf(names); } @Override public boolean isGroup() { - return false; + return servers.size() > 1; } @Override public QueuePlayer findPlayer(AdaptedPlayer player) { + for(QueuePlayer queuePlayer : queue) { + AdaptedPlayer queuedPlayer = queuePlayer.getPlayer(); + if(queuedPlayer == null) continue; + if(queuedPlayer.getUniqueId().equals(player.getUniqueId())) { + return queuePlayer; + } + } return null; } @Override public AdaptedServer getIdealServer(AdaptedPlayer player) { - return null; + HashMap serverInfos = pings; + AdaptedServer selected = null; + int selectednum = 0; + if(serverInfos.keySet().size() == 1) { + selected = serverInfos.keySet().iterator().next(); + } else { + for(AdaptedServer si : serverInfos.keySet()) { + AdaptedServerPing sp = serverInfos.get(si); + if(sp == null) continue; + int online = sp.getPlayerCount(); + if(selected == null) { + selected = si; + selectednum = online; + continue; + } + if(selectednum > online && main.getQueueManager().findServer(si.getName()).isJoinable(player)) { + selected = si; + selectednum = online; + } + } + } + if(selected == null && serverInfos.size() > 0) { + selected = serverInfos.keySet().iterator().next(); + } + if(selected == null) { + main.getLogger().warning("Unable to find ideal server, using random server from group."); + int r = GenUtils.randomInt(0, getServers().size()-1); + selected = getServers().get(r); + } + return selected; + } + + @Override + public HashMap getLastPings() { + return new HashMap<>(pings); } } From 61e91587a6cecf336f6ddd5bb5b278ee1fedda64 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 9 Jul 2021 08:26:45 -0700 Subject: [PATCH 11/56] funny velocity version --- build.gradle.kts | 11 +-- common/build.gradle.kts | 2 +- platforms/velocity/build.gradle.kts | 67 +++++++++++++++++++ .../platforms/velocity/VelocityQueue.java | 8 +++ .../queue/platforms/velocity/test.java | 5 ++ settings.gradle.kts | 3 +- 6 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 platforms/velocity/build.gradle.kts create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/test.java diff --git a/build.gradle.kts b/build.gradle.kts index 57fe8bd..c55c9e3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,6 +18,8 @@ allprojects { reports.html.isEnabled = false reports.junitXml.isEnabled = false } + + } repositories { @@ -41,14 +43,7 @@ dependencies { } -tasks.withType { - include("**/*.yml") - filter( - "tokens" to mapOf( - "VERSION" to project.version.toString() - ) - ) -} + tasks.shadowJar { relocate("us.ajg0702.utils", "us.ajg0702.queue.utils") diff --git a/common/build.gradle.kts b/common/build.gradle.kts index b967a59..828b58d 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -3,7 +3,7 @@ plugins { `maven-publish` } -group = "us.ajg0702.queue.api" +group = "us.ajg0702.queue.common" repositories { mavenCentral() diff --git a/platforms/velocity/build.gradle.kts b/platforms/velocity/build.gradle.kts new file mode 100644 index 0000000..db7d679 --- /dev/null +++ b/platforms/velocity/build.gradle.kts @@ -0,0 +1,67 @@ +plugins { + `java-library` + `maven-publish` +} + +group = "us.ajg0702.queue.platforms.velocity" + +repositories { + mavenCentral() + maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://nexus.velocitypowered.com/repository/maven-public/") } +} + +dependencies { + compileOnly("net.kyori:adventure-api:4.8.1") + compileOnly("com.google.guava:guava:30.1.1-jre") + compileOnly("us.ajg0702:ajUtils:1.1.5") + + compileOnly("com.velocitypowered:velocity-api:3.0.0") + annotationProcessor("com.velocitypowered:velocity-api:3.0.0") + + implementation(project(":common")) +} + + +tasks.withType { + from(sourceSets.main.get().java.srcDirs) + filter( + "tokens" to mapOf( + "VERSION" to project.version.toString() + ) + ).into("$buildDir/src") +} + +tasks.jar { + exclude("**/*.java"); +} + +tasks.compileJava { + source = tasks.getByName("processResources").outputs.files.asFileTree; +} + + +publishing { + publications { + create("mavenJava") { + artifact(tasks["jar"]) + } + } + + repositories { + + val mavenUrl = "https://repo.ajg0702.us/releases" + + if(!System.getenv("REPO_TOKEN").isNullOrEmpty()) { + maven { + url = uri(mavenUrl) + name = "ajRepo" + + credentials { + username = "plugins" + password = System.getenv("REPO_TOKEN") + } + } + } + } +} \ No newline at end of file diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java new file mode 100644 index 0000000..8b4e502 --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -0,0 +1,8 @@ +package us.ajg0702.queue.platforms.velocity; + +import com.velocitypowered.api.plugin.Plugin; + +@Plugin(id = "ajqueue", name = "ajQueue", version = "@VERSION@") +public class VelocityQueue { + +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/test.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/test.java new file mode 100644 index 0000000..0d2cd51 --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/test.java @@ -0,0 +1,5 @@ +package us.ajg0702.queue.platforms.velocity; + +public class test { + public static int i = 0; +} diff --git a/settings.gradle.kts b/settings.gradle.kts index cac7c00..b9b6dcb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,5 @@ rootProject.name = "ajQueue" include(":api") -include(":common") \ No newline at end of file +include(":common") +include(":platforms:velocity") \ No newline at end of file From 7a6d97229aa3fe43e0f1977bcc47a2dca3b73832 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 9 Jul 2021 18:24:54 -0700 Subject: [PATCH 12/56] progress --- api/build.gradle.kts | 4 + .../us/ajg0702/queue/api/LogicGetter.java | 8 ++ .../us/ajg0702/queue/api/PlatformMethods.java | 5 +- .../queue/api/server/AdaptedServer.java | 3 +- .../queue/api/server/AdaptedServerInfo.java | 4 +- .../queue/api/server/AdaptedServerPing.java | 3 +- build.gradle.kts | 2 - common/build.gradle.kts | 4 +- .../us/ajg0702/queue/common/QueueMain.java | 90 +++++++++++++++++++ .../queue/common/QueueManagerImpl.java | 2 +- .../ajg0702/queue/logic/FreeAliasManager.java | 21 +++++ .../us/ajg0702/queue/logic/FreeLogic.java | 18 ++++ .../us/ajg0702/queue/logic/LogicGetter.java | 18 ++++ platforms/velocity/build.gradle.kts | 3 +- .../velocity/PlatformMethodImpl.java | 32 +++++++ .../platforms/velocity/ServerBuilderImpl.java | 34 +++++++ .../platforms/velocity/VelocityQueue.java | 42 ++++++++- .../velocity/players/VelocityPlayer.java | 68 ++++++++++++++ .../queue/platforms/velocity/test.java | 5 -- 19 files changed, 351 insertions(+), 15 deletions(-) create mode 100644 api/src/main/java/us/ajg0702/queue/api/LogicGetter.java create mode 100644 common/src/main/java/us/ajg0702/queue/logic/FreeAliasManager.java create mode 100644 common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java create mode 100644 common/src/main/java/us/ajg0702/queue/logic/LogicGetter.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/ServerBuilderImpl.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java delete mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/test.java diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 10b331c..a0dbbd3 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -7,11 +7,15 @@ group = "us.ajg0702.queue.api" repositories { mavenCentral() + + maven { url = uri("https://repo.ajg0702.us") } } dependencies { implementation("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") + + compileOnly("us.ajg0702:ajUtils:1.1.6") } publishing { diff --git a/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java b/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java new file mode 100644 index 0000000..292afed --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java @@ -0,0 +1,8 @@ +package us.ajg0702.queue.api; + +import us.ajg0702.utils.common.Config; + +public interface LogicGetter { + Logic constructLogic(); + AliasManager constructAliasManager(Config config); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index b6581bb..57b9a9a 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -1,6 +1,9 @@ package us.ajg0702.queue.api; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; public interface PlatformMethods { /** @@ -10,7 +13,7 @@ public interface PlatformMethods { * BungeeUtils.sendCustomData(p, "inqueue", "true"); * BungeeUtils.sendCustomData(p, "inqueueevent", "true"); */ - void sendJoinQueueChannelMessages(); + void sendJoinQueueChannelMessages(QueueServer queueServer, QueuePlayer queuePlayer); /** * Sends a plugin message on the plugin messaging channel diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java index 4d311ca..a2f59a3 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java @@ -1,10 +1,11 @@ package us.ajg0702.queue.api.server; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.util.Handle; import java.util.concurrent.CompletableFuture; -public interface AdaptedServer { +public interface AdaptedServer extends Handle { /** * Gets the ServerInfo for this server diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerInfo.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerInfo.java index 81be1bb..3c04b42 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerInfo.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerInfo.java @@ -1,6 +1,8 @@ package us.ajg0702.queue.api.server; -public interface AdaptedServerInfo { +import us.ajg0702.queue.api.util.Handle; + +public interface AdaptedServerInfo extends Handle { /** * Gets the name of the server diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java index 1ed42e2..6a72b5f 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java @@ -1,8 +1,9 @@ package us.ajg0702.queue.api.server; import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.util.Handle; -public interface AdaptedServerPing { +public interface AdaptedServerPing extends Handle { /** * Gets the component of the description (aka MOTD) * @return A compoent of the description diff --git a/build.gradle.kts b/build.gradle.kts index c55c9e3..d51fff1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,8 +38,6 @@ repositories { dependencies { testImplementation("junit:junit:4.12") - - implementation(project(":common")) } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 828b58d..bc64320 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -13,7 +13,9 @@ repositories { dependencies { compileOnly("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.5") + compileOnly("us.ajg0702:ajUtils:1.1.6") + + compileOnly("org.spongepowered:configurate-yaml:4.0.0") implementation(project(":api")) } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index e9e8c6e..787ef2a 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -1,9 +1,12 @@ package us.ajg0702.queue.common; +import org.spongepowered.configurate.ConfigurateException; import us.ajg0702.queue.api.*; import us.ajg0702.utils.common.Config; import us.ajg0702.utils.common.Messages; +import java.io.File; +import java.util.LinkedHashMap; import java.util.logging.Logger; public class QueueMain { @@ -57,4 +60,91 @@ public class QueueMain { public QueueManager getQueueManager() { return queueManager; } + + + public QueueMain(Logger logger, ServerBuilder serverBuilder, PlatformMethods platformMethods, File dataFolder) { + this.logger = logger; + this.serverBuilder = serverBuilder; + this.platformMethods = platformMethods; + + try { + config = new Config(dataFolder, logger); + } catch (ConfigurateException e) { + logger.warning("Unable to load config:"); + e.printStackTrace(); + return; + } + + timeBetweenPlayers = config.getDouble("wait-time"); + + queueManager = new QueueManagerImpl(this); + + + LinkedHashMap d = new LinkedHashMap<>(); + + d.put("status.offline.base", "&c{SERVER} is {STATUS}. &7You are in position &f{POS}&7 of &f{LEN}&7."); + + d.put("status.offline.offline", "offline"); + d.put("status.offline.restarting", "restarting"); + d.put("status.offline.full", "full"); + d.put("status.offline.restricted", "restricted"); + d.put("status.offline.paused", "paused"); + + d.put("status.online.base", "&7You are in position &f{POS}&7 of &f{LEN}&7. Estimated time: {TIME}"); + d.put("status.left-last-queue", "&aYou left the last queue you were in."); + d.put("status.now-in-queue", "&aYou are now queued for {SERVER}! &7You are in position &f{POS}&7 of &f{LEN}&7.\n&7Type &f/leavequeue&7 or &fclick here&7 to leave the queue!"); + d.put("status.now-in-empty-queue", ""); + d.put("status.sending-now", "&aSending you to &f{SERVER} &anow.."); + + d.put("errors.server-not-exist", "&cThe server {SERVER} does not exist!"); + d.put("errors.already-queued", "&cYou are already queued for that server!"); + d.put("errors.player-only", "&cThis command can only be executed as a player!"); + d.put("errors.already-connected", "&cYou are already connected to this server!"); + d.put("errors.cant-join-paused", "&cYou cannot join the queue for {SERVER} because it is paused."); + d.put("errors.deny-joining-from-server", "&cYou are not allowed to join queues from this server!"); + + d.put("commands.leave-queue", "&aYou left the queue for {SERVER}!"); + d.put("commands.reload", "&aConfig and messages reloaded successfully!"); + d.put("commands.joinqueue.usage", "&cUsage: /joinqueue "); + + d.put("noperm", "&cYou do not have permission to do this!"); + + d.put("format.time.mins", "{m}m {s}s"); + d.put("format.time.secs", "{s} seconds"); + + d.put("list.format", "&b{SERVER} &7({COUNT}): {LIST}"); + d.put("list.playerlist", "&9{NAME}&7, "); + d.put("list.total", "&7Total players in queues: &f{TOTAL}"); + d.put("list.none", "&7None"); + + d.put("spigot.actionbar.online", "&7You are queued for &f{SERVER}&7. You are in position &f{POS}&7 of &f{LEN}&7. Estimated time: {TIME}"); + d.put("spigot.actionbar.offline", "&7You are queued for &f{SERVER}&7. &7You are in position &f{POS}&7 of &f{LEN}&7."); + + d.put("send", "&aAdded &f{PLAYER}&a to the queue for &f{SERVER}"); + d.put("remove", "&aRemoved &f{PLAYER} from all queues they were in."); + + d.put("placeholders.queued.none", "None"); + d.put("placeholders.position.none", "None"); + + d.put("commands.leave.more-args", "&cPlease specify which queue you want to leave! &7You are in these queues: {QUEUES}"); + d.put("commands.leave.queues-list-format", "&f{NAME}&7, "); + d.put("commands.leave.not-queued", "&cYou are not queued for that server! &7You are in these queues: {QUEUES}"); + d.put("commands.leave.no-queues", "&cYou are not queued!"); + + d.put("commands.pause.more-args", "&cUsage: /ajqueue pause [on/off]"); + d.put("commands.pause.no-server", "&cThat server does not exist!"); + d.put("commands.pause.success", "&aThe queue for &f{SERVER} &ais now {PAUSED}"); + d.put("commands.pause.paused.true", "&epaused"); + d.put("commands.pause.paused.false", "&aun-paused"); + + d.put("commands.send.player-not-found", "&cThat player could not be found. Make sure they are online!"); + + d.put("commands.listqueues.header", "&9Queues:"); + d.put("commands.listqueues.format", "{COLOR}{NAME}&7: {COUNT} queued"); + + d.put("max-tries-reached", "&cUnable to connect to {SERVER}. Max retries reached."); + d.put("auto-queued", "&aYou've been auto-queued for {SERVER} because you were kicked."); + + messages = new Messages(dataFolder, logger, d); + } } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 1298bf2..283d27d 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -115,7 +115,7 @@ public class QueueManagerImpl implements QueueManager { )); } - main.getPlatformMethods().sendJoinQueueChannelMessages(); + main.getPlatformMethods().sendJoinQueueChannelMessages(server, queuePlayer); return true; } diff --git a/common/src/main/java/us/ajg0702/queue/logic/FreeAliasManager.java b/common/src/main/java/us/ajg0702/queue/logic/FreeAliasManager.java new file mode 100644 index 0000000..3ef538e --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeAliasManager.java @@ -0,0 +1,21 @@ +package us.ajg0702.queue.logic; + +import us.ajg0702.queue.api.AliasManager; +import us.ajg0702.utils.common.Config; + +public class FreeAliasManager implements AliasManager { + Config config; + public FreeAliasManager(Config config) { + this.config = config; + } + + @Override + public String getAlias(String server) { + return server; + } + + @Override + public String getServer(String alias) { + return alias; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java new file mode 100644 index 0000000..247b742 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java @@ -0,0 +1,18 @@ +package us.ajg0702.queue.logic; + +import us.ajg0702.queue.api.Logic; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; + +public class FreeLogic implements Logic { + @Override + public boolean isPremium() { + return false; + } + + @Override + public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) { + return null; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/logic/LogicGetter.java b/common/src/main/java/us/ajg0702/queue/logic/LogicGetter.java new file mode 100644 index 0000000..9bf6f83 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/logic/LogicGetter.java @@ -0,0 +1,18 @@ +package us.ajg0702.queue.logic; + +import us.ajg0702.queue.api.AliasManager; +import us.ajg0702.queue.api.Logic; +import us.ajg0702.utils.common.Config; + +public class LogicGetter implements us.ajg0702.queue.api.LogicGetter { + + @Override + public Logic constructLogic() { + return new FreeLogic(); + } + + @Override + public AliasManager constructAliasManager(Config config) { + return new FreeAliasManager(config); + } +} diff --git a/platforms/velocity/build.gradle.kts b/platforms/velocity/build.gradle.kts index db7d679..8d081fd 100644 --- a/platforms/velocity/build.gradle.kts +++ b/platforms/velocity/build.gradle.kts @@ -14,12 +14,13 @@ repositories { dependencies { compileOnly("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.5") + compileOnly("us.ajg0702:ajUtils:1.1.6") compileOnly("com.velocitypowered:velocity-api:3.0.0") annotationProcessor("com.velocitypowered:velocity-api:3.0.0") implementation(project(":common")) + implementation(project(":api")) } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java new file mode 100644 index 0000000..86f20ae --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java @@ -0,0 +1,32 @@ +package us.ajg0702.queue.platforms.velocity; + +import com.velocitypowered.api.proxy.ProxyServer; +import us.ajg0702.queue.api.PlatformMethods; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; + +import java.util.logging.Logger; + +public class PlatformMethodImpl implements PlatformMethods { + + ProxyServer proxyServer; + Logger logger; + + public PlatformMethodImpl(ProxyServer proxyServer, Logger logger) { + this.proxyServer = proxyServer; + this.logger = logger; + } + + @Override + public void sendJoinQueueChannelMessages(QueueServer queueServer, QueuePlayer queuePlayer) { + AdaptedPlayer player = queuePlayer.getPlayer(); + if(player == null) return; + + } + + @Override + public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) { + + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/ServerBuilderImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/ServerBuilderImpl.java new file mode 100644 index 0000000..8a0a4a2 --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/ServerBuilderImpl.java @@ -0,0 +1,34 @@ +package us.ajg0702.queue.platforms.velocity; + +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.server.RegisteredServer; +import us.ajg0702.queue.api.ServerBuilder; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class ServerBuilderImpl implements ServerBuilder { + + private final ProxyServer proxyServer; + public ServerBuilderImpl(ProxyServer proxyServer) { + this.proxyServer = proxyServer; + } + + @Override + public List getServers() { + List result = new ArrayList<>(); + Collection servers = proxyServer.getAllServers(); + + + + return result; + } + + @Override + public QueueServer buildGroup(String name, List servers) { + return null; + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 8b4e502..1349d40 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -1,8 +1,48 @@ package us.ajg0702.queue.platforms.velocity; +import com.google.inject.Inject; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.proxy.ProxyServer; +import us.ajg0702.queue.common.QueueMain; + +import java.io.File; +import java.nio.file.Path; +import java.util.logging.Logger; + +@Plugin( + id = "ajqueue", + name = "ajQueue", + version = "@VERSION@", + url = "https://ajg0702.us", + description = "Queue for servers", + authors = {"ajgeiss0702"} +) -@Plugin(id = "ajqueue", name = "ajQueue", version = "@VERSION@") public class VelocityQueue { + ProxyServer proxyServer; + Logger logger; + QueueMain main; + + File dataFolder; + + @Inject + public VelocityQueue(ProxyServer proxyServer, Logger logger, Path dataFolder) { + this.proxyServer = proxyServer; + this.logger = logger; + + this.dataFolder = dataFolder.toFile(); + } + + @Subscribe + public void onProxyInit(ProxyInitializeEvent e) { + main = new QueueMain( + logger, + new ServerBuilderImpl(proxyServer), + new PlatformMethodImpl(proxyServer, logger), + dataFolder + ); + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java new file mode 100644 index 0000000..9e21eda --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -0,0 +1,68 @@ +package us.ajg0702.queue.platforms.velocity.players; + +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ServerConnection; +import com.velocitypowered.api.proxy.server.RegisteredServer; +import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; + +import java.util.Optional; +import java.util.UUID; + +public class VelocityPlayer implements AdaptedPlayer { + + Player handle; + + public VelocityPlayer(Player player) { + handle = player; + } + + @Override + public boolean isConnected() { + return handle.isActive(); + } + + @Override + public void sendMessage(Component message) { + handle.sendMessage(message); + } + + @Override + public void sendActionBar(Component message) { + handle.sendActionBar(message); + } + + @Override + public void sendMessage(String message) { + handle.sendMessage(Component.text().content(message)); + } + + @Override + public boolean hasPermission(String permission) { + return handle.hasPermission(permission); + } + + @Override + public String getServerName() { + Optional serverConnection = handle.getCurrentServer(); + if(!serverConnection.isPresent()) return "none"; + ServerConnection connection = serverConnection.get(); + return connection.getServerInfo().getName(); + } + + @Override + public UUID getUniqueId() { + return handle.getUniqueId(); + } + + @Override + public void connect(AdaptedServer server) { + handle.createConnectionRequest((RegisteredServer) server.getHandle()).connect(); + } + + @Override + public Player getHandle() { + return handle; + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/test.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/test.java deleted file mode 100644 index 0d2cd51..0000000 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/test.java +++ /dev/null @@ -1,5 +0,0 @@ -package us.ajg0702.queue.platforms.velocity; - -public class test { - public static int i = 0; -} From 7e9bdaaf275038b0cbdf85e89e97bfd46c8a069a Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 11 Jul 2021 16:09:38 -0700 Subject: [PATCH 13/56] lot of progress --- .../us/ajg0702/queue/api/PlatformMethods.java | 8 + .../queue/api/commands/IBaseCommand.java | 25 +++ .../queue/api/commands/ICommandSender.java | 9 + .../queue/api/commands/ISubCommand.java | 8 + .../queue/api/players/AdaptedPlayer.java | 3 +- .../queue/api/{ => server}/ServerBuilder.java | 7 +- .../ajg0702/queue/commands/BaseCommand.java | 59 ++++++ .../us/ajg0702/queue/commands/SubCommand.java | 7 + .../commands/commands/queue/QueueCommand.java | 82 +++++++++ .../us/ajg0702/queue/common/QueueMain.java | 46 ++++- .../queue/common/QueueManagerImpl.java | 31 +++- common/src/main/resources/config.yml | 174 ++++++++++++++++++ free/build.gradle.kts | 60 ++++++ platforms/velocity/build.gradle.kts | 1 + .../velocity/PlatformMethodImpl.java | 8 + .../platforms/velocity/ServerBuilderImpl.java | 34 ---- .../platforms/velocity/VelocityQueue.java | 26 ++- .../velocity/commands/VelocityCommand.java | 33 ++++ .../velocity/commands/VelocitySender.java | 30 +++ .../velocity/players/VelocityPlayer.java | 3 +- .../velocity/server/ServerBuilderImpl.java | 49 +++++ .../velocity/server/VelocityServer.java | 55 ++++++ .../velocity/server/VelocityServerInfo.java | 23 +++ .../velocity/server/VelocityServerPing.java | 45 +++++ settings.gradle.kts | 5 +- 25 files changed, 775 insertions(+), 56 deletions(-) create mode 100644 api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/commands/ICommandSender.java create mode 100644 api/src/main/java/us/ajg0702/queue/api/commands/ISubCommand.java rename api/src/main/java/us/ajg0702/queue/api/{ => server}/ServerBuilder.java (60%) create mode 100644 common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/SubCommand.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java create mode 100644 common/src/main/resources/config.yml create mode 100644 free/build.gradle.kts delete mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/ServerBuilderImpl.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerInfo.java create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index 57b9a9a..e363290 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -1,5 +1,6 @@ package us.ajg0702.queue.api; +import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; @@ -23,4 +24,11 @@ public interface PlatformMethods { */ void sendPluginMessage(AdaptedPlayer player, String channel, String... data); + /** + * Converts a command sender to an AdaptedPlayer + * @param sender the commandsender + * @return the AdaptedPlayer + */ + AdaptedPlayer senderToPlayer(ICommandSender sender); + } diff --git a/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java b/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java new file mode 100644 index 0000000..63fce9c --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java @@ -0,0 +1,25 @@ +package us.ajg0702.queue.api.commands; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.utils.common.Messages; + +import java.util.List; + +public interface IBaseCommand { + + String getName(); + + ImmutableList getAliases(); + + ImmutableList getSubCommands(); + + String getPermission(); + + Messages getMessages(); + + void addSubCommand(ISubCommand subCommand); + + void execute(ICommandSender ssender, String[] args); + + List autoComplete(ICommandSender sender, String[] args); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/commands/ICommandSender.java b/api/src/main/java/us/ajg0702/queue/api/commands/ICommandSender.java new file mode 100644 index 0000000..9bc925a --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/commands/ICommandSender.java @@ -0,0 +1,9 @@ +package us.ajg0702.queue.api.commands; + +import net.kyori.adventure.audience.Audience; +import us.ajg0702.queue.api.util.Handle; + +public interface ICommandSender extends Handle, Audience { + boolean hasPermission(String permission); + boolean isPlayer(); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/commands/ISubCommand.java b/api/src/main/java/us/ajg0702/queue/api/commands/ISubCommand.java new file mode 100644 index 0000000..6948fdb --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/commands/ISubCommand.java @@ -0,0 +1,8 @@ +package us.ajg0702.queue.api.commands; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +public interface ISubCommand extends IBaseCommand { +} diff --git a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java index 2db0e3b..9a55d32 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java @@ -1,5 +1,6 @@ package us.ajg0702.queue.api.players; +import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.util.Handle; @@ -9,7 +10,7 @@ import java.util.UUID; /** * Represents a cross-platform player */ -public interface AdaptedPlayer extends Handle { +public interface AdaptedPlayer extends Handle, Audience { /** * Check if the plauer is currently connected diff --git a/api/src/main/java/us/ajg0702/queue/api/ServerBuilder.java b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java similarity index 60% rename from api/src/main/java/us/ajg0702/queue/api/ServerBuilder.java rename to api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java index 178d05a..e63975c 100644 --- a/api/src/main/java/us/ajg0702/queue/api/ServerBuilder.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java @@ -1,12 +1,13 @@ -package us.ajg0702.queue.api; +package us.ajg0702.queue.api.server; import us.ajg0702.queue.api.queues.QueueServer; -import us.ajg0702.queue.api.server.AdaptedServer; import java.util.List; public interface ServerBuilder { - List getServers(); + List buildServers(); + + AdaptedServer getServer(String name); QueueServer buildGroup(String name, List servers); } diff --git a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java new file mode 100644 index 0000000..e9e196c --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java @@ -0,0 +1,59 @@ +package us.ajg0702.queue.commands; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.commands.IBaseCommand; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.commands.ISubCommand; +import us.ajg0702.utils.common.Messages; + +import java.util.List; + +public class BaseCommand implements IBaseCommand { + @Override + public String getName() { + return null; + } + + @Override + public ImmutableList getAliases() { + return null; + } + + @Override + public ImmutableList getSubCommands() { + return null; + } + + @Override + public String getPermission() { + return null; + } + + @Override + public Messages getMessages() { + return null; + } + + @Override + public void addSubCommand(ISubCommand subCommand) { + + } + + @Override + public void execute(ICommandSender sender, String[] args) { + + } + + public boolean checkPermission(ICommandSender sender) { + if(getPermission() != null && !sender.hasPermission(getPermission())) { + sender.sendMessage(getMessages().getComponent("noperm")); + return false; + } + return true; + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + return null; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/SubCommand.java b/common/src/main/java/us/ajg0702/queue/commands/SubCommand.java new file mode 100644 index 0000000..86e1cfa --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/SubCommand.java @@ -0,0 +1,7 @@ +package us.ajg0702.queue.commands; + +import us.ajg0702.queue.api.commands.ISubCommand; + +public class SubCommand extends BaseCommand implements ISubCommand { + +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java new file mode 100644 index 0000000..7de09a9 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java @@ -0,0 +1,82 @@ +package us.ajg0702.queue.commands.commands.queue; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.commands.ISubCommand; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; + +public class QueueCommand extends BaseCommand { + + private final QueueMain main; + + public QueueCommand(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "queue"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of("move", "server", "joinqueue", "joinq"); + } + + @Override + public ImmutableList getSubCommands() { + return ImmutableList.builder().build(); + } + + @Override + public String getPermission() { + return null; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void addSubCommand(ISubCommand subCommand) { + + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + if(!sender.isPlayer()) { + sender.sendMessage(getMessages().getComponent("errors.player-only")); + return; + } + AdaptedPlayer player = main.getPlatformMethods().senderToPlayer(sender); + + if(args.length > 0) { + if(main.getConfig().getBoolean("require-permission") && !player.hasPermission("ajqueue.queue."+args[0])) { + sender.sendMessage(getMessages().getComponent("noperm")); + return; + } + main.getQueueManager().addToQueue(player, args[0]); + } else { + sender.sendMessage(getMessages().getComponent("commands.joinqueue.usage")); + } + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + if(!main.getConfig().getBoolean("tab-complete-queues")) { + return new ArrayList<>(); + } + if(args.length == 1) { + return main.getQueueManager().getServerNames(); + } + return new ArrayList<>(); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 787ef2a..fa4593c 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -1,12 +1,20 @@ package us.ajg0702.queue.common; import org.spongepowered.configurate.ConfigurateException; -import us.ajg0702.queue.api.*; +import us.ajg0702.queue.api.AliasManager; +import us.ajg0702.queue.api.Logic; +import us.ajg0702.queue.api.PlatformMethods; +import us.ajg0702.queue.api.QueueManager; +import us.ajg0702.queue.api.server.ServerBuilder; +import us.ajg0702.queue.logic.LogicGetter; import us.ajg0702.utils.common.Config; import us.ajg0702.utils.common.Messages; import java.io.File; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.logging.Logger; public class QueueMain { @@ -41,20 +49,36 @@ public class QueueMain { return getLogic().isPremium(); } - private PlatformMethods platformMethods; + private final PlatformMethods platformMethods; public PlatformMethods getPlatformMethods() { return platformMethods; } - private Logger logger; + private final Logger logger; public Logger getLogger() { return logger; } + private List> serverCompletableFutures = new ArrayList<>(); private ServerBuilder serverBuilder; public ServerBuilder getServerBuilder() { return serverBuilder; } + public CompletableFuture getFutureServerBuilder() { + CompletableFuture completableFuture = new CompletableFuture<>(); + if(serverBuilder != null) { + completableFuture.complete(serverBuilder); + } + serverCompletableFutures.add(completableFuture); + return completableFuture; + } + public void setServerBuilder(ServerBuilder serverBuilder) { + if(this.serverBuilder != null) throw new IllegalStateException("SeverBuilder already set"); + this.serverBuilder = serverBuilder; + for(CompletableFuture future : serverCompletableFutures) { + future.complete(serverBuilder); + } + } private QueueManager queueManager; public QueueManager getQueueManager() { @@ -62,10 +86,15 @@ public class QueueMain { } - public QueueMain(Logger logger, ServerBuilder serverBuilder, PlatformMethods platformMethods, File dataFolder) { + private File dataFolder; + + + public QueueMain(Logger logger, PlatformMethods platformMethods, File dataFolder) { this.logger = logger; - this.serverBuilder = serverBuilder; this.platformMethods = platformMethods; + this.dataFolder = dataFolder; + + constructMessages(); try { config = new Config(dataFolder, logger); @@ -79,7 +108,14 @@ public class QueueMain { queueManager = new QueueManagerImpl(this); + logic = new LogicGetter().constructLogic(); + aliasManager = new LogicGetter().constructAliasManager(config); + + + } + + private void constructMessages() { LinkedHashMap d = new LinkedHashMap<>(); d.put("status.offline.base", "&c{SERVER} is {STATUS}. &7You are in position &f{POS}&7 of &f{LEN}&7."); diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 283d27d..807d7d6 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -6,13 +6,14 @@ import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; -import us.ajg0702.queue.api.server.AdaptedServerInfo; +import us.ajg0702.queue.api.server.ServerBuilder; import us.ajg0702.queue.common.players.QueuePlayerImpl; -import us.ajg0702.utils.bungee.BungeeUtils; import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.TimeUtils; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; public class QueueManagerImpl implements QueueManager { @@ -24,6 +25,16 @@ public class QueueManagerImpl implements QueueManager { public QueueManagerImpl(QueueMain main) { this.main = main; this.msgs = main.getMessages(); + + CompletableFuture serverBuilderFuture = main.getFutureServerBuilder(); + serverBuilderFuture.thenRunAsync(() -> { + try { + servers = serverBuilderFuture.get().buildServers(); + // TODO: groups + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + }); } @Override @@ -107,12 +118,14 @@ public class QueueManagerImpl implements QueueManager { "SERVER:"+server.getAlias())); } } else { - player.sendMessage(msgs.getComponent("status.now-in-queue", - "POS:"+pos, - "LEN:"+len, - "SERVER:"+server.getAlias(), - "SERVERNAME:"+server.getName() - )); + player.sendMessage( + msgs.getComponent("status.now-in-queue", + "POS:"+pos, + "LEN:"+len, + "SERVER:"+server.getAlias(), + "SERVERNAME:"+server.getName() + ) + ); } main.getPlatformMethods().sendJoinQueueChannelMessages(server, queuePlayer); @@ -167,7 +180,7 @@ public class QueueManagerImpl implements QueueManager { servers.clear(); - servers.addAll(main.getServerBuilder().getServers()); + servers.addAll(main.getServerBuilder().buildServers()); List groupsraw = main.getConfig().getStringList("server-groups"); for(String groupraw : groupsraw) { diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml new file mode 100644 index 0000000..318af36 --- /dev/null +++ b/common/src/main/resources/config.yml @@ -0,0 +1,174 @@ +# Dont touch this number please +config-version: 21 + +# The time the server will wait between sending people in the queue +# Default: 5 +wait-time: 5 + +# The time that a server has to be offline to be marked as offline instead of restarting +# Default: 120 +offline-time: 120 + +# The time the server will wait between sending players update messages on what position they are in the queue. +# Default: 10 +message-time: 10 + +# If a player is in a server, you can have the plugin make them automatically join a queue for another server +# Example with the default values: Player joins survivalqueue server, they will auto-join the queue for survival +queue-servers: + - 'survivalqueue:survival' + +# Should the plugin send an actionbar to the player? +# The actionbar contains some info such as which server they are queued for, what position they are in, estimated time remaining, etc. +send-actionbar: true + +# What kick reasons should cause the player to be removed from the queue? +# For example, if one of the below kick reasons is 'banned' and the player gets kicked when trying to connect to +# a server in a queue with a message saying "You are banned from this server!" then it will kick them from the queue too. +kick-reasons: + - 'banned' + - 'blacklisted' + + +# Should we remove a player from the queue if they move servers? +# If they join another queue, they will be removed from the previous one no matter what +# This is more meant for if you have multiple lobbies if you want to let the player switch +# between them without losing their queue position +# Default: false +remove-player-on-server-switch: false + + +# Should we wait until the server is done loading to load the servers? +# Enable this if you have a plugin that adds servers to the server list during startup. +# Default: false +wait-to-load-servers: false + +# How long should we wait after the server finishes loading to load the server list? +# Only works if the above is enabled. +# This is in miliseconds so 1000 = 1 second +# Default: 500 +wait-to-load-servers-delay: 500 + + +# How often (in seconds) we should check for new servers to add queues for. +# If you dynamicly add servers, set this to something other than 0. +# To disable, set to 0 +reload-servers-interval: 0 + + +# Should we require permissions for players to be able to join queues? +# If enabled, players will be required to have the permission ajqueue.queue. +# Default: false +require-permission: false + + +# Should we let players join more than one queue? +# If enabled, players will be able to be in multiple queues at once. +# Default: true +allow-multiple-queues: true + +# If the player is queued for multiple servers, which server should we pick to use in things like placeholders and actionbars +# Options are first and last +# Default: last +multi-server-queue-pick: last + + +# THIS FEATURE IS ONLY AVAILABLE ON ajQueuePlus (https://www.spigotmc.org/resources/ajqueueplus.79123/) +# This will show players a different name than the actual bungeecord server name +# for example, instead of showing players "event-a", this option can make it appear as "Event A" +# With this example, you would use this: - "event-a:Event A" +# Note that currently players still have to use the normal names in queue commands and leave commands +# Format: "realname:Alias" +server-aliases: + - "event-a:Event A" + + +# How long should we wait after a server is online before sending players? +# The server will still show up as offline or restarting until this amount of time after its up +# Meant to let your server 'cool down' after lag from starting up +# In seconds +# Default: 1 +wait-after-online: 1 + + +# This is for helping with finding issues with the server pinged +# This will spam the console when enabled +# When this enabled, if servers are offline then it will spam errors. You can ignore them. +# Default: false +pinger-debug: false + + +# When a queue is paused, should we prevent players from joining it? +# Default: false +prevent-joining-paused: false + +# When a server goes back online, should we send all players in the queue instantly? +# Default: false +send-all-when-back-online: false + +# Require a permission for players to be able to join a queue from a server +# If enabled, players will need the permission ajqueue.joinfrom. to join queues. +# Replace with the name of the server +# Default: false +joinfrom-server-permission: false + +# Server groups are a group of servers that you can queue for. It will send you to the server that is the least full. +# If all servers in the group are full, it will act the same as it would when a single server is full. +# Same if all servers are offline. It will only send players to servers that are online. +# Format: "groupname:server1,server2,etc" +server-groups: + - "lobbys:lobby-1,lobby-2,lobby-3" + + +# Should we allow tab-completing in the /queue command? +# Default: true +tab-complete-queues: true + +# Should we have no wait time for these servers? +# If the server is joinable, the plugin will attempt to send players who join these queues as soon as they join. +# If the server is not immidiatly joinable, they will have to wait for the normal wait-time +# This also works with group +# NOTE: Server names are caps sensitive +send-instantly: + - "lobbys" + +# Should we log to the bungeecord console when a player fails to get sent to a server from the queue? +# Enable this if you are having an issue with one player stopping the queue +# Default: false +send-fail-debug: false + +# After how many (unsuccessfull) attempts of sending the player should we remove them from the queue? +# Set to -1 to disable +# Default: 10 +max-tries: 10 + +# Should we enable the ajqueue.bypasspaused permission? +# If enabled, anyone with the permission ajqueue.bypasspaused will be able to join paused servers +# Default: false +enable-bypasspaused-permission: false + +# Should we check to make sure that people dont get sent quicker than wait-time? +# Default: true +check-last-player-sent-time: true + +# Should we send debug info to the console when priority queue is used? +# This will print several lines to the console when a player joins a queue, +# so you should probably only use this for debugging purposes +# Default: false +priority-queue-debug: false + +# When a player is kicked from a server, should we automatically add that player to the queue? +# You will still need to use another plugin to make sure the player doesnt get kicked from bungee completly. +# Default: false +auto-add-to-queue-on-kick: false +# The delay for the above option. +# In seconds, decimals supported. +auto-add-to-queue-on-kick-delay: 1 + +# With what kick reasons should we auto-add the player to the queue +# This wont work if auto-add-to-queue-on-kick is disabled. +# If you set it to [], then all kick messages will cause the player to be added to the queue +# This works on contains, so you dont have to include the whole kick message, just a few words. +auto-add-kick-reasons: + - "restarting" + - "closed" \ No newline at end of file diff --git a/free/build.gradle.kts b/free/build.gradle.kts new file mode 100644 index 0000000..18e58a2 --- /dev/null +++ b/free/build.gradle.kts @@ -0,0 +1,60 @@ +plugins { + `java-library` + id("com.github.johnrengelman.shadow") + `maven-publish` +} + +group = "us.ajg0702.queue" + +repositories { + mavenCentral() + maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } +} + +dependencies { + compileOnly("net.kyori:adventure-api:4.8.1") + compileOnly("com.google.guava:guava:30.1.1-jre") + compileOnly("org.spongepowered:configurate-yaml:4.0.0") + + implementation("us.ajg0702:ajUtils:1.1.6") + + //implementation("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT") + + implementation(project(":platforms:velocity")) +} + +tasks.shadowJar { + relocate("us.ajg0702.utils", "us.ajg0702.queue.libs.utils") + relocate("org.bstats", "us.ajg0702.queue.libs.bstats") + //relocate("net.kyori", "us.ajg0702.queue.libs.kyori") + relocate("io.leangen.geantyref", "us.ajg0702.queue.libs.geantyref") + relocate("org.spongepowered", "us.ajg0702.queue.libs.sponge") + relocate("org.yaml", "us.ajg0702.queue.libs.yaml") + archiveFileName.set("${baseName}-${version}.${extension}") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["jar"]) + } + } + + repositories { + + val mavenUrl = "https://repo.ajg0702.us/releases" + + if(!System.getenv("REPO_TOKEN").isNullOrEmpty()) { + maven { + url = uri(mavenUrl) + name = "ajRepo" + + credentials { + username = "plugins" + password = System.getenv("REPO_TOKEN") + } + } + } + } +} \ No newline at end of file diff --git a/platforms/velocity/build.gradle.kts b/platforms/velocity/build.gradle.kts index 8d081fd..074f234 100644 --- a/platforms/velocity/build.gradle.kts +++ b/platforms/velocity/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { compileOnly("com.velocitypowered:velocity-api:3.0.0") annotationProcessor("com.velocitypowered:velocity-api:3.0.0") + compileOnly("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT") implementation(project(":common")) implementation(project(":api")) diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java index 86f20ae..c1a0725 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java @@ -1,10 +1,13 @@ package us.ajg0702.queue.platforms.velocity; +import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import us.ajg0702.queue.api.PlatformMethods; +import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; import java.util.logging.Logger; @@ -29,4 +32,9 @@ public class PlatformMethodImpl implements PlatformMethods { public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) { } + + @Override + public AdaptedPlayer senderToPlayer(ICommandSender sender) { + return new VelocityPlayer((Player) sender.getHandle()); + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/ServerBuilderImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/ServerBuilderImpl.java deleted file mode 100644 index 8a0a4a2..0000000 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/ServerBuilderImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package us.ajg0702.queue.platforms.velocity; - -import com.velocitypowered.api.proxy.ProxyServer; -import com.velocitypowered.api.proxy.server.RegisteredServer; -import us.ajg0702.queue.api.ServerBuilder; -import us.ajg0702.queue.api.queues.QueueServer; -import us.ajg0702.queue.api.server.AdaptedServer; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public class ServerBuilderImpl implements ServerBuilder { - - private final ProxyServer proxyServer; - public ServerBuilderImpl(ProxyServer proxyServer) { - this.proxyServer = proxyServer; - } - - @Override - public List getServers() { - List result = new ArrayList<>(); - Collection servers = proxyServer.getAllServers(); - - - - return result; - } - - @Override - public QueueServer buildGroup(String name, List servers) { - return null; - } -} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 1349d40..a47e924 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -1,14 +1,22 @@ package us.ajg0702.queue.platforms.velocity; import com.google.inject.Inject; +import com.velocitypowered.api.command.CommandManager; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; +import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.commands.commands.queue.QueueCommand; import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.platforms.velocity.commands.VelocityCommand; +import us.ajg0702.queue.platforms.velocity.server.ServerBuilderImpl; import java.io.File; import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; import java.util.logging.Logger; @Plugin( @@ -29,7 +37,7 @@ public class VelocityQueue { File dataFolder; @Inject - public VelocityQueue(ProxyServer proxyServer, Logger logger, Path dataFolder) { + public VelocityQueue(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataFolder) { this.proxyServer = proxyServer; this.logger = logger; @@ -40,9 +48,23 @@ public class VelocityQueue { public void onProxyInit(ProxyInitializeEvent e) { main = new QueueMain( logger, - new ServerBuilderImpl(proxyServer), new PlatformMethodImpl(proxyServer, logger), dataFolder ); + main.setServerBuilder(new ServerBuilderImpl(main, proxyServer)); + + CommandManager commandManager = proxyServer.getCommandManager(); + + + List commands = Arrays.asList(new QueueCommand(main)); + + for(BaseCommand command : commands) { + commandManager.register( + commandManager.metaBuilder(command.getName()) + .aliases(command.getAliases().toArray(new String[]{})) + .build(), + new VelocityCommand(main, command) + ); + } } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java new file mode 100644 index 0000000..b52383b --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java @@ -0,0 +1,33 @@ +package us.ajg0702.queue.platforms.velocity.commands; + +import com.velocitypowered.api.command.RawCommand; +import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.common.QueueMain; + +import java.util.List; + +public class VelocityCommand implements RawCommand { + + QueueMain main; + BaseCommand command; + + public VelocityCommand(QueueMain main, BaseCommand command) { + this.main = main; + this.command = command; + } + + @Override + public void execute(Invocation invocation) { + command.execute(new VelocitySender(invocation.source()), invocation.arguments().split(" ")); + } + + @Override + public List suggest(final Invocation invocation) { + return command.autoComplete(new VelocitySender(invocation.source()), invocation.arguments().split(" ")); + } + + @Override + public boolean hasPermission(final Invocation invocation) { + return command.checkPermission(new VelocitySender(invocation.source())); + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java new file mode 100644 index 0000000..f6810bc --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java @@ -0,0 +1,30 @@ +package us.ajg0702.queue.platforms.velocity.commands; + +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.ConsoleCommandSource; +import com.velocitypowered.api.proxy.ProxyServer; +import us.ajg0702.queue.api.commands.ICommandSender; + +public class VelocitySender implements ICommandSender { + + CommandSource handle; + + public VelocitySender(CommandSource handle) { + this.handle = handle; + } + + @Override + public boolean hasPermission(String permission) { + return handle.hasPermission(permission); + } + + @Override + public boolean isPlayer() { + return !(handle instanceof ConsoleCommandSource); + } + + @Override + public CommandSource getHandle() { + return handle; + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java index 9e21eda..9fb40c5 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.platforms.velocity.players; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.server.RegisteredServer; +import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.server.AdaptedServer; @@ -10,7 +11,7 @@ import us.ajg0702.queue.api.server.AdaptedServer; import java.util.Optional; import java.util.UUID; -public class VelocityPlayer implements AdaptedPlayer { +public class VelocityPlayer implements AdaptedPlayer, Audience { Player handle; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java new file mode 100644 index 0000000..ae98f3d --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java @@ -0,0 +1,49 @@ +package us.ajg0702.queue.platforms.velocity.server; + +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.server.RegisteredServer; +import us.ajg0702.queue.api.server.ServerBuilder; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.common.queues.QueueServerImpl; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +public class ServerBuilderImpl implements ServerBuilder { + + private final ProxyServer proxyServer; + private final QueueMain main; + public ServerBuilderImpl(QueueMain main, ProxyServer proxyServer) { + this.proxyServer = proxyServer; + this.main = main; + } + + @Override + public List buildServers() { + List result = new ArrayList<>(); + Collection servers = proxyServer.getAllServers(); + + for(RegisteredServer server : servers) { + AdaptedServer adaptedServer = new VelocityServer(server); + result.add(new QueueServerImpl(adaptedServer.getName(), main, adaptedServer)); + } + + return result; + } + + @Override + public AdaptedServer getServer(String name) { + Optional serverOptional = proxyServer.getServer(name); + if(serverOptional.isEmpty()) return null; + return new VelocityServer(serverOptional.get()); + } + + @Override + public QueueServer buildGroup(String name, List servers) { + return new QueueServerImpl(name, main, servers); + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java new file mode 100644 index 0000000..f9f9cf5 --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java @@ -0,0 +1,55 @@ +package us.ajg0702.queue.platforms.velocity.server; + +import com.velocitypowered.api.proxy.server.RegisteredServer; +import com.velocitypowered.api.proxy.server.ServerPing; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.api.server.AdaptedServerInfo; +import us.ajg0702.queue.api.server.AdaptedServerPing; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +public class VelocityServer implements AdaptedServer { + + private final RegisteredServer handle; + public VelocityServer(RegisteredServer handle) { + this.handle = handle; + } + + @Override + public AdaptedServerInfo getServerInfo() { + return new VelocityServerInfo(handle.getServerInfo()); + } + + @Override + public String getName() { + return handle.getServerInfo().getName(); + } + + @Override + public CompletableFuture ping() { + CompletableFuture future = new CompletableFuture<>(); + CompletableFuture serverPing = handle.ping(); + serverPing.thenRunAsync(() -> { + AdaptedServerPing aPing = null; + try { + aPing = new VelocityServerPing(serverPing.get()); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + future.complete(aPing); + }); + return future; + } + + @Override + public boolean canAccess(AdaptedPlayer player) { + return true; + } + + @Override + public RegisteredServer getHandle() { + return handle; + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerInfo.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerInfo.java new file mode 100644 index 0000000..ad43026 --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerInfo.java @@ -0,0 +1,23 @@ +package us.ajg0702.queue.platforms.velocity.server; + +import com.velocitypowered.api.proxy.server.ServerInfo; +import us.ajg0702.queue.api.server.AdaptedServerInfo; + +public class VelocityServerInfo implements AdaptedServerInfo { + + private final ServerInfo handle; + + public VelocityServerInfo(ServerInfo handle) { + this.handle = handle; + } + + @Override + public String getName() { + return handle.getName(); + } + + @Override + public ServerInfo getHandle() { + return handle; + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java new file mode 100644 index 0000000..06c3b70 --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java @@ -0,0 +1,45 @@ +package us.ajg0702.queue.platforms.velocity.server; + +import com.velocitypowered.api.proxy.server.ServerPing; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import us.ajg0702.queue.api.server.AdaptedServerPing; + +import java.util.Optional; + +public class VelocityServerPing implements AdaptedServerPing { + + private final ServerPing handle; + public VelocityServerPing(ServerPing handle) { + this.handle = handle; + } + + @Override + public Component getDescriptionComponent() { + return handle.getDescriptionComponent(); + } + + @Override + public String getPlainDescription() { + return PlainTextComponentSerializer.plainText().serialize(handle.getDescriptionComponent()); + } + + @Override + public int getPlayerCount() { + Optional players = handle.getPlayers(); + if(players.isEmpty()) return 0; + return players.get().getOnline(); + } + + @Override + public int getMaxPlayers() { + Optional players = handle.getPlayers(); + if(players.isEmpty()) return 0; + return players.get().getMax(); + } + + @Override + public ServerPing getHandle() { + return handle; + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index b9b6dcb..68d5aae 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,4 +2,7 @@ rootProject.name = "ajQueue" include(":api") include(":common") -include(":platforms:velocity") \ No newline at end of file + +include(":platforms:velocity") + +include(":free") \ No newline at end of file From 80f9eb262d8d2399270ec644b2dd4cf11c9b5e48 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 11 Jul 2021 18:26:20 -0700 Subject: [PATCH 14/56] progress --- .../queue/api/commands/IBaseCommand.java | 2 +- .../commands/leavequeue/LeaveCommand.java | 126 ++++++++++++++++++ .../commands/manage/ManageCommand.java | 66 +++++++++ .../queue/common/QueueManagerImpl.java | 2 + .../platforms/velocity/VelocityQueue.java | 6 +- .../velocity/commands/VelocitySender.java | 6 + .../velocity/players/VelocityPlayer.java | 1 + .../velocity/server/ServerBuilderImpl.java | 2 +- .../velocity/server/VelocityServerPing.java | 4 +- 9 files changed, 210 insertions(+), 5 deletions(-) create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java diff --git a/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java b/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java index 63fce9c..ac0ad00 100644 --- a/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java +++ b/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java @@ -19,7 +19,7 @@ public interface IBaseCommand { void addSubCommand(ISubCommand subCommand); - void execute(ICommandSender ssender, String[] args); + void execute(ICommandSender sender, String[] args); List autoComplete(ICommandSender sender, String[] args); } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java new file mode 100644 index 0000000..8bff705 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java @@ -0,0 +1,126 @@ +package us.ajg0702.queue.commands.commands.leavequeue; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.commands.ISubCommand; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; + +public class LeaveCommand extends BaseCommand { + + + private final QueueMain main; + + public LeaveCommand(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "leavequeue"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of("leaveq"); + } + + @Override + public ImmutableList getSubCommands() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return null; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void addSubCommand(ISubCommand subCommand) { + + } + + @Override + public void execute(ICommandSender sender, String[] args) { + System.out.println("leave command"); + if(!sender.isPlayer()) { + System.out.println("not player"); + sender.sendMessage(getMessages().getComponent("errors.player-only")); + return; + } + System.out.println("player"); + AdaptedPlayer player = main.getPlatformMethods().senderToPlayer(sender); + List servers = main.getQueueManager().getPlayerQueues(player); + + if(servers.size() == 0) { + sender.sendMessage(getMessages().getComponent("commands.leave.no-queues")); + return; + } + + System.out.println("0"); + + if(servers.size() == 1) { + servers.get(0).removePlayer(player); + sender.sendMessage(getMessages().getComponent("commands.leave-queue", "SERVER:"+servers.get(0).getAlias())); + return; + } + + System.out.println("1"); + + if(args.length <= 0) { + sender.sendMessage(getMessages().getComponent("commands.leave.more-args", "QUEUES:"+getQueueList(servers))); + return; + } + + String leaving = args[0]; + QueueServer leavingServer = main.getQueueManager().findServer(leaving); + if(leavingServer == null) { + sender.sendMessage(getMessages().getComponent("commands.leave.not-queued", "QUEUES:"+getQueueList(servers))); + return; + } + QueuePlayer queuePlayer = leavingServer.findPlayer(player); + if(queuePlayer == null) { + sender.sendMessage(getMessages().getComponent("commands.leave.not-queued", "QUEUES:"+getQueueList(servers))); + return; + } + + System.out.println("2"); + + leavingServer.removePlayer(queuePlayer); + sender.sendMessage(getMessages().getComponent("commands.leave-queue", "SERVER:"+leavingServer.getAlias())); + + } + + private String getQueueList(List servers) { + StringBuilder queueList = new StringBuilder(); + for(QueueServer server : servers) { + queueList.append(getMessages().getString("commands.leave.queues-list-format").replaceAll("\\{NAME}", server.getName())); + } + if(queueList.length() > 2) { + queueList = new StringBuilder(queueList.substring(0, queueList.length() - 2)); + } + return queueList.toString(); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + List servers = main.getQueueManager().findPlayerInQueues(main.getPlatformMethods().senderToPlayer(sender)); + List serverNames = new ArrayList<>(); + for(QueuePlayer queuePlayer : servers) { + serverNames.add(queuePlayer.getQueueServer().getName()); + } + return serverNames; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java new file mode 100644 index 0000000..49413c9 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java @@ -0,0 +1,66 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.commands.ISubCommand; +import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; + +public class ManageCommand extends BaseCommand { + + QueueMain main; + + public ManageCommand(QueueMain main) { + this.main = main; + + + } + + + @Override + public String getName() { + return "ajqueue"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of("ajq"); + } + + List subCommands = new ArrayList<>(); + + @Override + public ImmutableList getSubCommands() { + return ImmutableList.copyOf(subCommands); + } + + @Override + public String getPermission() { + return "ajqueue.manage"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void addSubCommand(ISubCommand subCommand) { + subCommands.add(subCommand); + } + + @Override + public void execute(ICommandSender sender, String[] args) { + + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + return null; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 807d7d6..a2f9800 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -1,6 +1,8 @@ package us.ajg0702.queue.common; import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; import us.ajg0702.queue.api.QueueManager; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index a47e924..260b357 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -8,6 +8,7 @@ import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; import us.ajg0702.queue.commands.commands.queue.QueueCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.velocity.commands.VelocityCommand; @@ -56,7 +57,10 @@ public class VelocityQueue { CommandManager commandManager = proxyServer.getCommandManager(); - List commands = Arrays.asList(new QueueCommand(main)); + List commands = Arrays.asList( + new QueueCommand(main), + new LeaveCommand(main) + ); for(BaseCommand command : commands) { commandManager.register( diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java index f6810bc..3c9f92b 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.platforms.velocity.commands; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.ConsoleCommandSource; import com.velocitypowered.api.proxy.ProxyServer; +import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.ICommandSender; public class VelocitySender implements ICommandSender { @@ -23,6 +24,11 @@ public class VelocitySender implements ICommandSender { return !(handle instanceof ConsoleCommandSource); } + @Override + public void sendMessage(Component message) { + handle.sendMessage(message); + } + @Override public CommandSource getHandle() { return handle; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java index 9fb40c5..343def1 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -1,6 +1,7 @@ package us.ajg0702.queue.platforms.velocity.players; import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.server.RegisteredServer; import net.kyori.adventure.audience.Audience; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java index ae98f3d..aebd796 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java @@ -38,7 +38,7 @@ public class ServerBuilderImpl implements ServerBuilder { @Override public AdaptedServer getServer(String name) { Optional serverOptional = proxyServer.getServer(name); - if(serverOptional.isEmpty()) return null; + if(serverOptional.isPresent()) return null; return new VelocityServer(serverOptional.get()); } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java index 06c3b70..402dc8e 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java @@ -27,14 +27,14 @@ public class VelocityServerPing implements AdaptedServerPing { @Override public int getPlayerCount() { Optional players = handle.getPlayers(); - if(players.isEmpty()) return 0; + if(players.isPresent()) return 0; return players.get().getOnline(); } @Override public int getMaxPlayers() { Optional players = handle.getPlayers(); - if(players.isEmpty()) return 0; + if(players.isPresent()) return 0; return players.get().getMax(); } From 6f24594945c3152be87e67cf88ef25e8cafe3907 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 12 Jul 2021 14:14:34 -0700 Subject: [PATCH 15/56] the basics are working on velocity now --- .../us/ajg0702/queue/api/QueueManager.java | 5 + .../commands/listqueues/ListCommand.java | 91 +++++++++++++ .../commands/manage/ManageCommand.java | 30 ++++- .../commands/commands/manage/Reload.java | 70 ++++++++++ .../queue/commands/commands/manage/Tasks.java | 58 +++++++++ .../commands/commands/queue/QueueCommand.java | 7 +- .../us/ajg0702/queue/common/QueueMain.java | 14 +- .../queue/common/QueueManagerImpl.java | 44 +++++-- .../us/ajg0702/queue/common/TaskManager.java | 123 ++++++++++++++++++ .../queue/common/players/QueuePlayerImpl.java | 1 + .../queue/common/queues/QueueServerImpl.java | 17 ++- common/src/main/resources/config.yml | 9 +- .../platforms/velocity/VelocityQueue.java | 6 +- .../velocity/players/VelocityPlayer.java | 3 +- .../velocity/server/VelocityServerPing.java | 4 +- 15 files changed, 457 insertions(+), 25 deletions(-) create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/TaskManager.java diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java index a86267a..0fc512b 100644 --- a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -79,6 +79,11 @@ public interface QueueManager { */ void sendMessage(QueuePlayer queuePlayer); + /** + * Updates info about the servers + */ + void updateServers(); + /** * Find a server by its name * @param name The name to look for diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java new file mode 100644 index 0000000..64d4958 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java @@ -0,0 +1,91 @@ +package us.ajg0702.queue.commands.commands.listqueues; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.commands.ISubCommand; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ListCommand extends BaseCommand { + + private final QueueMain main; + + public ListCommand(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "listqueues"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of("listq"); + } + + @Override + public ImmutableList getSubCommands() { + return ImmutableList.builder().build(); + } + + @Override + public String getPermission() { + return "ajqueue.listqueues"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void addSubCommand(ISubCommand subCommand) { + + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + + AdaptedPlayer spp = null; + if(sender.isPlayer()) { + spp = main.getPlatformMethods().senderToPlayer(sender); + } + + + Component m = main.getMessages().getComponent("commands.listqueues.header"); + boolean none = true; + for(QueueServer s : main.getQueueManager().getServers()) { + none = false; + String color = "&a"; + if(!s.isOnline()) { + color = "&c"; + } else if(!s.isJoinable(spp)) { + color = "&e"; + } + + m = m.append(Component.text("\n")); + m = m.append(main.getMessages().getComponent("commands.listqueues.format", + "COLOR:" + main.getMessages().color(color), + "NAME:" + s.getName(), + "COUNT:" + s.getQueue().size(), + "STATUS:" + s.getStatusString(spp) + )); + } + sender.sendMessage(m); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + return new ArrayList<>(); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java index 49413c9..4987e3f 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java @@ -1,6 +1,7 @@ package us.ajg0702.queue.commands.commands.manage; import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.commands.ISubCommand; import us.ajg0702.queue.commands.BaseCommand; @@ -9,7 +10,9 @@ import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.Messages; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Locale; public class ManageCommand extends BaseCommand { @@ -18,7 +21,8 @@ public class ManageCommand extends BaseCommand { public ManageCommand(QueueMain main) { this.main = main; - + addSubCommand(new Reload(main)); + addSubCommand(new Tasks(main)); } @@ -56,11 +60,31 @@ public class ManageCommand extends BaseCommand { @Override public void execute(ICommandSender sender, String[] args) { - + if(args.length > 0) { + for(ISubCommand subCommand : subCommands) { + if(args[0].equalsIgnoreCase(subCommand.getName()) || subCommand.getAliases().contains(args[0].toLowerCase(Locale.ROOT))) { + subCommand.execute(sender, Arrays.copyOfRange(args, 1, args.length)); + return; + } + } + } + sender.sendMessage(Component.text("/ajQueue ")); } @Override public List autoComplete(ICommandSender sender, String[] args) { - return null; + if(args.length > 0) { + for(ISubCommand subCommand : subCommands) { + if(args[0].equalsIgnoreCase(subCommand.getName()) || subCommand.getAliases().contains(args[0].toLowerCase(Locale.ROOT))) { + return subCommand.autoComplete(sender, Arrays.copyOfRange(args, 1, args.length)); + } + } + } + List commands = new ArrayList<>(); + for(ISubCommand subCommand : subCommands) { + commands.add(subCommand.getName()); + commands.addAll(subCommand.getAliases()); + } + return commands; } } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java new file mode 100644 index 0000000..2007771 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java @@ -0,0 +1,70 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.spongepowered.configurate.ConfigurateException; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.commands.ISubCommand; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; + +public class Reload extends SubCommand { + + QueueMain main; + public Reload(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "reload"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return "ajqueue.reload"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void addSubCommand(ISubCommand subCommand) { + + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + main.getMessages().reload(); + try { + main.getConfig().reload(); + } catch (ConfigurateException e) { + sender.sendMessage(Component.text("An error occurred while reloading. Check the console").color(NamedTextColor.RED)); + e.printStackTrace(); + return; + } + main.setTimeBetweenPlayers(); + main.getTaskManager().rescheduleTasks(); + main.getQueueManager().reloadServers(); + + sender.sendMessage(getMessages().getComponent("commands.reload")); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + return new ArrayList<>(); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java new file mode 100644 index 0000000..996484e --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java @@ -0,0 +1,58 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.spongepowered.configurate.ConfigurateException; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.commands.ISubCommand; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; + +public class Tasks extends SubCommand { + + QueueMain main; + public Tasks(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "tasks"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return "ajqueue.tasks"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void addSubCommand(ISubCommand subCommand) { + + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + sender.sendMessage(Component.text(main.getTaskManager().taskStatus())); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + return new ArrayList<>(); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java index 7de09a9..149fef6 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java @@ -9,6 +9,7 @@ import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.Messages; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class QueueCommand extends BaseCommand { @@ -26,7 +27,11 @@ public class QueueCommand extends BaseCommand { @Override public ImmutableList getAliases() { - return ImmutableList.of("move", "server", "joinqueue", "joinq"); + List aliases = new ArrayList<>(Arrays.asList("move", "joinqueue", "joinq")); + if(main.getConfig().getBoolean("enable-server-command")) { + aliases.add("server"); + } + return ImmutableList.copyOf(aliases); } @Override diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index fa4593c..ba72f8a 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -14,7 +14,7 @@ import java.io.File; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; -import java.util.concurrent.CompletableFuture; +import java.util.concurrent.*; import java.util.logging.Logger; public class QueueMain { @@ -24,6 +24,9 @@ public class QueueMain { public double getTimeBetweenPlayers() { return timeBetweenPlayers; } + public void setTimeBetweenPlayers() { + this.timeBetweenPlayers = config.getDouble("wait-time"); + } private Config config; public Config getConfig() { @@ -59,6 +62,11 @@ public class QueueMain { return logger; } + private final TaskManager taskManager = new TaskManager(this); + public TaskManager getTaskManager() { + return taskManager; + } + private List> serverCompletableFutures = new ArrayList<>(); private ServerBuilder serverBuilder; public ServerBuilder getServerBuilder() { @@ -104,14 +112,14 @@ public class QueueMain { return; } - timeBetweenPlayers = config.getDouble("wait-time"); + setTimeBetweenPlayers(); queueManager = new QueueManagerImpl(this); logic = new LogicGetter().constructLogic(); aliasManager = new LogicGetter().constructAliasManager(config); - + taskManager.rescheduleTasks(); } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index a2f9800..4403db5 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -19,7 +19,7 @@ import java.util.concurrent.ExecutionException; public class QueueManagerImpl implements QueueManager { - private List servers; + private List servers = new ArrayList<>(); private final QueueMain main; private final Messages msgs; @@ -130,6 +130,9 @@ public class QueueManagerImpl implements QueueManager { ); } + if(!server.isJoinable(player)) { + sendMessage(queuePlayer); + } main.getPlatformMethods().sendJoinQueueChannelMessages(server, queuePlayer); return true; } @@ -272,10 +275,15 @@ public class QueueManagerImpl implements QueueManager { @Override public void sendMessages() { - for(QueueServer server : servers) { - for(QueuePlayer queuePlayer : server.getQueue()) { - sendMessage(queuePlayer); + if(servers == null) return; + try { + for(QueueServer server : servers) { + for(QueuePlayer queuePlayer : server.getQueue()) { + sendMessage(queuePlayer); + } } + } catch (Exception e) { + e.printStackTrace(); } } @@ -289,7 +297,7 @@ public class QueueManagerImpl implements QueueManager { int pos = queuePlayer.getPosition(); int len = server.getQueue().size(); - if(server.isJoinable(player)) { + if(!server.isJoinable(player)) { String status = server.getStatusString(player); if(msgs.getString("status.offline.base").isEmpty()) return; @@ -312,6 +320,17 @@ public class QueueManagerImpl implements QueueManager { } } + @Override + public void updateServers() { + try { + for(QueueServer server : servers) { + server.updatePing(); + } + } catch(Exception e) { + e.printStackTrace(); + } + } + @Override public QueueServer findServer(String name) { for(QueueServer server : servers) { @@ -360,22 +379,30 @@ public class QueueManagerImpl implements QueueManager { player.sendMessage(msgs.getComponent("status.sending-now", "SERVER:"+server.getAlias())); player.connect(selected); } - return; + continue; } QueuePlayer nextQueuePlayer = server.getQueue().get(0); AdaptedPlayer nextPlayer = nextQueuePlayer.getPlayer(); + // If the first person int the queue is offline or already in the server, find the next online player in the queue int i = 0; while((nextPlayer == null || server.getServerNames().contains(nextPlayer.getServerName())) && i < server.getQueue().size()) { if(nextPlayer != null) { // Remove them if they are already in the server server.removePlayer(nextQueuePlayer); + if(server.getQueue().size() > i) { + nextQueuePlayer = server.getQueue().get(i); + nextPlayer = nextQueuePlayer.getPlayer(); + } else { + nextPlayer = null; + break; + } } else { i++; + nextQueuePlayer = server.getQueue().get(i); + nextPlayer = nextQueuePlayer.getPlayer(); } - nextQueuePlayer = server.getQueue().get(i); - nextPlayer = nextQueuePlayer.getPlayer(); } if(nextPlayer == null) continue; // None of the players in the queue are online @@ -388,7 +415,6 @@ public class QueueManagerImpl implements QueueManager { if(server.isPaused() && !nextPlayer.hasPermission("ajqueue.bypasspaused")) continue; } else if(server.isPaused()) { continue; } - int tries = sendingAttempts.get(nextQueuePlayer) == null ? 0 : sendingAttempts.get(nextQueuePlayer); int maxTries = main.getConfig().getInt("max-tries"); if(tries >= maxTries && maxTries > 0) { diff --git a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java new file mode 100644 index 0000000..5d636d6 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java @@ -0,0 +1,123 @@ +package us.ajg0702.queue.common; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class TaskManager { + + ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + ScheduledExecutorService updateExecutor = Executors.newScheduledThreadPool(1); + + QueueMain main; + public TaskManager(QueueMain main) { + this.main = main; + } + + public String taskStatus() { + List> tasks = Arrays.asList(sendTask, updateTask, messageTask, actionBarTask, queueEventTask, reloadServerTask); + StringBuilder sb = new StringBuilder(); + for(ScheduledFuture task : tasks) { + sb.append(task == null ? "null" : task.isDone() ? "canceled/done" : "running"); + sb.append("\n"); + } + return sb.toString(); + } + + ScheduledFuture sendTask; + ScheduledFuture updateTask; + ScheduledFuture messageTask; + ScheduledFuture actionBarTask; + ScheduledFuture queueEventTask; + ScheduledFuture reloadServerTask; + public void rescheduleTasks() { + cancelTasks(); + + sendTask = scheduleAtFixedRate( + main.getQueueManager()::sendPlayers, + 0L, + (long) (main.getConfig().getDouble("wait-time")*1000L), + TimeUnit.MILLISECONDS + ); + + updateTask = scheduleAtFixedRate(updateExecutor, + main.getQueueManager()::updateServers, + 0L, + (long) (Math.max(main.getTimeBetweenPlayers(), 2)*1000L), + TimeUnit.MILLISECONDS + ); + + messageTask = scheduleAtFixedRate( + main.getQueueManager()::sendMessages, + 0L, + main.getConfig().getInt("message-time"), + TimeUnit.SECONDS + ); + + actionBarTask = scheduleAtFixedRate( + main.getQueueManager()::sendActionBars, + 0L, + 2L, + TimeUnit.SECONDS + ); + + queueEventTask = scheduleAtFixedRate( + main.getQueueManager()::sendQueueEvents, + 0L, + 2L, + TimeUnit.SECONDS + ); + + if(main.getConfig().getInt("reload-servers-interval") > 0) { + reloadServerTask = scheduleAtFixedRate( + main.getQueueManager()::reloadServers, + 0L, + main.getConfig().getInt("reload-servers-interval"), + TimeUnit.SECONDS + ); + } + + } + + public void cancelTasks() { + if(sendTask != null && !sendTask.isCancelled()) { + sendTask.cancel(false); + } + if(updateTask != null && !updateTask.isCancelled()) { + updateTask.cancel(false); + } + if(messageTask != null && !messageTask.isCancelled()) { + messageTask.cancel(false); + } + if(actionBarTask != null && !actionBarTask.isCancelled()) { + actionBarTask.cancel(false); + } + if(queueEventTask != null && !queueEventTask.isCancelled()) { + queueEventTask.cancel(false); + } + if(reloadServerTask != null && !reloadServerTask.isCancelled()) { + reloadServerTask.cancel(false); + reloadServerTask = null; + } + } + + private ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { + return scheduleAtFixedRate(executor, command, initialDelay, period, unit); + } + + + private ScheduledFuture scheduleAtFixedRate(ScheduledExecutorService executor, Runnable command, long initialDelay, long period, TimeUnit unit) { + return executor.scheduleAtFixedRate(() -> { + try { + command.run(); + } catch (Exception e) { + System.out.println("An error ocurred while running an ajQueue task"); + e.printStackTrace(); + } + }, initialDelay, period, unit); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java index 24e27de..b21765f 100644 --- a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java @@ -28,6 +28,7 @@ public class QueuePlayerImpl implements QueuePlayer { @Override public UUID getUniqueId() { + if(uuid == null) throw new IllegalStateException("Why is my UUID null??"); return uuid; } diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index c24e9b4..2e036ff 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -117,9 +117,13 @@ public class QueueServerImpl implements QueueServer { ping = futurePing.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { if(main.getConfig().getBoolean("pinger-debug")) { - main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] sending ping"); + main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] offline:"); + e.printStackTrace(); } } + if(ping != null && main.getConfig().getBoolean("pinger-debug")) { + main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] online. motd: "+ping.getPlainDescription()+" players: "+ping.getPlayerCount()+"/"+ping.getMaxPlayers()); + } pings.put(server, ping); i++; @@ -297,11 +301,18 @@ public class QueueServerImpl implements QueueServer { } @Override - public QueuePlayer findPlayer(AdaptedPlayer player) { + public synchronized QueuePlayer findPlayer(AdaptedPlayer player) { for(QueuePlayer queuePlayer : queue) { AdaptedPlayer queuedPlayer = queuePlayer.getPlayer(); if(queuedPlayer == null) continue; - if(queuedPlayer.getUniqueId().equals(player.getUniqueId())) { + if( + queuedPlayer + .getUniqueId() + .equals( + player + .getUniqueId() + ) + ) { return queuePlayer; } } diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 318af36..319edb8 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Dont touch this number please -config-version: 21 +config-version: 22 # The time the server will wait between sending people in the queue # Default: 5 @@ -171,4 +171,9 @@ auto-add-to-queue-on-kick-delay: 1 # This works on contains, so you dont have to include the whole kick message, just a few words. auto-add-kick-reasons: - "restarting" - - "closed" \ No newline at end of file + - "closed" + +# Should we enable the server command being a queue command? +# This may require extra setup on bungeecord. See the wiki: +# https://wiki.ajg0702.us/ajqueue/setup/replacing-server-command +enable-server-command: false \ No newline at end of file diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 260b357..625232f 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -9,6 +9,8 @@ import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; import us.ajg0702.queue.commands.BaseCommand; import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; +import us.ajg0702.queue.commands.commands.listqueues.ListCommand; +import us.ajg0702.queue.commands.commands.manage.ManageCommand; import us.ajg0702.queue.commands.commands.queue.QueueCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.velocity.commands.VelocityCommand; @@ -59,7 +61,9 @@ public class VelocityQueue { List commands = Arrays.asList( new QueueCommand(main), - new LeaveCommand(main) + new LeaveCommand(main), + new ListCommand(main), + new ManageCommand(main) ); for(BaseCommand command : commands) { diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java index 343def1..4e9cfcb 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -1,11 +1,11 @@ package us.ajg0702.queue.platforms.velocity.players; import com.velocitypowered.api.proxy.Player; -import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.server.RegisteredServer; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.server.AdaptedServer; @@ -27,6 +27,7 @@ public class VelocityPlayer implements AdaptedPlayer, Audience { @Override public void sendMessage(Component message) { + if(PlainTextComponentSerializer.plainText().serialize(message).isEmpty()) return; handle.sendMessage(message); } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java index 402dc8e..762eabd 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java @@ -27,14 +27,14 @@ public class VelocityServerPing implements AdaptedServerPing { @Override public int getPlayerCount() { Optional players = handle.getPlayers(); - if(players.isPresent()) return 0; + if(!players.isPresent()) return 0; return players.get().getOnline(); } @Override public int getMaxPlayers() { Optional players = handle.getPlayers(); - if(players.isPresent()) return 0; + if(!players.isPresent()) return 0; return players.get().getMax(); } From 0999c2dee49b74a31e45f4e032b57fdbc1b02f95 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 12 Jul 2021 14:37:12 -0700 Subject: [PATCH 16/56] clean some stuff up --- .../java/us/ajg0702/queue/api/AliasManager.java | 1 + .../main/java/us/ajg0702/queue/api/Logic.java | 3 +-- .../java/us/ajg0702/queue/api/LogicGetter.java | 1 + .../us/ajg0702/queue/api/PlatformMethods.java | 2 +- .../java/us/ajg0702/queue/api/QueueManager.java | 1 + .../ajg0702/queue/api/commands/IBaseCommand.java | 1 + .../ajg0702/queue/api/commands/ISubCommand.java | 4 ---- .../ajg0702/queue/api/players/AdaptedPlayer.java | 7 +++++-- .../us/ajg0702/queue/api/queues/QueueServer.java | 9 ++++++++- .../ajg0702/queue/api/server/AdaptedServer.java | 2 ++ .../queue/api/server/AdaptedServerPing.java | 1 + .../commands/leavequeue/LeaveCommand.java | 5 ----- .../commands/listqueues/ListCommand.java | 8 -------- .../commands/commands/manage/ManageCommand.java | 5 ++--- .../queue/commands/commands/manage/Reload.java | 8 +------- .../queue/commands/commands/manage/Tasks.java | 10 +--------- .../commands/commands/queue/QueueCommand.java | 5 ----- .../java/us/ajg0702/queue/common/QueueMain.java | 4 ++-- .../ajg0702/queue/common/QueueManagerImpl.java | 7 +++---- .../us/ajg0702/queue/common/TaskManager.java | 16 +++++----------- .../queue/common/queues/QueueServerImpl.java | 9 ++++++--- .../us/ajg0702/queue/logic/FreeAliasManager.java | 3 ++- .../platforms/velocity/PlatformMethodImpl.java | 7 ++++--- .../queue/platforms/velocity/VelocityQueue.java | 6 +++--- .../velocity/commands/VelocityCommand.java | 4 ++-- .../velocity/commands/VelocitySender.java | 6 +++--- .../velocity/players/VelocityPlayer.java | 9 +++++---- .../velocity/server/ServerBuilderImpl.java | 2 +- .../velocity/server/VelocityServerPing.java | 10 ++-------- 29 files changed, 64 insertions(+), 92 deletions(-) diff --git a/api/src/main/java/us/ajg0702/queue/api/AliasManager.java b/api/src/main/java/us/ajg0702/queue/api/AliasManager.java index 4ca19c7..23265f6 100644 --- a/api/src/main/java/us/ajg0702/queue/api/AliasManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/AliasManager.java @@ -1,5 +1,6 @@ package us.ajg0702.queue.api; +@SuppressWarnings("unused") public interface AliasManager { /** * Gets an alias from the server/group's name diff --git a/api/src/main/java/us/ajg0702/queue/api/Logic.java b/api/src/main/java/us/ajg0702/queue/api/Logic.java index 6019d67..e7f5b50 100644 --- a/api/src/main/java/us/ajg0702/queue/api/Logic.java +++ b/api/src/main/java/us/ajg0702/queue/api/Logic.java @@ -4,7 +4,7 @@ import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; -import java.util.List; +@SuppressWarnings({"SameReturnValue", "unused"}) public interface Logic { /** @@ -15,7 +15,6 @@ public interface Logic { /** * The priority logic that is executed if the plugin is premium. - * @param list The current queue * @param server The server/group name that is being queued for * @param player The player that is being queued */ diff --git a/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java b/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java index 292afed..09bbf59 100644 --- a/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java +++ b/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java @@ -2,6 +2,7 @@ package us.ajg0702.queue.api; import us.ajg0702.utils.common.Config; +@SuppressWarnings("unused") public interface LogicGetter { Logic constructLogic(); AliasManager constructAliasManager(Config config); diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index e363290..8bc7c98 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -4,7 +4,6 @@ import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; -import us.ajg0702.queue.api.server.AdaptedServer; public interface PlatformMethods { /** @@ -22,6 +21,7 @@ public interface PlatformMethods { * @param channel The (sub)channel * @param data The data */ + @SuppressWarnings("EmptyMethod") void sendPluginMessage(AdaptedPlayer player, String channel, String... data); /** diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java index 0fc512b..d31eb27 100644 --- a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -21,6 +21,7 @@ public interface QueueManager { * @param serverName The name of the server or group to add the player too * @return True if adding was successfull, false if not. */ + @SuppressWarnings("UnusedReturnValue") boolean addToQueue(AdaptedPlayer player, String serverName); /** diff --git a/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java b/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java index ac0ad00..04bca20 100644 --- a/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java +++ b/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java @@ -5,6 +5,7 @@ import us.ajg0702.utils.common.Messages; import java.util.List; +@SuppressWarnings("unused") public interface IBaseCommand { String getName(); diff --git a/api/src/main/java/us/ajg0702/queue/api/commands/ISubCommand.java b/api/src/main/java/us/ajg0702/queue/api/commands/ISubCommand.java index 6948fdb..f093cc1 100644 --- a/api/src/main/java/us/ajg0702/queue/api/commands/ISubCommand.java +++ b/api/src/main/java/us/ajg0702/queue/api/commands/ISubCommand.java @@ -1,8 +1,4 @@ package us.ajg0702.queue.api.commands; -import com.google.common.collect.ImmutableList; - -import java.util.List; - public interface ISubCommand extends IBaseCommand { } diff --git a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java index 9a55d32..0b63552 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java @@ -2,6 +2,7 @@ package us.ajg0702.queue.api.players; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.util.Handle; @@ -10,25 +11,27 @@ import java.util.UUID; /** * Represents a cross-platform player */ +@SuppressWarnings("unused") public interface AdaptedPlayer extends Handle, Audience { /** * Check if the plauer is currently connected * @return True if connected, false if not */ + @SuppressWarnings("BooleanMethodIsAlwaysInverted") boolean isConnected(); /** * Send a player a message from a Component * @param message The message to send */ - void sendMessage(Component message); + void sendMessage(@NotNull Component message); /** * Sends an actionbar message to the player * @param message The message to send */ - void sendActionBar(Component message); + void sendActionBar(@NotNull Component message); /** * Send a player a message from a string diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java index c0453a3..13e6052 100644 --- a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -13,6 +13,7 @@ import java.util.UUID; /** * Represents a server or a group that can be queued for */ +@SuppressWarnings("unused") public interface QueueServer { /** @@ -52,6 +53,12 @@ public interface QueueServer { */ long getLastSentTime(); + /** + * Sets the time the last person was sent + * @param lastSentTime the time the last person was sent + */ + void setLastSentTime(long lastSentTime); + /** @@ -210,7 +217,7 @@ public interface QueueServer { * elliot is bad * @return true because elliot is bad */ - @SuppressWarnings("unused") + @SuppressWarnings({"unused", "SameReturnValue"}) default boolean elliot_is_bad() { return true; } diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java index a2f59a3..72ef5d8 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java @@ -5,6 +5,7 @@ import us.ajg0702.queue.api.util.Handle; import java.util.concurrent.CompletableFuture; +@SuppressWarnings("unused") public interface AdaptedServer extends Handle { /** @@ -32,6 +33,7 @@ public interface AdaptedServer extends Handle { * @param player The player to check * @return False if the server is restricted and the player does not have permission to join. */ + @SuppressWarnings("SameReturnValue") boolean canAccess(AdaptedPlayer player); } diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java index 6a72b5f..8257d97 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServerPing.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.api.server; import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.util.Handle; +@SuppressWarnings("unused") public interface AdaptedServerPing extends Handle { /** * Gets the component of the description (aka MOTD) diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java index 8bff705..ae16632 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java @@ -47,11 +47,6 @@ public class LeaveCommand extends BaseCommand { return main.getMessages(); } - @Override - public void addSubCommand(ISubCommand subCommand) { - - } - @Override public void execute(ICommandSender sender, String[] args) { System.out.println("leave command"); diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java index 64d4958..8c83202 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java @@ -11,7 +11,6 @@ import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.Messages; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class ListCommand extends BaseCommand { @@ -47,11 +46,6 @@ public class ListCommand extends BaseCommand { return main.getMessages(); } - @Override - public void addSubCommand(ISubCommand subCommand) { - - } - @Override public void execute(ICommandSender sender, String[] args) { if(!checkPermission(sender)) return; @@ -63,9 +57,7 @@ public class ListCommand extends BaseCommand { Component m = main.getMessages().getComponent("commands.listqueues.header"); - boolean none = true; for(QueueServer s : main.getQueueManager().getServers()) { - none = false; String color = "&a"; if(!s.isOnline()) { color = "&c"; diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java index 4987e3f..b2475cc 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java @@ -5,7 +5,6 @@ import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.commands.ISubCommand; import us.ajg0702.queue.commands.BaseCommand; -import us.ajg0702.queue.commands.SubCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.Messages; @@ -16,7 +15,7 @@ import java.util.Locale; public class ManageCommand extends BaseCommand { - QueueMain main; + final QueueMain main; public ManageCommand(QueueMain main) { this.main = main; @@ -36,7 +35,7 @@ public class ManageCommand extends BaseCommand { return ImmutableList.of("ajq"); } - List subCommands = new ArrayList<>(); + final List subCommands = new ArrayList<>(); @Override public ImmutableList getSubCommands() { diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java index 2007771..5b2a1b4 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java @@ -5,7 +5,6 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.spongepowered.configurate.ConfigurateException; import us.ajg0702.queue.api.commands.ICommandSender; -import us.ajg0702.queue.api.commands.ISubCommand; import us.ajg0702.queue.commands.SubCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.Messages; @@ -15,7 +14,7 @@ import java.util.List; public class Reload extends SubCommand { - QueueMain main; + final QueueMain main; public Reload(QueueMain main) { this.main = main; } @@ -40,11 +39,6 @@ public class Reload extends SubCommand { return main.getMessages(); } - @Override - public void addSubCommand(ISubCommand subCommand) { - - } - @Override public void execute(ICommandSender sender, String[] args) { if(!checkPermission(sender)) return; diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java index 996484e..37b48d7 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java @@ -2,10 +2,7 @@ package us.ajg0702.queue.commands.commands.manage; import com.google.common.collect.ImmutableList; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import org.spongepowered.configurate.ConfigurateException; import us.ajg0702.queue.api.commands.ICommandSender; -import us.ajg0702.queue.api.commands.ISubCommand; import us.ajg0702.queue.commands.SubCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.Messages; @@ -15,7 +12,7 @@ import java.util.List; public class Tasks extends SubCommand { - QueueMain main; + final QueueMain main; public Tasks(QueueMain main) { this.main = main; } @@ -40,11 +37,6 @@ public class Tasks extends SubCommand { return main.getMessages(); } - @Override - public void addSubCommand(ISubCommand subCommand) { - - } - @Override public void execute(ICommandSender sender, String[] args) { if(!checkPermission(sender)) return; diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java index 149fef6..474aeb1 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/queue/QueueCommand.java @@ -49,11 +49,6 @@ public class QueueCommand extends BaseCommand { return main.getMessages(); } - @Override - public void addSubCommand(ISubCommand subCommand) { - - } - @Override public void execute(ICommandSender sender, String[] args) { if(!checkPermission(sender)) return; diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index ba72f8a..97f60ae 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -67,7 +67,7 @@ public class QueueMain { return taskManager; } - private List> serverCompletableFutures = new ArrayList<>(); + private final List> serverCompletableFutures = new ArrayList<>(); private ServerBuilder serverBuilder; public ServerBuilder getServerBuilder() { return serverBuilder; @@ -94,7 +94,7 @@ public class QueueMain { } - private File dataFolder; + private final File dataFolder; public QueueMain(Logger logger, PlatformMethods platformMethods, File dataFolder) { diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 4403db5..ed4de0c 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -1,8 +1,6 @@ package us.ajg0702.queue.common; import com.google.common.collect.ImmutableList; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.event.ClickEvent; import us.ajg0702.queue.api.QueueManager; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; @@ -347,8 +345,8 @@ public class QueueManagerImpl implements QueueManager { sendPlayers(null); } - HashMap sendingNowAntiSpam = new HashMap<>(); - HashMap sendingAttempts = new HashMap<>(); + final HashMap sendingNowAntiSpam = new HashMap<>(); + final HashMap sendingAttempts = new HashMap<>(); @Override public void sendPlayers(QueueServer queueServer) { @@ -439,6 +437,7 @@ public class QueueManagerImpl implements QueueManager { main.getLogger().severe("Could not find ideal server for server/group '"+server.getName()+"'"); continue; } + server.setLastSentTime(System.currentTimeMillis()); nextPlayer.connect(selected); } } diff --git a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java index 5d636d6..2af0064 100644 --- a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java +++ b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java @@ -1,6 +1,5 @@ package us.ajg0702.queue.common; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.Executors; @@ -10,10 +9,10 @@ import java.util.concurrent.TimeUnit; public class TaskManager { - ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); - ScheduledExecutorService updateExecutor = Executors.newScheduledThreadPool(1); + final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); + final ScheduledExecutorService updateExecutor = Executors.newScheduledThreadPool(1); - QueueMain main; + final QueueMain main; public TaskManager(QueueMain main) { this.main = main; } @@ -39,7 +38,6 @@ public class TaskManager { sendTask = scheduleAtFixedRate( main.getQueueManager()::sendPlayers, - 0L, (long) (main.getConfig().getDouble("wait-time")*1000L), TimeUnit.MILLISECONDS ); @@ -53,21 +51,18 @@ public class TaskManager { messageTask = scheduleAtFixedRate( main.getQueueManager()::sendMessages, - 0L, main.getConfig().getInt("message-time"), TimeUnit.SECONDS ); actionBarTask = scheduleAtFixedRate( main.getQueueManager()::sendActionBars, - 0L, 2L, TimeUnit.SECONDS ); queueEventTask = scheduleAtFixedRate( main.getQueueManager()::sendQueueEvents, - 0L, 2L, TimeUnit.SECONDS ); @@ -75,7 +70,6 @@ public class TaskManager { if(main.getConfig().getInt("reload-servers-interval") > 0) { reloadServerTask = scheduleAtFixedRate( main.getQueueManager()::reloadServers, - 0L, main.getConfig().getInt("reload-servers-interval"), TimeUnit.SECONDS ); @@ -105,8 +99,8 @@ public class TaskManager { } } - private ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { - return scheduleAtFixedRate(executor, command, initialDelay, period, unit); + private ScheduledFuture scheduleAtFixedRate(Runnable command, long period, TimeUnit unit) { + return scheduleAtFixedRate(executor, command, 0, period, unit); } diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index 2e036ff..d018ba4 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -5,7 +5,6 @@ import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; -import us.ajg0702.queue.api.server.AdaptedServerInfo; import us.ajg0702.queue.api.server.AdaptedServerPing; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.GenUtils; @@ -33,7 +32,7 @@ public class QueueServerImpl implements QueueServer { private final QueueMain main; - private HashMap pings = new HashMap<>(); + private final HashMap pings = new HashMap<>(); private final List servers; @@ -165,7 +164,11 @@ public class QueueServerImpl implements QueueServer { @Override public long getLastSentTime() { - return lastSentTime; + return System.currentTimeMillis() - lastSentTime; + } + @Override + public void setLastSentTime(long lastSentTime) { + this.lastSentTime = lastSentTime; } @Override diff --git a/common/src/main/java/us/ajg0702/queue/logic/FreeAliasManager.java b/common/src/main/java/us/ajg0702/queue/logic/FreeAliasManager.java index 3ef538e..8c1a812 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/FreeAliasManager.java +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeAliasManager.java @@ -4,7 +4,8 @@ import us.ajg0702.queue.api.AliasManager; import us.ajg0702.utils.common.Config; public class FreeAliasManager implements AliasManager { - Config config; + @SuppressWarnings("unused") + final Config config; public FreeAliasManager(Config config) { this.config = config; } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java index c1a0725..a7bc869 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java @@ -2,6 +2,7 @@ package us.ajg0702.queue.platforms.velocity; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.PlatformMethods; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; @@ -13,8 +14,8 @@ import java.util.logging.Logger; public class PlatformMethodImpl implements PlatformMethods { - ProxyServer proxyServer; - Logger logger; + final ProxyServer proxyServer; + final Logger logger; public PlatformMethodImpl(ProxyServer proxyServer, Logger logger) { this.proxyServer = proxyServer; @@ -25,7 +26,7 @@ public class PlatformMethodImpl implements PlatformMethods { public void sendJoinQueueChannelMessages(QueueServer queueServer, QueuePlayer queuePlayer) { AdaptedPlayer player = queuePlayer.getPlayer(); if(player == null) return; - + player.sendMessage(Component.text()); } @Override diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 625232f..ad1db86 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -32,12 +32,12 @@ import java.util.logging.Logger; ) public class VelocityQueue { - ProxyServer proxyServer; - Logger logger; + final ProxyServer proxyServer; + final Logger logger; QueueMain main; - File dataFolder; + final File dataFolder; @Inject public VelocityQueue(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataFolder) { diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java index b52383b..4e81c56 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java @@ -8,8 +8,8 @@ import java.util.List; public class VelocityCommand implements RawCommand { - QueueMain main; - BaseCommand command; + final QueueMain main; + final BaseCommand command; public VelocityCommand(QueueMain main, BaseCommand command) { this.main = main; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java index 3c9f92b..bd9a6ea 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java @@ -2,13 +2,13 @@ package us.ajg0702.queue.platforms.velocity.commands; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.ConsoleCommandSource; -import com.velocitypowered.api.proxy.ProxyServer; import net.kyori.adventure.text.Component; +import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.api.commands.ICommandSender; public class VelocitySender implements ICommandSender { - CommandSource handle; + final CommandSource handle; public VelocitySender(CommandSource handle) { this.handle = handle; @@ -25,7 +25,7 @@ public class VelocitySender implements ICommandSender { } @Override - public void sendMessage(Component message) { + public void sendMessage(@NotNull Component message) { handle.sendMessage(message); } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java index 4e9cfcb..21b4b97 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -6,6 +6,7 @@ import com.velocitypowered.api.proxy.server.RegisteredServer; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.server.AdaptedServer; @@ -14,7 +15,7 @@ import java.util.UUID; public class VelocityPlayer implements AdaptedPlayer, Audience { - Player handle; + final Player handle; public VelocityPlayer(Player player) { handle = player; @@ -26,13 +27,13 @@ public class VelocityPlayer implements AdaptedPlayer, Audience { } @Override - public void sendMessage(Component message) { + public void sendMessage(@NotNull Component message) { if(PlainTextComponentSerializer.plainText().serialize(message).isEmpty()) return; handle.sendMessage(message); } @Override - public void sendActionBar(Component message) { + public void sendActionBar(@NotNull Component message) { handle.sendActionBar(message); } @@ -49,7 +50,7 @@ public class VelocityPlayer implements AdaptedPlayer, Audience { @Override public String getServerName() { Optional serverConnection = handle.getCurrentServer(); - if(!serverConnection.isPresent()) return "none"; + if(serverConnection.isEmpty()) return "none"; ServerConnection connection = serverConnection.get(); return connection.getServerInfo().getName(); } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java index aebd796..ae98f3d 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java @@ -38,7 +38,7 @@ public class ServerBuilderImpl implements ServerBuilder { @Override public AdaptedServer getServer(String name) { Optional serverOptional = proxyServer.getServer(name); - if(serverOptional.isPresent()) return null; + if(serverOptional.isEmpty()) return null; return new VelocityServer(serverOptional.get()); } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java index 762eabd..acc57ae 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerPing.java @@ -5,8 +5,6 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import us.ajg0702.queue.api.server.AdaptedServerPing; -import java.util.Optional; - public class VelocityServerPing implements AdaptedServerPing { private final ServerPing handle; @@ -26,16 +24,12 @@ public class VelocityServerPing implements AdaptedServerPing { @Override public int getPlayerCount() { - Optional players = handle.getPlayers(); - if(!players.isPresent()) return 0; - return players.get().getOnline(); + return handle.getPlayers().map(ServerPing.Players::getOnline).orElse(0); } @Override public int getMaxPlayers() { - Optional players = handle.getPlayers(); - if(!players.isPresent()) return 0; - return players.get().getMax(); + return handle.getPlayers().map(ServerPing.Players::getMax).orElse(0); } @Override From 5165185ff192da75ac7d576fb152fbead32df27c Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 12 Jul 2021 20:37:09 -0700 Subject: [PATCH 17/56] more progress --- .../us/ajg0702/queue/api/PlatformMethods.java | 2 + .../commands/manage/ManageCommand.java | 5 +- .../queue/commands/commands/manage/Pause.java | 77 +++++++++++++++++++ .../commands/commands/manage/Version.java | 50 ++++++++++++ ...thodImpl.java => PlatformMethodsImpl.java} | 15 +++- .../platforms/velocity/VelocityQueue.java | 2 +- .../velocity/commands/VelocityCommand.java | 8 +- 7 files changed, 154 insertions(+), 5 deletions(-) create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/Version.java rename platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/{PlatformMethodImpl.java => PlatformMethodsImpl.java} (67%) diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index 8bc7c98..02705bd 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -31,4 +31,6 @@ public interface PlatformMethods { */ AdaptedPlayer senderToPlayer(ICommandSender sender); + String getPluginVersion(); + } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java index b2475cc..e0efd7a 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java @@ -22,6 +22,8 @@ public class ManageCommand extends BaseCommand { addSubCommand(new Reload(main)); addSubCommand(new Tasks(main)); + addSubCommand(new Version(main)); + addSubCommand(new Pause(main)); } @@ -72,12 +74,13 @@ public class ManageCommand extends BaseCommand { @Override public List autoComplete(ICommandSender sender, String[] args) { - if(args.length > 0) { + if(args.length > 1) { for(ISubCommand subCommand : subCommands) { if(args[0].equalsIgnoreCase(subCommand.getName()) || subCommand.getAliases().contains(args[0].toLowerCase(Locale.ROOT))) { return subCommand.autoComplete(sender, Arrays.copyOfRange(args, 1, args.length)); } } + return new ArrayList<>(); } List commands = new ArrayList<>(); for(ISubCommand subCommand : subCommands) { diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java new file mode 100644 index 0000000..d25575c --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java @@ -0,0 +1,77 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Pause extends SubCommand { + + final QueueMain main; + public Pause(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "pause"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return "ajqueue.pause"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + + if(args.length < 1) { + sender.sendMessage(getMessages().getComponent("commands.pause.more-args")); + return; + } + + QueueServer server = main.getQueueManager().findServer(args[0]); + if(server == null) { + sender.sendMessage(getMessages().getComponent("commands.pause.no-server", "SERVER:"+args[1])); + return; + } + if(args.length == 1) { + server.setPaused(!server.isPaused()); + } else { + server.setPaused(args[1].equalsIgnoreCase("on") || args[1].equalsIgnoreCase("true")); + } + sender.sendMessage(getMessages().getComponent("commands.pause.success", + "SERVER:"+server.getName(), + "PAUSED:"+getMessages().getString("commands.pause.paused."+server.isPaused()) + )); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + if(args.length == 1) { + return main.getQueueManager().getServerNames(); + } + if(args.length == 2) { + return Arrays.asList("on", "off", "true", "false"); + } + return new ArrayList<>(); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Version.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Version.java new file mode 100644 index 0000000..ab3311b --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Version.java @@ -0,0 +1,50 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; + +public class Version extends SubCommand { + + final QueueMain main; + public Version(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "version"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return "ajqueue.version"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + sender.sendMessage(Component.text(main.getPlatformMethods().getPluginVersion())); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + return new ArrayList<>(); + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java similarity index 67% rename from platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java rename to platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java index a7bc869..5740154 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java @@ -1,5 +1,6 @@ package us.ajg0702.queue.platforms.velocity; +import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import net.kyori.adventure.text.Component; @@ -10,14 +11,15 @@ import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; +import java.util.Optional; import java.util.logging.Logger; -public class PlatformMethodImpl implements PlatformMethods { +public class PlatformMethodsImpl implements PlatformMethods { final ProxyServer proxyServer; final Logger logger; - public PlatformMethodImpl(ProxyServer proxyServer, Logger logger) { + public PlatformMethodsImpl(ProxyServer proxyServer, Logger logger) { this.proxyServer = proxyServer; this.logger = logger; } @@ -38,4 +40,13 @@ public class PlatformMethodImpl implements PlatformMethods { public AdaptedPlayer senderToPlayer(ICommandSender sender) { return new VelocityPlayer((Player) sender.getHandle()); } + + @Override + public String getPluginVersion() { + Optional plugin = proxyServer.getPluginManager().getPlugin("ajqueue"); + if(plugin.isEmpty()) return "?E"; + Optional version = plugin.get().getDescription().getVersion(); + if(version.isEmpty()) return "?V"; + return version.get(); + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index ad1db86..77c2039 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -51,7 +51,7 @@ public class VelocityQueue { public void onProxyInit(ProxyInitializeEvent e) { main = new QueueMain( logger, - new PlatformMethodImpl(proxyServer, logger), + new PlatformMethodsImpl(proxyServer, logger), dataFolder ); main.setServerBuilder(new ServerBuilderImpl(main, proxyServer)); diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java index 4e81c56..c8d21f1 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java @@ -4,6 +4,8 @@ import com.velocitypowered.api.command.RawCommand; import us.ajg0702.queue.commands.BaseCommand; import us.ajg0702.queue.common.QueueMain; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class VelocityCommand implements RawCommand { @@ -23,7 +25,11 @@ public class VelocityCommand implements RawCommand { @Override public List suggest(final Invocation invocation) { - return command.autoComplete(new VelocitySender(invocation.source()), invocation.arguments().split(" ")); + List args = new ArrayList<>(Arrays.asList(invocation.arguments().split(" "))); + if(invocation.arguments().length() > 0 &&invocation.arguments().charAt(invocation.arguments().length()-1) == ' ') { + args.add(" "); + } + return command.autoComplete(new VelocitySender(invocation.source()), args.toArray(new String[0])); } @Override From 00a1d1fd39cb5177cc31780f0e23f060c5ddb96d Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 12 Jul 2021 21:05:08 -0700 Subject: [PATCH 18/56] ok --- .../ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java | 4 ++-- .../queue/platforms/velocity/players/VelocityPlayer.java | 2 +- .../queue/platforms/velocity/server/ServerBuilderImpl.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java index 5740154..009662e 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java @@ -44,9 +44,9 @@ public class PlatformMethodsImpl implements PlatformMethods { @Override public String getPluginVersion() { Optional plugin = proxyServer.getPluginManager().getPlugin("ajqueue"); - if(plugin.isEmpty()) return "?E"; + if(!plugin.isPresent()) return "?E"; Optional version = plugin.get().getDescription().getVersion(); - if(version.isEmpty()) return "?V"; + if(!version.isPresent()) return "?V"; return version.get(); } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java index 21b4b97..31954e4 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -50,7 +50,7 @@ public class VelocityPlayer implements AdaptedPlayer, Audience { @Override public String getServerName() { Optional serverConnection = handle.getCurrentServer(); - if(serverConnection.isEmpty()) return "none"; + if(!serverConnection.isPresent()) return "none"; ServerConnection connection = serverConnection.get(); return connection.getServerInfo().getName(); } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java index ae98f3d..94ab073 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java @@ -38,7 +38,7 @@ public class ServerBuilderImpl implements ServerBuilder { @Override public AdaptedServer getServer(String name) { Optional serverOptional = proxyServer.getServer(name); - if(serverOptional.isEmpty()) return null; + if(!serverOptional.isPresent()) return null; return new VelocityServer(serverOptional.get()); } From cfdadd17cab375755ec8c926dd98c59917fbdee8 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Wed, 14 Jul 2021 16:37:22 -0700 Subject: [PATCH 19/56] progress --- .../us/ajg0702/queue/api/EventHandler.java | 7 ++ .../us/ajg0702/queue/api/PlatformMethods.java | 13 +++ .../queue/api/players/AdaptedPlayer.java | 6 + .../queue/api/players/QueuePlayer.java | 6 + .../queue/api/server/AdaptedServer.java | 2 + common/build.gradle.kts | 2 + .../queue/commands/commands/PlayerSender.java | 28 +++++ .../queue/commands/commands/manage/ISP.java | 50 +++++++++ .../commands/manage/ManageCommand.java | 3 + .../commands/commands/manage/QueueList.java | 93 ++++++++++++++++ .../queue/commands/commands/manage/Send.java | 103 ++++++++++++++++++ .../queue/common/EventHandlerImpl.java | 88 +++++++++++++++ .../us/ajg0702/queue/common/QueueMain.java | 10 +- .../queue/common/QueueManagerImpl.java | 5 +- .../queue/common/players/QueuePlayerImpl.java | 7 ++ .../velocity/PlatformMethodsImpl.java | 58 +++++++++- .../platforms/velocity/VelocityQueue.java | 35 ++++-- .../velocity/commands/VelocityCommand.java | 2 + .../velocity/players/VelocityPlayer.java | 5 + .../velocity/server/VelocityServer.java | 14 +++ settings.gradle.kts | 2 + spigot/build.gradle.kts | 44 ++++++++ 22 files changed, 569 insertions(+), 14 deletions(-) create mode 100644 api/src/main/java/us/ajg0702/queue/api/EventHandler.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/QueueList.java create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java create mode 100644 spigot/build.gradle.kts diff --git a/api/src/main/java/us/ajg0702/queue/api/EventHandler.java b/api/src/main/java/us/ajg0702/queue/api/EventHandler.java new file mode 100644 index 0000000..8156f90 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/EventHandler.java @@ -0,0 +1,7 @@ +package us.ajg0702.queue.api; + +import us.ajg0702.queue.api.players.AdaptedPlayer; + +public interface EventHandler { + void handleMessage(AdaptedPlayer reciever, byte[] data); +} diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index 02705bd..ad66992 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -1,10 +1,13 @@ package us.ajg0702.queue.api; +import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; +import java.util.List; + public interface PlatformMethods { /** * BungeeUtils.sendCustomData(p, "position", pos+""); @@ -33,4 +36,14 @@ public interface PlatformMethods { String getPluginVersion(); + List getOnlinePlayers(); + List getPlayerNames(boolean lowercase); + AdaptedPlayer getPlayer(String name); + + List getServerNames(); + + + List getCommands(); + + ICommandSender constructSender(AdaptedPlayer player); } diff --git a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java index 0b63552..6a8ced7 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java @@ -64,4 +64,10 @@ public interface AdaptedPlayer extends Handle, Audience { * Does not use the queue. */ void connect(AdaptedServer server); + + /** + * Gets the player's username + * @return the player's username + */ + String getName(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java index 41aafae..be2db7d 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java @@ -50,4 +50,10 @@ public interface QueuePlayer { * Gets if this player has priority */ boolean hasPriority(); + + /** + * Gets the player's username + * @return the player's username + */ + String getName(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java index 72ef5d8..494e6db 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/AdaptedServer.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.api.server; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.util.Handle; +import java.util.List; import java.util.concurrent.CompletableFuture; @SuppressWarnings("unused") @@ -36,4 +37,5 @@ public interface AdaptedServer extends Handle { @SuppressWarnings("SameReturnValue") boolean canAccess(AdaptedPlayer player); + List getPlayers(); } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index bc64320..43b4b32 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -15,6 +15,8 @@ dependencies { compileOnly("com.google.guava:guava:30.1.1-jre") compileOnly("us.ajg0702:ajUtils:1.1.6") + compileOnly("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") + compileOnly("org.spongepowered:configurate-yaml:4.0.0") implementation(project(":api")) diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java b/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java new file mode 100644 index 0000000..62e30f6 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java @@ -0,0 +1,28 @@ +package us.ajg0702.queue.commands.commands; + +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.players.AdaptedPlayer; + +public class PlayerSender implements ICommandSender { + + final AdaptedPlayer handle; + + public VelocitySender(CommandSource handle) { + this.handle = handle; + } + + @Override + public boolean hasPermission(String permission) { + return false; + } + + @Override + public boolean isPlayer() { + return false; + } + + @Override + public Object getHandle() { + return null; + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java new file mode 100644 index 0000000..d9661ee --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java @@ -0,0 +1,50 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; + +public class ISP extends SubCommand { + + final QueueMain main; + public ISP(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "isp"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return "ajqueue.isp"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + sender.sendMessage(Component.text(main.getLogic().isPremium())); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + return new ArrayList<>(); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java index e0efd7a..e1518fc 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java @@ -24,6 +24,9 @@ public class ManageCommand extends BaseCommand { addSubCommand(new Tasks(main)); addSubCommand(new Version(main)); addSubCommand(new Pause(main)); + addSubCommand(new ISP(main)); + addSubCommand(new QueueList(main)); + addSubCommand(new Send(main)); } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/QueueList.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/QueueList.java new file mode 100644 index 0000000..b481916 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/QueueList.java @@ -0,0 +1,93 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.PatternReplacementResult; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class QueueList extends SubCommand { + + final QueueMain main; + public QueueList(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "list"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return "ajqueue.list"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + int total = 0; + for(QueueServer server : main.getQueueManager().getServers()) { + + Component msg = getMessages().getComponent("list.format", + "SERVER:"+server.getName() + ); + Component playerList = Component.empty(); + List players = server.getQueue(); + boolean none = true; + for(QueuePlayer p : players) { + playerList = playerList.append(getMessages().getComponent("list.playerlist", + "NAME:" + p.getName() + )); + none = false; + } + if(none) { + playerList = playerList.append(getMessages().getComponent("list.none")); + playerList = playerList.append(Component.text(", ")); + } + Component finalPlayerList = playerList; + msg = msg.replaceText(b -> b.match(Pattern.compile("\\{LIST}")).replacement(finalPlayerList)); + char[] commaCountString = PlainTextComponentSerializer.plainText().serialize(msg).toCharArray(); + int commas = 0; + for(Character fChar : commaCountString) { + if(fChar == ',') commas++; + } + + int finalCommas = commas; + msg = msg.replaceText(b -> b.match(",(?!.*,)").replacement("").condition((r, c, re) -> { + if(c == finalCommas) { + return PatternReplacementResult.REPLACE; + } + return PatternReplacementResult.CONTINUE; + })); + total += players.size(); + msg = msg.replaceText(b -> b.match(Pattern.compile("\\{COUNT}")).replacement(players.size()+"")); + sender.sendMessage(msg); + } + sender.sendMessage(getMessages().getComponent("list.total", "TOTAL:"+total)); + } + + @Override + public java.util.List autoComplete(ICommandSender sender, String[] args) { + return new ArrayList<>(); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java new file mode 100644 index 0000000..37cc4bf --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java @@ -0,0 +1,103 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Send extends SubCommand { + + final QueueMain main; + public Send(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "send"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return "ajqueue.send"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + + if(main.getQueueManager().findServer(args[1]) == null) { + sender.sendMessage(getMessages().getComponent("errors.server-not-exist", "SERVER:"+args[2])); + return; + } + + List playerNames = main.getPlatformMethods().getPlayerNames(true); + if(playerNames.contains(args[0].toLowerCase())) { + + AdaptedPlayer ply = main.getPlatformMethods().getPlayer(args[0]); + if(ply == null) { + sender.sendMessage(Component.text("player not found")); + return; + } + if(ply.getName() == null) { + sender.sendMessage(Component.text("name null")); + } + main.getQueueManager().addToQueue(ply, args[1]); + sender.sendMessage(getMessages().getComponent("send", + "PLAYER:"+ply.getName(), + "SERVER:"+args[1]) + ); + } else if(main.getQueueManager().getServerNames().contains(args[0])) { + + AdaptedServer from = main.getServerBuilder().getServer(args[0]); + if(from == null) { + sender.sendMessage(getMessages().getComponent("errors.server-not-exist", "SERVER:"+args[0])); + return; + } + List players = new ArrayList<>(from.getPlayers()); + for(AdaptedPlayer ply : players) { + main.getQueueManager().addToQueue(ply, args[1]); + } + + sender.sendMessage(getMessages().getComponent("send", "PLAYER:"+args[0], "SERVER:"+args[1])); + + } else { + sender.sendMessage(getMessages().getComponent("commands.send.player-not-found")); + } + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + if(args.length == 1) { + List options = new ArrayList<>(main.getPlatformMethods().getServerNames()); + options.addAll(main.getPlatformMethods().getPlayerNames(false)); + return options; + } + if(args.length == 2) { + return main.getQueueManager().getServerNames(); + } + return new ArrayList<>(); + } + + + +} diff --git a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java new file mode 100644 index 0000000..394af84 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -0,0 +1,88 @@ +package us.ajg0702.queue.common; + +import us.ajg0702.queue.api.EventHandler; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.utils.bungee.BungeeUtils; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; + +public class EventHandlerImpl implements EventHandler { + + QueueMain main; + public EventHandlerImpl(QueueMain main) { + this.main = main; + } + + @Override + public void handleMessage(AdaptedPlayer recievingPlayer, byte[] data) { + DataInputStream in = new DataInputStream(new ByteArrayInputStream(data)); + try { + String subchannel = in.readUTF(); + + if(subchannel.equals("queue")) { + String rawData = in.readUTF(); + String[] args = new String[1]; + args[0] = rawData; + main.getPlatformMethods().getCommands().get(0).execute(new , args); + //man.addToQueue(player, data); + + } + if(subchannel.equals("massqueue")) { + String data = in.readUTF(); + String[] parts = data.split(","); + for(String part : parts) { + String[] pparts = part.split(":"); + if(pparts.length < 2) continue; + String pname = pparts[0]; + String pserver = pparts[1]; + ProxiedPlayer p = ProxyServer.getInstance().getPlayer(pname); + String[] args = new String[1]; + args[0] = pserver; + moveCommand.execute(p, args); + } + } + if(subchannel.equals("queuename")) { + BungeeUtils.sendCustomData(player, "queuename", aliases.getAlias(man.getQueuedName(player))); + } + if(subchannel.equals("position")) { + QueueServer server = man.getSingleServer(player); + String pos = msgs.getString("placeholders.position.none"); + if(server != null) { + pos = server.getQueue().indexOf(player)+1+""; + } + BungeeUtils.sendCustomData(player, "position", pos); + } + if(subchannel.equals("positionof")) { + QueueServer server = man.getSingleServer(player); + String pos = msgs.getString("placeholders.position.none"); + if(server != null) { + pos = server.getQueue().size()+""; + } + BungeeUtils.sendCustomData(player, "positionof", pos); + } + if(subchannel.equals("inqueue")) { + QueueServer server = man.getSingleServer(player); + BungeeUtils.sendCustomData(player, "inqueue", (server != null)+""); + } + if(subchannel.equals("queuedfor")) { + String srv = in.readUTF(); + QueueServer server = man.findServer(srv); + if(server == null) return; + BungeeUtils.sendCustomData(player, "queuedfor", srv, server.getQueue().size()+""); + } + if(subchannel.equals("leavequeue")) { + String arg = ""; + try { + arg = in.readUTF(); + } catch(Exception ignored) {} + getProxy().getPluginManager().dispatchCommand(player, "leavequeue"+arg); + } + + } catch (IOException e1) { + getLogger().warning("An error occured while reading data from spigot side:"); + e1.printStackTrace(); + } + } +} diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 97f60ae..c57fc7a 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -1,10 +1,7 @@ package us.ajg0702.queue.common; import org.spongepowered.configurate.ConfigurateException; -import us.ajg0702.queue.api.AliasManager; -import us.ajg0702.queue.api.Logic; -import us.ajg0702.queue.api.PlatformMethods; -import us.ajg0702.queue.api.QueueManager; +import us.ajg0702.queue.api.*; import us.ajg0702.queue.api.server.ServerBuilder; import us.ajg0702.queue.logic.LogicGetter; import us.ajg0702.utils.common.Config; @@ -67,6 +64,11 @@ public class QueueMain { return taskManager; } + private final EventHandler eventHandler = new EventHandlerImpl(this); + public EventHandler getEventHandler() { + return eventHandler; + } + private final List> serverCompletableFutures = new ArrayList<>(); private ServerBuilder serverBuilder; public ServerBuilder getServerBuilder() { diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index ed4de0c..5a9b80d 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -138,7 +138,10 @@ public class QueueManagerImpl implements QueueManager { @Override public boolean addToQueue(AdaptedPlayer player, String serverName) { QueueServer server = findServer(serverName); - if(server == null) return false; + if(server == null) { + player.sendMessage(msgs.getComponent("errors.server-not-exist", "SERVER:"+serverName)); + return false; + } return addToQueue(player, server); } diff --git a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java index b21765f..723e4d1 100644 --- a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java @@ -16,6 +16,7 @@ public class QueuePlayerImpl implements QueuePlayer { private final int highestPriority; private final UUID uuid; + private final String name; public QueuePlayerImpl(AdaptedPlayer player, QueueServer server, int highestPriority) { this.player = player; @@ -24,6 +25,7 @@ public class QueuePlayerImpl implements QueuePlayer { this.highestPriority = highestPriority; uuid = player.getUniqueId(); + name = player.getName(); } @Override @@ -66,4 +68,9 @@ public class QueuePlayerImpl implements QueuePlayer { public boolean hasPriority() { return highestPriority > 0; } + + @Override + public String getName() { + return name; + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java index 009662e..713f081 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java @@ -3,14 +3,19 @@ package us.ajg0702.queue.platforms.velocity; import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.server.RegisteredServer; import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.PlatformMethods; +import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; import java.util.Optional; import java.util.logging.Logger; @@ -18,10 +23,12 @@ public class PlatformMethodsImpl implements PlatformMethods { final ProxyServer proxyServer; final Logger logger; + final VelocityQueue plugin; - public PlatformMethodsImpl(ProxyServer proxyServer, Logger logger) { + public PlatformMethodsImpl(VelocityQueue plugin, ProxyServer proxyServer, Logger logger) { this.proxyServer = proxyServer; this.logger = logger; + this.plugin = plugin; } @Override @@ -33,7 +40,8 @@ public class PlatformMethodsImpl implements PlatformMethods { @Override public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) { - + if(player == null) return; + Player velocityPlayer = ((VelocityPlayer) player).getHandle(); } @Override @@ -49,4 +57,50 @@ public class PlatformMethodsImpl implements PlatformMethods { if(!version.isPresent()) return "?V"; return version.get(); } + + @Override + public List getOnlinePlayers() { + List players = new ArrayList<>(); + for(Player player : proxyServer.getAllPlayers()) { + players.add(new VelocityPlayer(player)); + } + return players; + } + + @Override + public List getPlayerNames(boolean lowercase) { + List players = new ArrayList<>(); + for(Player player : proxyServer.getAllPlayers()) { + if(lowercase) { + players.add(player.getUsername().toLowerCase(Locale.ROOT)); + } else { + players.add(player.getUsername()); + } + } + return players; + } + + @Override + public AdaptedPlayer getPlayer(String name) { + Optional player = proxyServer.getPlayer(name); + if(!player.isPresent()) { + System.out.println("Player "+name+" not found"); + return null; + } + return new VelocityPlayer(player.get()); + } + + @Override + public List getServerNames() { + List names = new ArrayList<>(); + for(RegisteredServer server : proxyServer.getAllServers()) { + names.add(server.getServerInfo().getName()); + } + return names; + } + + @Override + public List getCommands() { + return plugin.commands; + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 77c2039..a684f88 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -2,11 +2,15 @@ package us.ajg0702.queue.platforms.velocity; import com.google.inject.Inject; import com.velocitypowered.api.command.CommandManager; +import com.velocitypowered.api.event.ResultedEvent; import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.PluginMessageEvent; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; +import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.commands.BaseCommand; import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; import us.ajg0702.queue.commands.commands.listqueues.ListCommand; @@ -14,6 +18,7 @@ import us.ajg0702.queue.commands.commands.manage.ManageCommand; import us.ajg0702.queue.commands.commands.queue.QueueCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.velocity.commands.VelocityCommand; +import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; import us.ajg0702.queue.platforms.velocity.server.ServerBuilderImpl; import java.io.File; @@ -47,32 +52,48 @@ public class VelocityQueue { this.dataFolder = dataFolder.toFile(); } + List commands; + @Subscribe public void onProxyInit(ProxyInitializeEvent e) { main = new QueueMain( logger, - new PlatformMethodsImpl(proxyServer, logger), + new PlatformMethodsImpl(this, proxyServer, logger), dataFolder ); main.setServerBuilder(new ServerBuilderImpl(main, proxyServer)); - CommandManager commandManager = proxyServer.getCommandManager(); - - - List commands = Arrays.asList( + commands = Arrays.asList( new QueueCommand(main), new LeaveCommand(main), new ListCommand(main), new ManageCommand(main) ); - for(BaseCommand command : commands) { + CommandManager commandManager = proxyServer.getCommandManager(); + + + for(IBaseCommand command : commands) { commandManager.register( commandManager.metaBuilder(command.getName()) .aliases(command.getAliases().toArray(new String[]{})) .build(), - new VelocityCommand(main, command) + new VelocityCommand(main, (BaseCommand) command) ); } } + + @Subscribe + public void onPluginMessage(PluginMessageEvent e) { + if(e.getIdentifier().getId().equals("ajqueue:tospigot")) { + e.setResult(PluginMessageEvent.ForwardResult.handled()); + return; + } + if(!e.getIdentifier().getId().equals("ajqueue:toproxy")) return; + e.setResult(PluginMessageEvent.ForwardResult.handled()); + + if(!(e.getTarget() instanceof Player)) return; + + main.getEventHandler().handleMessage(new VelocityPlayer((Player) e.getTarget()), e.getData()); + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java index c8d21f1..25548b6 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java @@ -10,6 +10,8 @@ import java.util.List; public class VelocityCommand implements RawCommand { + + final QueueMain main; final BaseCommand command; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java index 31954e4..0d72b6d 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -65,6 +65,11 @@ public class VelocityPlayer implements AdaptedPlayer, Audience { handle.createConnectionRequest((RegisteredServer) server.getHandle()).connect(); } + @Override + public String getName() { + return handle.getUsername(); + } + @Override public Player getHandle() { return handle; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java index f9f9cf5..5d0eac1 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java @@ -1,12 +1,17 @@ package us.ajg0702.queue.platforms.velocity.server; +import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.ServerPing; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.AdaptedServerInfo; import us.ajg0702.queue.api.server.AdaptedServerPing; +import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -48,6 +53,15 @@ public class VelocityServer implements AdaptedServer { return true; } + @Override + public List getPlayers() { + List players = new ArrayList<>(); + for(Player player : handle.getPlayersConnected()) { + players.add(new VelocityPlayer(player)); + } + return players; + } + @Override public RegisteredServer getHandle() { return handle; diff --git a/settings.gradle.kts b/settings.gradle.kts index 68d5aae..0b2c159 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,8 @@ rootProject.name = "ajQueue" include(":api") include(":common") +include(":spigot") + include(":platforms:velocity") include(":free") \ No newline at end of file diff --git a/spigot/build.gradle.kts b/spigot/build.gradle.kts new file mode 100644 index 0000000..7743cd1 --- /dev/null +++ b/spigot/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + `java-library` + `maven-publish` +} + +group = "us.ajg0702.queue.spigot" + +repositories { + mavenCentral() + + maven { url = uri("https://repo.ajg0702.us") } +} + +dependencies { + implementation("net.kyori:adventure-api:4.8.1") + compileOnly("com.google.guava:guava:30.1.1-jre") + + compileOnly("us.ajg0702:ajUtils:1.1.6") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["jar"]) + } + } + + repositories { + + val mavenUrl = "https://repo.ajg0702.us/releases" + + if(!System.getenv("REPO_TOKEN").isNullOrEmpty()) { + maven { + url = uri(mavenUrl) + name = "ajRepo" + + credentials { + username = "plugins" + password = System.getenv("REPO_TOKEN") + } + } + } + } +} \ No newline at end of file From 5bd770da9cdc7fe3bc31a7f798d3941d827ef2ff Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Wed, 21 Jul 2021 17:17:58 -0500 Subject: [PATCH 20/56] progress --- .gitlab-ci.yml | 2 +- .../us/ajg0702/queue/api/PlatformMethods.java | 2 - build.gradle.kts | 1 + .../ajg0702/queue/commands/BaseCommand.java | 3 +- .../queue/commands/commands/PlayerSender.java | 8 +- .../queue/common/EventHandlerImpl.java | 48 ++-- free/build.gradle.kts | 1 + .../velocity/PlatformMethodsImpl.java | 12 + .../platforms/velocity/VelocityQueue.java | 1 + spigot/build.gradle.kts | 16 ++ .../us/ajg0702/queue/spigot/Commands.java | 64 ++++++ .../java/us/ajg0702/queue/spigot/Config.java | 59 +++++ .../java/us/ajg0702/queue/spigot/Main.java | 181 +++++++++++++++ .../us/ajg0702/queue/spigot/Placeholders.java | 214 ++++++++++++++++++ .../spigot/QueueScoreboardActivator.java | 28 +++ .../ajg0702/queue/spigot/utils/ActionBar.java | 71 ++++++ .../queue/spigot/utils/VersionSupport.java | 31 +++ spigot/src/main/resources/plugin.yml | 13 ++ 18 files changed, 725 insertions(+), 30 deletions(-) create mode 100644 spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java create mode 100644 spigot/src/main/java/us/ajg0702/queue/spigot/Config.java create mode 100644 spigot/src/main/java/us/ajg0702/queue/spigot/Main.java create mode 100644 spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java create mode 100644 spigot/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java create mode 100644 spigot/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java create mode 100644 spigot/src/main/java/us/ajg0702/queue/spigot/utils/VersionSupport.java create mode 100644 spigot/src/main/resources/plugin.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 82467c6..6dac4b4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -43,7 +43,7 @@ deploy to maven repo: dependencies: - build script: - - ./gradlew publish --stacktrace + - ./gradlew :api:publish --stacktrace upload to updater: stage: deploy diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index ad66992..af1697c 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -44,6 +44,4 @@ public interface PlatformMethods { List getCommands(); - - ICommandSender constructSender(AdaptedPlayer player); } diff --git a/build.gradle.kts b/build.gradle.kts index d51fff1..2233619 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -38,6 +38,7 @@ repositories { dependencies { testImplementation("junit:junit:4.12") + } diff --git a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java index e9e196c..9b9993e 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java @@ -1,6 +1,7 @@ package us.ajg0702.queue.commands; import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.commands.ISubCommand; @@ -41,7 +42,7 @@ public class BaseCommand implements IBaseCommand { @Override public void execute(ICommandSender sender, String[] args) { - + sender.sendMessage(Component.text("Unimplemented command")); } public boolean checkPermission(ICommandSender sender) { diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java b/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java index 62e30f6..7a86d0c 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java @@ -7,22 +7,22 @@ public class PlayerSender implements ICommandSender { final AdaptedPlayer handle; - public VelocitySender(CommandSource handle) { + public PlayerSender(AdaptedPlayer handle) { this.handle = handle; } @Override public boolean hasPermission(String permission) { - return false; + return handle.hasPermission(permission); } @Override public boolean isPlayer() { - return false; + return true; } @Override - public Object getHandle() { + public AdaptedPlayer getHandle() { return null; } } diff --git a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java index 394af84..e8615f7 100644 --- a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -1,8 +1,10 @@ package us.ajg0702.queue.common; import us.ajg0702.queue.api.EventHandler; +import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.players.AdaptedPlayer; -import us.ajg0702.utils.bungee.BungeeUtils; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.commands.commands.PlayerSender; import java.io.ByteArrayInputStream; import java.io.DataInputStream; @@ -17,6 +19,8 @@ public class EventHandlerImpl implements EventHandler { @Override public void handleMessage(AdaptedPlayer recievingPlayer, byte[] data) { + IBaseCommand moveCommand = main.getPlatformMethods().getCommands().get(0); + IBaseCommand leaveCommand = main.getPlatformMethods().getCommands().get(1); DataInputStream in = new DataInputStream(new ByteArrayInputStream(data)); try { String subchannel = in.readUTF(); @@ -25,63 +29,63 @@ public class EventHandlerImpl implements EventHandler { String rawData = in.readUTF(); String[] args = new String[1]; args[0] = rawData; - main.getPlatformMethods().getCommands().get(0).execute(new , args); + moveCommand.execute(new PlayerSender(recievingPlayer), args); //man.addToQueue(player, data); } if(subchannel.equals("massqueue")) { - String data = in.readUTF(); - String[] parts = data.split(","); + String inData = in.readUTF(); + String[] parts = inData.split(","); for(String part : parts) { String[] pparts = part.split(":"); if(pparts.length < 2) continue; String pname = pparts[0]; String pserver = pparts[1]; - ProxiedPlayer p = ProxyServer.getInstance().getPlayer(pname); + AdaptedPlayer p = main.getPlatformMethods().getPlayer(pname); String[] args = new String[1]; args[0] = pserver; - moveCommand.execute(p, args); + moveCommand.execute(new PlayerSender(p), args); } } if(subchannel.equals("queuename")) { - BungeeUtils.sendCustomData(player, "queuename", aliases.getAlias(man.getQueuedName(player))); + main.getPlatformMethods().sendPluginMessage(recievingPlayer, "queuename", main.getQueueManager().getQueuedName(recievingPlayer)); } if(subchannel.equals("position")) { - QueueServer server = man.getSingleServer(player); - String pos = msgs.getString("placeholders.position.none"); + QueueServer server = main.getQueueManager().getSingleServer(recievingPlayer); + String pos = main.getMessages().getString("placeholders.position.none"); if(server != null) { - pos = server.getQueue().indexOf(player)+1+""; + pos = server.getQueue().indexOf(server.findPlayer(recievingPlayer))+1+""; } - BungeeUtils.sendCustomData(player, "position", pos); + main.getPlatformMethods().sendPluginMessage(recievingPlayer, "position", pos); } if(subchannel.equals("positionof")) { - QueueServer server = man.getSingleServer(player); - String pos = msgs.getString("placeholders.position.none"); + QueueServer server = main.getQueueManager().getSingleServer(recievingPlayer); + String pos = main.getMessages().getString("placeholders.position.none"); if(server != null) { pos = server.getQueue().size()+""; } - BungeeUtils.sendCustomData(player, "positionof", pos); + main.getPlatformMethods().sendPluginMessage(recievingPlayer, "positionof", pos); } if(subchannel.equals("inqueue")) { - QueueServer server = man.getSingleServer(player); - BungeeUtils.sendCustomData(player, "inqueue", (server != null)+""); + QueueServer server = main.getQueueManager().getSingleServer(recievingPlayer); + main.getPlatformMethods().sendPluginMessage(recievingPlayer, "inqueue", (server != null)+""); } if(subchannel.equals("queuedfor")) { String srv = in.readUTF(); - QueueServer server = man.findServer(srv); + QueueServer server = main.getQueueManager().findServer(srv); if(server == null) return; - BungeeUtils.sendCustomData(player, "queuedfor", srv, server.getQueue().size()+""); + main.getPlatformMethods().sendPluginMessage(recievingPlayer, "queuedfor", srv, server.getQueue().size()+""); } if(subchannel.equals("leavequeue")) { - String arg = ""; + String[] args = new String[1]; try { - arg = in.readUTF(); + args[0] = in.readUTF(); } catch(Exception ignored) {} - getProxy().getPluginManager().dispatchCommand(player, "leavequeue"+arg); + leaveCommand.execute(new PlayerSender(recievingPlayer), args); } } catch (IOException e1) { - getLogger().warning("An error occured while reading data from spigot side:"); + main.getLogger().warning("An error occured while reading data from spigot side:"); e1.printStackTrace(); } } diff --git a/free/build.gradle.kts b/free/build.gradle.kts index 18e58a2..bb6fb1e 100644 --- a/free/build.gradle.kts +++ b/free/build.gradle.kts @@ -22,6 +22,7 @@ dependencies { //implementation("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT") implementation(project(":platforms:velocity")) + implementation(project(":spigot")) } tasks.shadowJar { diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java index 713f081..dee0256 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java @@ -1,8 +1,12 @@ package us.ajg0702.queue.platforms.velocity; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import com.velocitypowered.api.proxy.server.RegisteredServer; import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.PlatformMethods; @@ -42,6 +46,14 @@ public class PlatformMethodsImpl implements PlatformMethods { public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) { if(player == null) return; Player velocityPlayer = ((VelocityPlayer) player).getHandle(); + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF( channel ); + out.writeUTF(player.getName()); + for(String s : data) { + out.writeUTF( s ); + } + + velocityPlayer.sendPluginMessage(MinecraftChannelIdentifier.from("ajqueue:tospigot"), out.toByteArray()); } @Override diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index a684f88..1e01ea7 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -85,6 +85,7 @@ public class VelocityQueue { @Subscribe public void onPluginMessage(PluginMessageEvent e) { + System.out.println("Recieved message: "+e.getIdentifier().getId()); if(e.getIdentifier().getId().equals("ajqueue:tospigot")) { e.setResult(PluginMessageEvent.ForwardResult.handled()); return; diff --git a/spigot/build.gradle.kts b/spigot/build.gradle.kts index 7743cd1..f0d692a 100644 --- a/spigot/build.gradle.kts +++ b/spigot/build.gradle.kts @@ -8,6 +8,10 @@ group = "us.ajg0702.queue.spigot" repositories { mavenCentral() + maven { url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/") } + + maven { url = uri("https://repo.codemc.io/repository/nms/") } + maven { url = uri("https://repo.ajg0702.us") } } @@ -16,6 +20,18 @@ dependencies { compileOnly("com.google.guava:guava:30.1.1-jre") compileOnly("us.ajg0702:ajUtils:1.1.6") + + compileOnly(group = "org.spigotmc", name = "spigot", version = "1.16.5-R0.1-SNAPSHOT") + compileOnly("me.clip:placeholderapi:2.10.4") +} + +tasks.withType { + include("**/*.yml") + filter( + "tokens" to mapOf( + "VERSION" to project.version.toString() + ) + ) } publishing { diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java new file mode 100644 index 0000000..356fd41 --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java @@ -0,0 +1,64 @@ +package us.ajg0702.queue.spigot; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class Commands implements CommandExecutor { + + Main pl; + public Commands(Main pl) { + this.pl = pl; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + Player player = null; + if(sender instanceof Player) { + player = (Player) sender; + } + if(command.getName().equals("leavequeue")) { + if(player == null) return true; + StringBuilder arg = new StringBuilder(); + for(String a : args) { + arg.append(" "); + arg.append(a); + } + pl.sendMessage(player, "leavequeue", arg.toString()); + return true; + } + if(args.length < 1) return false; + + String srvname = args[0]; + + if(args.length > 1) { + pl.getLogger().info("Sending "+args[0]+" to queue"); + if(!sender.hasPermission("ajqueue.send")) { + sender.sendMessage(color("&cYou do not have permission to do this!")); + return true; + } + Player tply = Bukkit.getPlayer(args[0]); + if(tply == null) { + sender.sendMessage(color("&cCannot find that player!")); + return true; + } + player = tply; + srvname = args[1]; + } + if(pl.config.getBoolean("send-queue-commands-in-batches")) { + pl.queuebatch.put(player, srvname); + } else { + pl.sendMessage(player, "queue", srvname); + } + + return true; + } + + public String color(String txt) { + return ChatColor.translateAlternateColorCodes('&', txt); + } + +} diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Config.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Config.java new file mode 100644 index 0000000..47226de --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Config.java @@ -0,0 +1,59 @@ +package us.ajg0702.queue.spigot; + +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; + +public class Config { + File f; + YamlConfiguration yml; + + JavaPlugin pl; + + + public boolean getBoolean(String key) { + return yml.getBoolean(key); + } + + public Config(JavaPlugin pl) { + this.pl = pl; + f = new File(pl.getDataFolder(), "config.yml"); + if(!f.exists()) { + if(!Files.exists(pl.getDataFolder().toPath())) { + try { + Files.createDirectory(pl.getDataFolder().toPath()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + try { + PrintWriter writer = new PrintWriter(pl.getDataFolder()+File.separator+"config.yml", "UTF-8"); + String[] lines = getDefaultConfig().split("\n"); + for(String line : lines) { + writer.println(line); + + } + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + yml = YamlConfiguration.loadConfiguration(f); + } + + public String getDefaultConfig() { + return "# This is the config for the spigot side.\n" + + "# You can find more settings in the config of bungee.\n" + + "\n\n" + + "# Should we send queue requests from commands in batches?\n" + + "# Enable this if you have issues with players sometimes not executing commands correctly\n" + + "# Note though that it could delay queue commands by up to 1 second!\n" + + "send-queue-commands-in-batches: false"; + } +} diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java new file mode 100644 index 0000000..b753a86 --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java @@ -0,0 +1,181 @@ +package us.ajg0702.queue.spigot; + +import com.google.common.io.ByteArrayDataInput; +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.messaging.PluginMessageListener; +import us.ajg0702.queue.spigot.utils.VersionSupport; + +import java.util.HashMap; + +public class Main extends JavaPlugin implements PluginMessageListener,Listener { + + boolean papi = false; + Placeholders placeholders; + + Config config; + + public void onEnable() { + getServer().getMessenger().registerIncomingPluginChannel(this, "ajqueue:tospigot", this); + getServer().getMessenger().registerOutgoingPluginChannel(this, "ajqueue:tobungee"); + + this.getCommand("move").setExecutor(new Commands(this)); + this.getCommand("leavequeue").setExecutor(new Commands(this)); + + Bukkit.getPluginManager().registerEvents(this, this); + + papi = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; + + if(papi) { + placeholders = new Placeholders(this); + placeholders.register(); + getLogger().info("Registered PlaceholderAPI placeholders"); + } + + Bukkit.getScheduler().runTaskTimer(this, new Runnable() { + public void run() { + if(Bukkit.getOnlinePlayers().size() <= 0 || queuebatch.size() <= 0) return; + String msg = ""; + for(Player p : queuebatch.keySet()) { + if(p == null || !p.isOnline()) continue; + msg += p.getName()+":"+queuebatch.get(p)+","; + } + if(msg.length() > 1) { + msg = msg.substring(0, msg.length()-1); + } + queuebatch.clear(); + sendMessage("massqueue", msg); + } + }, 2*20, 20); + + config = new Config(this); + + getLogger().info("Spigot side enabled! v"+getDescription().getVersion()); + } + + HashMap queuebatch = new HashMap<>(); + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] message) { + if (!channel.equals("ajqueue:tospigot")) return; + + ByteArrayDataInput in = ByteStreams.newDataInput(message); + + String subchannel = in.readUTF(); + + if(subchannel.equals("actionbar")) { + String playername = in.readUTF(); + Player p = Bukkit.getPlayer(playername); + if(p == null) return; + + String data = in.readUTF(); + final String text = data.split(";time=")[0]; + //getLogger().info("recieved actionbar for "+player.getName()+": "+text); + VersionSupport.sendActionBar(p, text); + + /*QueueActionbarUpdateEvent e = new QueueActionbarUpdateEvent(p); + Bukkit.getPluginManager().callEvent(e);*/ + return; + } + if(subchannel.equals("inqueueevent")) { + String playername = in.readUTF(); + Player p = Bukkit.getPlayer(playername); + if(p == null) return; + QueueScoreboardActivator e = new QueueScoreboardActivator(p); + Bukkit.getPluginManager().callEvent(e); + } + if(subchannel.equals("queuename") && papi) { + String playername = in.readUTF(); + Player p = Bukkit.getPlayer(playername); + if(p == null) return; + if(!p.isOnline()) return; + + String data = in.readUTF(); + HashMap phs = placeholders.responseCache.get(p); + if(phs == null) phs = new HashMap<>(); + phs.put("queued", data); + placeholders.responseCache.put(p, phs); + } + if(subchannel.equals("position") && papi) { + String playername = in.readUTF(); + Player p = Bukkit.getPlayer(playername); + if(p == null) return; + if(!p.isOnline()) return; + + String data = in.readUTF(); + HashMap phs = placeholders.responseCache.get(p); + if(phs == null) phs = new HashMap<>(); + phs.put("position", data); + placeholders.responseCache.put(p, phs); + } + if(subchannel.equals("positionof") && papi) { + String playername = in.readUTF(); + Player p = Bukkit.getPlayer(playername); + if(p == null) return; + if(!p.isOnline()) return; + + String data = in.readUTF(); + HashMap phs = placeholders.responseCache.get(p); + if(phs == null) phs = new HashMap<>(); + phs.put("of", data); + placeholders.responseCache.put(p, phs); + } + if(subchannel.equals("inqueue") && papi) { + String playername = in.readUTF(); + Player p = Bukkit.getPlayer(playername); + if(p == null) return; + if(!p.isOnline()) return; + + String data = in.readUTF(); + HashMap phs = placeholders.responseCache.get(p); + if(phs == null) phs = new HashMap<>(); + phs.put("inqueue", data); + placeholders.responseCache.put(p, phs); + } + if(subchannel.equals("queuedfor")) { + String playername = in.readUTF(); + String queuename = in.readUTF(); + + Player p = Bukkit.getPlayer(playername); + if(p == null) return; + if(!p.isOnline()) return; + + int number = Integer.valueOf(in.readUTF()); + HashMap phs = placeholders.responseCache.get(p); + if(phs == null) phs = new HashMap<>(); + phs.put("queuedfor_"+queuename, number+""); + placeholders.responseCache.put(p, phs); + } + } + + + public void sendMessage(Player player, String subchannel, String data) { + //getLogger().info("Sending message. "+subchannel+" "+data); + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF(subchannel); + out.writeUTF(data); + + player.sendPluginMessage(this, "ajqueue:tobungee", out.toByteArray()); + } + + public void sendMessage(String subchannel, String data) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF(subchannel); + out.writeUTF(data); + + Bukkit.getOnlinePlayers().iterator().next() + .sendPluginMessage(this, "ajqueue:tobungee", out.toByteArray()); + } + + @EventHandler + public void onLeave(PlayerQuitEvent e) { + if(!papi) return; + placeholders.cleanCache(); + } +} diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java new file mode 100644 index 0000000..b7a21ff --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java @@ -0,0 +1,214 @@ +package us.ajg0702.queue.spigot; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.ConcurrentModificationException; +import java.util.HashMap; +import java.util.Iterator; + +/** + * This class will be registered through the register-method in the + * plugins onEnable-method. + */ +public class Placeholders extends PlaceholderExpansion { + + private Main plugin; + + /** + * Since we register the expansion inside our own plugin, we + * can simply use this method here to get an instance of our + * plugin. + * + * @param plugin + * The instance of our plugin. + */ + public Placeholders(Main plugin){ + this.plugin = plugin; + } + + /** + * Because this is an internal class, + * you must override this method to let PlaceholderAPI know to not unregister your expansion class when + * PlaceholderAPI is reloaded + * + * @return true to persist through reloads + */ + @Override + public boolean persist(){ + return true; + } + + /** + * Because this is a internal class, this check is not needed + * and we can simply return {@code true} + * + * @return Always true since it's an internal class. + */ + @Override + public boolean canRegister(){ + return true; + } + + /** + * The name of the person who created this expansion should go here. + *
For convienience do we return the author from the plugin.yml + * + * @return The name of the author as a String. + */ + @Override + public String getAuthor(){ + return plugin.getDescription().getAuthors().toString(); + } + + /** + * The placeholder identifier should go here. + *
This is what tells PlaceholderAPI to call our onRequest + * method to obtain a value if a placeholder starts with our + * identifier. + *
This must be unique and can not contain % or _ + * + * @return The identifier in {@code %_%} as String. + */ + @Override + public String getIdentifier(){ + return "ajqueue"; + } + + /** + * This is the version of the expansion. + *
You don't have to use numbers, since it is set as a String. + * + * For convienience do we return the version from the plugin.yml + * + * @return The version as a String. + */ + @Override + public String getVersion(){ + return plugin.getDescription().getVersion(); + } + + HashMap> responseCache = new HashMap<>(); + + public void cleanCache() { + Iterator it = responseCache.keySet().iterator(); + while(it.hasNext()) { + Player p = it.next(); + if(p == null) { + it.remove(); + continue; + } + if(!p.isOnline()) { + it.remove(); + } + } + } + + /** + * This is the method called when a placeholder with our identifier + * is found and needs a value. + *
We specify the value identifier in this method. + *
Since version 2.9.1 can you use OfflinePlayers in your requests. + * + * @param player + * A org.bukkit.PkPlayer Player. + * @param identifier + * A String containing the identifier/value. + * + * @return possibly-null String of the requested identifier. + */ + @Override + public String onPlaceholderRequest(Player player, final String identifier){ + //Bukkit.getLogger().info("itentifier: "+identifier); + + + if(player == null) return "No player"; + + + String noc = "_nocache"; + if(identifier.length() > noc.length()) { + int olen = identifier.length()-noc.length(); + if(identifier.indexOf(noc) == olen) { + String idfr = identifier.substring(0, olen); + return this.parsePlaceholder(player, idfr); + } + } + + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + public void run() { + HashMap playerCache; + if(responseCache.containsKey(player)) { + playerCache = responseCache.get(player); + } else { + playerCache = new HashMap(); + } + if(playerCache.size() > 75) { + try { + playerCache.remove(playerCache.keySet().toArray()[0]); + } catch(ConcurrentModificationException e) { + Bukkit.getScheduler().runTask(plugin, new Runnable() { + public void run() { + playerCache.remove(playerCache.keySet().toArray()[0]); + } + }); + } + } + String resp = parsePlaceholder(player, identifier); + if(resp == null) return; + playerCache.put(identifier, resp); + responseCache.put(player, playerCache); + } + }); + + + if(responseCache.containsKey(player)) { + HashMap playerCache = responseCache.get(player); + if(playerCache.containsKey(identifier)) { + return playerCache.get(identifier); + } + } else { + if(identifier.equalsIgnoreCase("queued")) { + return "None"; + } + if(identifier.equalsIgnoreCase("position") || identifier.equalsIgnoreCase("of")) { + return "None"; + } + if(identifier.equalsIgnoreCase("inqueue")) { + return "false"; + } + if(identifier.matches("queuedfor_*.*")) { + return "0"; + } + } + + + return null; + } + + private String parsePlaceholder(Player player, String identifier) { + if(identifier.equalsIgnoreCase("queued")) { + plugin.sendMessage(player, "queuename", ""); + return null; + } + if(identifier.equalsIgnoreCase("position")) { + plugin.sendMessage(player, "position", ""); + return null; + } + if(identifier.equalsIgnoreCase("of")) { + plugin.sendMessage(player, "positionof", ""); + return null; + } + if(identifier.equalsIgnoreCase("inqueue")) { + plugin.sendMessage(player, "inqueue", ""); + return null; + } + if(identifier.matches("queuedfor_*.*")) { + plugin.sendMessage(player, "queuedfor", identifier.split("_")[1]); + return null; + } + + + return null; + } +} diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java b/spigot/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java new file mode 100644 index 0000000..9c621b0 --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java @@ -0,0 +1,28 @@ +package us.ajg0702.queue.spigot; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class QueueScoreboardActivator extends Event { + private static final HandlerList HANDLERS = new HandlerList(); + + public HandlerList getHandlers() { + return HANDLERS; + } + + public static HandlerList getHandlerList() { + return HANDLERS; + } + + Player ply; + + public QueueScoreboardActivator(Player p) { + this.ply = p; + } + + public Player getPlayer() { + return ply.getPlayer(); + } + +} diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java b/spigot/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java new file mode 100644 index 0000000..eab8c59 --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java @@ -0,0 +1,71 @@ +package us.ajg0702.queue.spigot.utils; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * A cross-version actionbar class + * @author Based on ActionBarAPI from https://github.com/ConnorLinfoot + * + */ +public class ActionBar { + + private static String version; + private static boolean old; + + public static void send(Player player, String message) { + if(player == null) return; + if(!player.isOnline()) return; + + version = Bukkit.getServer().getClass().getPackage().getName(); + version = version.substring(version.lastIndexOf(".") + 1); + + old = version.equalsIgnoreCase("v1_8_R1") || version.startsWith("v1_7_"); + + try { + Class craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + version + ".entity.CraftPlayer"); + Object craftPlayer = craftPlayerClass.cast(player); + Object packet; + Class packetPlayOutChatClass = Class.forName("net.minecraft.server." + version + ".PacketPlayOutChat"); + Class packetClass = Class.forName("net.minecraft.server." + version + ".Packet"); + if (old) { + Class chatSerializerClass = Class.forName("net.minecraft.server." + version + ".ChatSerializer"); + Class iChatBaseComponentClass = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent"); + Method m3 = chatSerializerClass.getDeclaredMethod("a", String.class); + Object cbc = iChatBaseComponentClass.cast(m3.invoke(chatSerializerClass, "{\"text\": \"" + message + "\"}")); + packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, byte.class}).newInstance(cbc, (byte) 2); + } else { + Class chatComponentTextClass = Class.forName("net.minecraft.server." + version + ".ChatComponentText"); + Class iChatBaseComponentClass = Class.forName("net.minecraft.server." + version + ".IChatBaseComponent"); + try { + Class chatMessageTypeClass = Class.forName("net.minecraft.server." + version + ".ChatMessageType"); + Object[] chatMessageTypes = chatMessageTypeClass.getEnumConstants(); + Object chatMessageType = null; + for (Object o : chatMessageTypes) { + if (o.toString().equals("GAME_INFO")) { + chatMessageType = o; + } + } + Object chatCompontentText = chatComponentTextClass.getConstructor(new Class[]{String.class}).newInstance(message); + packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, chatMessageTypeClass}).newInstance(chatCompontentText, chatMessageType); + } catch (ClassNotFoundException e) { + Object chatCompontentText = chatComponentTextClass.getConstructor(new Class[]{String.class}).newInstance(message); + packet = packetPlayOutChatClass.getConstructor(new Class[]{iChatBaseComponentClass, byte.class}).newInstance(chatCompontentText, (byte) 2); + } + } + Method craftPlayerHandleMethod = craftPlayerClass.getDeclaredMethod("getHandle"); + Object craftPlayerHandle = craftPlayerHandleMethod.invoke(craftPlayer); + Field playerConnectionField = craftPlayerHandle.getClass().getDeclaredField("playerConnection"); + Object playerConnection = playerConnectionField.get(craftPlayerHandle); + Method sendPacketMethod = playerConnection.getClass().getDeclaredMethod("sendPacket", packetClass); + sendPacketMethod.invoke(playerConnection, packet); + + } catch (Exception e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/utils/VersionSupport.java b/spigot/src/main/java/us/ajg0702/queue/spigot/utils/VersionSupport.java new file mode 100644 index 0000000..7ed2280 --- /dev/null +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/utils/VersionSupport.java @@ -0,0 +1,31 @@ +package us.ajg0702.queue.spigot.utils; + +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class VersionSupport { + + public static String getVersion() { + return Bukkit.getVersion().split("\\(MC: ")[1].split("\\)")[0]; + } + public static int getMinorVersion() { + return Integer.parseInt(getVersion().split("\\.")[1]); + } + + /** + * Send the player an actionbar message + * @param ply The {@link org.bukkit.entity.Player Player} to send the actionbar to + * @param message The message to send in the actionbar. + */ + public static void sendActionBar(Player ply, String message) { + // Use spigot version if available, otherwise use packets. + if(getMinorVersion() >= 11) { + ply.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(message)); + } else if(getMinorVersion() >= 8) { + ActionBar.send(ply, message); + } + } + +} diff --git a/spigot/src/main/resources/plugin.yml b/spigot/src/main/resources/plugin.yml new file mode 100644 index 0000000..81632df --- /dev/null +++ b/spigot/src/main/resources/plugin.yml @@ -0,0 +1,13 @@ +main: us.ajg0702.queue.spigot.Main +version: "@VERSION@" +api-version: 1.13 +author: ajgeiss0702 +name: ajQueue +softdepend: [PlaceholderAPI] +commands: + move: + aliases: [server, queue, joinq, joinqueue] + description: Queue for a server + leavequeue: + aliases: [leaveq] + description: Leaves a queue \ No newline at end of file From 696e7c126d539ed128eb73490d2e0eedc6cb104f Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 23 Jul 2021 11:46:29 -0500 Subject: [PATCH 21/56] progress --- .../us/ajg0702/queue/api/EventHandler.java | 5 +++ .../main/java/us/ajg0702/queue/api/Logic.java | 7 ++++ .../us/ajg0702/queue/api/PlatformMethods.java | 8 ---- .../queue/api/players/QueuePlayer.java | 6 +++ .../ajg0702/queue/api/queues/QueueServer.java | 6 +++ .../queue/commands/commands/PlayerSender.java | 2 +- .../commands/leavequeue/LeaveCommand.java | 6 --- .../queue/common/EventHandlerImpl.java | 25 +++++++++++- .../us/ajg0702/queue/common/QueueMain.java | 5 +++ .../queue/common/QueueManagerImpl.java | 10 ++++- .../us/ajg0702/queue/common/TaskManager.java | 6 +++ .../queue/common/players/QueuePlayerImpl.java | 18 ++++++++- .../queue/common/queues/QueueServerImpl.java | 17 +++----- .../us/ajg0702/queue/logic/FreeLogic.java | 5 +++ ...mMethodsImpl.java => VelocityMethods.java} | 15 +++---- .../platforms/velocity/VelocityQueue.java | 39 +++++++++++++++++-- .../java/us/ajg0702/queue/spigot/Main.java | 15 ++++--- 17 files changed, 146 insertions(+), 49 deletions(-) rename platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/{PlatformMethodsImpl.java => VelocityMethods.java} (89%) diff --git a/api/src/main/java/us/ajg0702/queue/api/EventHandler.java b/api/src/main/java/us/ajg0702/queue/api/EventHandler.java index 8156f90..1286746 100644 --- a/api/src/main/java/us/ajg0702/queue/api/EventHandler.java +++ b/api/src/main/java/us/ajg0702/queue/api/EventHandler.java @@ -3,5 +3,10 @@ package us.ajg0702.queue.api; import us.ajg0702.queue.api.players.AdaptedPlayer; public interface EventHandler { + void handleMessage(AdaptedPlayer reciever, byte[] data); + + void onPlayerJoin(AdaptedPlayer player); + + void onPlayerLeave(AdaptedPlayer player); } diff --git a/api/src/main/java/us/ajg0702/queue/api/Logic.java b/api/src/main/java/us/ajg0702/queue/api/Logic.java index e7f5b50..781a944 100644 --- a/api/src/main/java/us/ajg0702/queue/api/Logic.java +++ b/api/src/main/java/us/ajg0702/queue/api/Logic.java @@ -19,4 +19,11 @@ public interface Logic { * @param player The player that is being queued */ QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player); + + /** + * The logic for checking if a player has been disconnected for too long + * @param player The player to check + * @return true if the player has been disconnected for too long and should be removed from the queue + */ + boolean playerDisconnectedTooLong(QueuePlayer player); } diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index af1697c..51f118a 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -9,14 +9,6 @@ import us.ajg0702.queue.api.queues.QueueServer; import java.util.List; public interface PlatformMethods { - /** - * BungeeUtils.sendCustomData(p, "position", pos+""); - * BungeeUtils.sendCustomData(p, "positionof", len+""); - * BungeeUtils.sendCustomData(p, "queuename", pl.aliases.getAlias(s)); - * BungeeUtils.sendCustomData(p, "inqueue", "true"); - * BungeeUtils.sendCustomData(p, "inqueueevent", "true"); - */ - void sendJoinQueueChannelMessages(QueueServer queueServer, QueuePlayer queuePlayer); /** * Sends a plugin message on the plugin messaging channel diff --git a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java index be2db7d..de3e4c4 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java @@ -56,4 +56,10 @@ public interface QueuePlayer { * @return the player's username */ String getName(); + + /** + * Returns the number of miliseconds since this player was online + * @return The number of miliseconds since this player was online + */ + long getTimeSinceOnline(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java index 13e6052..be6fc20 100644 --- a/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java +++ b/api/src/main/java/us/ajg0702/queue/api/queues/QueueServer.java @@ -198,6 +198,12 @@ public interface QueueServer { */ QueuePlayer findPlayer(AdaptedPlayer player); + /** + * Finds the player with this uuid in this queue and returns the representative QueuePlayer + * @return The QueuePlayer representing the player, null if not found + */ + QueuePlayer findPlayer(UUID uuid); + /** * Gets the most ideal server in this group to join diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java b/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java index 7a86d0c..57da37c 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/PlayerSender.java @@ -23,6 +23,6 @@ public class PlayerSender implements ICommandSender { @Override public AdaptedPlayer getHandle() { - return null; + return handle; } } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java index ae16632..336a621 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/leavequeue/LeaveCommand.java @@ -49,13 +49,10 @@ public class LeaveCommand extends BaseCommand { @Override public void execute(ICommandSender sender, String[] args) { - System.out.println("leave command"); if(!sender.isPlayer()) { - System.out.println("not player"); sender.sendMessage(getMessages().getComponent("errors.player-only")); return; } - System.out.println("player"); AdaptedPlayer player = main.getPlatformMethods().senderToPlayer(sender); List servers = main.getQueueManager().getPlayerQueues(player); @@ -64,7 +61,6 @@ public class LeaveCommand extends BaseCommand { return; } - System.out.println("0"); if(servers.size() == 1) { servers.get(0).removePlayer(player); @@ -72,7 +68,6 @@ public class LeaveCommand extends BaseCommand { return; } - System.out.println("1"); if(args.length <= 0) { sender.sendMessage(getMessages().getComponent("commands.leave.more-args", "QUEUES:"+getQueueList(servers))); @@ -91,7 +86,6 @@ public class LeaveCommand extends BaseCommand { return; } - System.out.println("2"); leavingServer.removePlayer(queuePlayer); sender.sendMessage(getMessages().getComponent("commands.leave-queue", "SERVER:"+leavingServer.getAlias())); diff --git a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java index e8615f7..b200990 100644 --- a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -1,10 +1,13 @@ package us.ajg0702.queue.common; +import com.google.common.collect.ImmutableList; import us.ajg0702.queue.api.EventHandler; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.commands.commands.PlayerSender; +import us.ajg0702.queue.common.players.QueuePlayerImpl; import java.io.ByteArrayInputStream; import java.io.DataInputStream; @@ -30,8 +33,6 @@ public class EventHandlerImpl implements EventHandler { String[] args = new String[1]; args[0] = rawData; moveCommand.execute(new PlayerSender(recievingPlayer), args); - //man.addToQueue(player, data); - } if(subchannel.equals("massqueue")) { String inData = in.readUTF(); @@ -89,4 +90,24 @@ public class EventHandlerImpl implements EventHandler { e1.printStackTrace(); } } + + + @Override + public void onPlayerJoin(AdaptedPlayer player) { + ImmutableList queues = main.getQueueManager().findPlayerInQueues(player); + for(QueuePlayer queuePlayer : queues) { + queuePlayer.setPlayer(player); + } + if(queues.size() > 0) { + main.getQueueManager().sendMessage(main.getQueueManager().getSingleServer(player).findPlayer(player)); + } + } + + @Override + public void onPlayerLeave(AdaptedPlayer player) { + ImmutableList queues = main.getQueueManager().findPlayerInQueues(player); + for(QueuePlayer queuePlayer : queues) { + ((QueuePlayerImpl) queuePlayer).setLeaveTime(System.currentTimeMillis()); + } + } } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index c57fc7a..4735f45 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -96,6 +96,11 @@ public class QueueMain { } + public void shutdown() { + taskManager.shutdown(); + } + + private final File dataFolder; diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 5a9b80d..a315f55 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -8,6 +8,7 @@ import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.ServerBuilder; import us.ajg0702.queue.common.players.QueuePlayerImpl; +import us.ajg0702.utils.bungee.BungeeUtils; import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.TimeUtils; @@ -131,7 +132,11 @@ public class QueueManagerImpl implements QueueManager { if(!server.isJoinable(player)) { sendMessage(queuePlayer); } - main.getPlatformMethods().sendJoinQueueChannelMessages(server, queuePlayer); + main.getPlatformMethods().sendPluginMessage(player, "position", pos+""); + main.getPlatformMethods().sendPluginMessage(player, "positionof", len+""); + main.getPlatformMethods().sendPluginMessage(player, "queuename", server.getAlias()); + main.getPlatformMethods().sendPluginMessage(player, "inqueue", "true"); + main.getPlatformMethods().sendPluginMessage(player, "inqueueevent", "true"); return true; } @@ -232,7 +237,6 @@ public class QueueManagerImpl implements QueueManager { for(QueueServer server : servers) { String status = server.getStatusString(); for(QueuePlayer queuePlayer : server.getQueue()) { - if(!getSingleServer(queuePlayer.getPlayer()).equals(server)) continue; int pos = queuePlayer.getPosition(); if(pos == 0) { @@ -243,6 +247,8 @@ public class QueueManagerImpl implements QueueManager { AdaptedPlayer player = queuePlayer.getPlayer(); if(player == null) continue; + if(!getSingleServer(player).equals(server)) continue; + if(!server.isJoinable(player)) { queuePlayer.getPlayer().sendActionBar(msgs.getComponent("spigot.actionbar.offline", "POS:"+pos, diff --git a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java index 2af0064..04bc2b9 100644 --- a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java +++ b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java @@ -9,6 +9,7 @@ import java.util.concurrent.TimeUnit; public class TaskManager { + final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); final ScheduledExecutorService updateExecutor = Executors.newScheduledThreadPool(1); @@ -17,6 +18,11 @@ public class TaskManager { this.main = main; } + public void shutdown() { + executor.shutdown(); + updateExecutor.shutdown(); + } + public String taskStatus() { List> tasks = Arrays.asList(sendTask, updateTask, messageTask, actionBarTask, queueEventTask, reloadServerTask); StringBuilder sb = new StringBuilder(); diff --git a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java index 723e4d1..756b356 100644 --- a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java @@ -47,7 +47,7 @@ public class QueuePlayerImpl implements QueuePlayer { @Nullable @Override public AdaptedPlayer getPlayer() { - if(!player.isConnected()) return null; + if(player != null && !player.isConnected()) player = null; return player; } @@ -73,4 +73,20 @@ public class QueuePlayerImpl implements QueuePlayer { public String getName() { return name; } + + + + @Override + public long getTimeSinceOnline() { + if(player != null && player.isConnected()) { + return 0; + } + return System.currentTimeMillis()-leaveTime; + } + + + private long leaveTime = 0; + public void setLeaveTime(long leaveTime) { + this.leaveTime = leaveTime; + } } diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index d018ba4..c457c2d 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -304,18 +304,13 @@ public class QueueServerImpl implements QueueServer { } @Override - public synchronized QueuePlayer findPlayer(AdaptedPlayer player) { + public QueuePlayer findPlayer(AdaptedPlayer player) { + return findPlayer(player.getUniqueId()); + } + @Override + public synchronized QueuePlayer findPlayer(UUID uuid) { for(QueuePlayer queuePlayer : queue) { - AdaptedPlayer queuedPlayer = queuePlayer.getPlayer(); - if(queuedPlayer == null) continue; - if( - queuedPlayer - .getUniqueId() - .equals( - player - .getUniqueId() - ) - ) { + if(queuePlayer.getUniqueId().toString().equals(uuid.toString())) { return queuePlayer; } } diff --git a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java index 247b742..bf73f3b 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java @@ -15,4 +15,9 @@ public class FreeLogic implements Logic { public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) { return null; } + + @Override + public boolean playerDisconnectedTooLong(QueuePlayer player) { + return true; + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java similarity index 89% rename from platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java rename to platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java index dee0256..bf4bc7e 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/PlatformMethodsImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java @@ -15,6 +15,7 @@ import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.commands.commands.PlayerSender; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; import java.util.ArrayList; @@ -23,25 +24,18 @@ import java.util.Locale; import java.util.Optional; import java.util.logging.Logger; -public class PlatformMethodsImpl implements PlatformMethods { +public class VelocityMethods implements PlatformMethods { final ProxyServer proxyServer; final Logger logger; final VelocityQueue plugin; - public PlatformMethodsImpl(VelocityQueue plugin, ProxyServer proxyServer, Logger logger) { + public VelocityMethods(VelocityQueue plugin, ProxyServer proxyServer, Logger logger) { this.proxyServer = proxyServer; this.logger = logger; this.plugin = plugin; } - @Override - public void sendJoinQueueChannelMessages(QueueServer queueServer, QueuePlayer queuePlayer) { - AdaptedPlayer player = queuePlayer.getPlayer(); - if(player == null) return; - player.sendMessage(Component.text()); - } - @Override public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) { if(player == null) return; @@ -58,6 +52,9 @@ public class PlatformMethodsImpl implements PlatformMethods { @Override public AdaptedPlayer senderToPlayer(ICommandSender sender) { + if(sender instanceof PlayerSender) { + return ((PlayerSender) sender).getHandle(); + } return new VelocityPlayer((Player) sender.getHandle()); } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 1e01ea7..9caf4c0 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -2,14 +2,18 @@ package us.ajg0702.queue.platforms.velocity; import com.google.inject.Inject; import com.velocitypowered.api.command.CommandManager; -import com.velocitypowered.api.event.ResultedEvent; import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.event.player.ServerPostConnectEvent; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.commands.BaseCommand; import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; @@ -58,7 +62,7 @@ public class VelocityQueue { public void onProxyInit(ProxyInitializeEvent e) { main = new QueueMain( logger, - new PlatformMethodsImpl(this, proxyServer, logger), + new VelocityMethods(this, proxyServer, logger), dataFolder ); main.setServerBuilder(new ServerBuilderImpl(main, proxyServer)); @@ -73,6 +77,10 @@ public class VelocityQueue { CommandManager commandManager = proxyServer.getCommandManager(); + proxyServer.getChannelRegistrar().register(MinecraftChannelIdentifier.from("ajqueue:tospigot")); + proxyServer.getChannelRegistrar().register(MinecraftChannelIdentifier.from("ajqueue:toproxy")); + + for(IBaseCommand command : commands) { commandManager.register( commandManager.metaBuilder(command.getName()) @@ -83,18 +91,41 @@ public class VelocityQueue { } } + @Subscribe + public void onProxyShutdown(ProxyShutdownEvent e) { + main.shutdown(); + } + @Subscribe public void onPluginMessage(PluginMessageEvent e) { - System.out.println("Recieved message: "+e.getIdentifier().getId()); + if(e.getIdentifier().getId().equals("ajqueue:tospigot")) { e.setResult(PluginMessageEvent.ForwardResult.handled()); + System.out.println("Skipping message: "+e.getIdentifier().getId()); + return; + } + if(!e.getIdentifier().getId().equals("ajqueue:toproxy")) { + System.out.println("Skipping message: "+e.getIdentifier().getId()); return; } - if(!e.getIdentifier().getId().equals("ajqueue:toproxy")) return; e.setResult(PluginMessageEvent.ForwardResult.handled()); + System.out.println("Processing message: "+e.getIdentifier().getId()); + if(!(e.getTarget() instanceof Player)) return; main.getEventHandler().handleMessage(new VelocityPlayer((Player) e.getTarget()), e.getData()); } + + @SuppressWarnings("UnstableApiUsage") + @Subscribe + public void onJoin(ServerPostConnectEvent e) { + if(e.getPreviousServer() != null) return; // only run if the player just joined + main.getEventHandler().onPlayerJoin(new VelocityPlayer(e.getPlayer())); + } + + @Subscribe + public void onLeave(DisconnectEvent e) { + main.getEventHandler().onPlayerLeave(new VelocityPlayer(e.getPlayer())); + } } diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java index b753a86..9f41511 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java @@ -10,6 +10,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.messaging.PluginMessageListener; +import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.spigot.utils.VersionSupport; import java.util.HashMap; @@ -23,7 +24,7 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener { public void onEnable() { getServer().getMessenger().registerIncomingPluginChannel(this, "ajqueue:tospigot", this); - getServer().getMessenger().registerOutgoingPluginChannel(this, "ajqueue:tobungee"); + getServer().getMessenger().registerOutgoingPluginChannel(this, "ajqueue:toproxy"); this.getCommand("move").setExecutor(new Commands(this)); this.getCommand("leavequeue").setExecutor(new Commands(this)); @@ -62,8 +63,12 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener { HashMap queuebatch = new HashMap<>(); @Override - public void onPluginMessageReceived(String channel, Player player, byte[] message) { - if (!channel.equals("ajqueue:tospigot")) return; + public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] message) { + if (!channel.equals("ajqueue:tospigot")) { + getLogger().info("Skipping message: "+channel); + return; + } + getLogger().info("Processing message: "+channel); ByteArrayDataInput in = ByteStreams.newDataInput(message); @@ -161,7 +166,7 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener { out.writeUTF(subchannel); out.writeUTF(data); - player.sendPluginMessage(this, "ajqueue:tobungee", out.toByteArray()); + player.sendPluginMessage(this, "ajqueue:toproxy", out.toByteArray()); } public void sendMessage(String subchannel, String data) { @@ -170,7 +175,7 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener { out.writeUTF(data); Bukkit.getOnlinePlayers().iterator().next() - .sendPluginMessage(this, "ajqueue:tobungee", out.toByteArray()); + .sendPluginMessage(this, "ajqueue:toproxy", out.toByteArray()); } @EventHandler From 6e5358426118577a2564266e6de4437355e52350 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 23 Jul 2021 11:57:53 -0500 Subject: [PATCH 22/56] create instead of from --- .../java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 9caf4c0..dcba9d3 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -77,7 +77,7 @@ public class VelocityQueue { CommandManager commandManager = proxyServer.getCommandManager(); - proxyServer.getChannelRegistrar().register(MinecraftChannelIdentifier.from("ajqueue:tospigot")); + proxyServer.getChannelRegistrar().register(MinecraftChannelIdentifier.create("ajqueue", "tospigot")); proxyServer.getChannelRegistrar().register(MinecraftChannelIdentifier.from("ajqueue:toproxy")); From a88a14234896a4a6c54085f5e31d299ae13d6763 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Tue, 27 Jul 2021 18:41:55 -0700 Subject: [PATCH 23/56] progress --- .../queue/api/players/QueuePlayer.java | 6 ++ .../ajg0702/queue/api/util/QueueLogger.java | 9 +++ build.gradle.kts | 24 +----- common/build.gradle.kts | 4 +- .../us/ajg0702/queue/common/QueueMain.java | 34 +++++--- .../queue/common/QueueManagerImpl.java | 48 ++++++++++- .../queue/common/players/QueuePlayerImpl.java | 11 ++- .../queue/common/queues/QueueServerImpl.java | 4 +- .../queue/common/utils/LogConverter.java | 32 ++++++++ .../us/ajg0702/queue/logic/FreeLogic.java | 2 +- ...{LogicGetter.java => LogicGetterImpl.java} | 2 +- .../platforms/velocity/VelocityLogger.java | 39 +++++++++ .../platforms/velocity/VelocityMethods.java | 19 ++--- .../platforms/velocity/VelocityQueue.java | 15 ++-- premium/build.gradle.kts | 50 ++++++++++++ .../ajg0702/queue/logic/LogicGetterImpl.java | 18 +++++ .../queue/logic/PremiumAliasManager.java | 37 +++++++++ .../us/ajg0702/queue/logic/PremiumLogic.java | 80 +++++++++++++++++++ .../logic/permissions/PermissionGetter.java | 20 +++++ settings.gradle.kts | 3 +- .../us/ajg0702/queue/spigot/Commands.java | 4 +- .../us/ajg0702/queue/spigot/Placeholders.java | 4 +- .../spigot/{Main.java => SpigotMain.java} | 25 +----- spigot/src/main/resources/plugin.yml | 2 +- 24 files changed, 404 insertions(+), 88 deletions(-) create mode 100644 api/src/main/java/us/ajg0702/queue/api/util/QueueLogger.java create mode 100644 common/src/main/java/us/ajg0702/queue/common/utils/LogConverter.java rename common/src/main/java/us/ajg0702/queue/logic/{LogicGetter.java => LogicGetterImpl.java} (83%) create mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityLogger.java create mode 100644 premium/build.gradle.kts create mode 100644 premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java create mode 100644 premium/src/main/java/us/ajg0702/queue/logic/PremiumAliasManager.java create mode 100644 premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java create mode 100644 premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java rename spigot/src/main/java/us/ajg0702/queue/spigot/{Main.java => SpigotMain.java} (86%) diff --git a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java index de3e4c4..ed5d6e9 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java @@ -62,4 +62,10 @@ public interface QueuePlayer { * @return The number of miliseconds since this player was online */ long getTimeSinceOnline(); + + /** + * Gets the max number of seconds this player is allowed to be offline before getting removed from the queue. + * @return + */ + int getMaxOfflineTime(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/util/QueueLogger.java b/api/src/main/java/us/ajg0702/queue/api/util/QueueLogger.java new file mode 100644 index 0000000..412b468 --- /dev/null +++ b/api/src/main/java/us/ajg0702/queue/api/util/QueueLogger.java @@ -0,0 +1,9 @@ +package us.ajg0702.queue.api.util; + +public interface QueueLogger { + void warn(String message); + void warning(String message); + void info(String message); + void error(String message); + void severe(String message); +} diff --git a/build.gradle.kts b/build.gradle.kts index 2233619..7b470d8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,36 +22,14 @@ allprojects { } -repositories { - mavenCentral() - mavenLocal() - - maven { url = uri("https://jitpack.io") } - maven { url = uri("https://gitlab.com/api/v4/projects/19978391/packages/maven") } - maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } - maven { url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/") } - maven { url = uri("https://repo.codemc.org/repository/maven-public") } - maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } - maven { url = uri("https://repo.codemc.io/repository/nms/") } - maven { url = uri("https://repo.ajg0702.us") } -} dependencies { testImplementation("junit:junit:4.12") + implementation(project(":free")) } - - -tasks.shadowJar { - relocate("us.ajg0702.utils", "us.ajg0702.queue.utils") - relocate("org.bstats", "us.ajg0702.bstats") - relocate("net.kyori", "us.ajg0702.queue.kyori") - relocate("org.spongepowered.configurate", "us.ajg0702.queue.configurate") - archiveFileName.set("${archiveBaseName.get()}-${archiveVersion.get()}.${archiveExtension.get()}") -} - publishing { publications { create("mavenJava") { diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 43b4b32..e62ad3b 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -12,10 +12,12 @@ repositories { dependencies { compileOnly("net.kyori:adventure-api:4.8.1") + compileOnly("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") + compileOnly("com.google.guava:guava:30.1.1-jre") compileOnly("us.ajg0702:ajUtils:1.1.6") - compileOnly("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") + compileOnly("org.slf4j:slf4j-log4j12:1.7.29") compileOnly("org.spongepowered:configurate-yaml:4.0.0") diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 4735f45..8b860b9 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -3,7 +3,9 @@ package us.ajg0702.queue.common; import org.spongepowered.configurate.ConfigurateException; import us.ajg0702.queue.api.*; import us.ajg0702.queue.api.server.ServerBuilder; -import us.ajg0702.queue.logic.LogicGetter; +import us.ajg0702.queue.api.util.QueueLogger; +import us.ajg0702.queue.common.utils.LogConverter; +import us.ajg0702.queue.logic.LogicGetterImpl; import us.ajg0702.utils.common.Config; import us.ajg0702.utils.common.Messages; @@ -12,10 +14,13 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.concurrent.*; -import java.util.logging.Logger; public class QueueMain { + private static QueueMain instance; + public static QueueMain getInstance() { + return instance; + } private double timeBetweenPlayers; public double getTimeBetweenPlayers() { @@ -54,8 +59,8 @@ public class QueueMain { return platformMethods; } - private final Logger logger; - public Logger getLogger() { + private final QueueLogger logger; + public QueueLogger getLogger() { return logger; } @@ -104,7 +109,18 @@ public class QueueMain { private final File dataFolder; - public QueueMain(Logger logger, PlatformMethods platformMethods, File dataFolder) { + public QueueMain(QueueLogger logger, PlatformMethods platformMethods, File dataFolder) { + + if(instance != null) { + try { + throw new Exception("ajQueue QueueMain is being initialized when there is already one! Still initializing it, but this can cause issues."); + } catch(Exception e) { + e.printStackTrace(); + } + } + instance = this; + + this.logger = logger; this.platformMethods = platformMethods; this.dataFolder = dataFolder; @@ -112,7 +128,7 @@ public class QueueMain { constructMessages(); try { - config = new Config(dataFolder, logger); + config = new Config(dataFolder, new LogConverter(logger)); } catch (ConfigurateException e) { logger.warning("Unable to load config:"); e.printStackTrace(); @@ -123,8 +139,8 @@ public class QueueMain { queueManager = new QueueManagerImpl(this); - logic = new LogicGetter().constructLogic(); - aliasManager = new LogicGetter().constructAliasManager(config); + logic = new LogicGetterImpl().constructLogic(); + aliasManager = new LogicGetterImpl().constructAliasManager(config); taskManager.rescheduleTasks(); @@ -196,6 +212,6 @@ public class QueueMain { d.put("max-tries-reached", "&cUnable to connect to {SERVER}. Max retries reached."); d.put("auto-queued", "&aYou've been auto-queued for {SERVER} because you were kicked."); - messages = new Messages(dataFolder, logger, d); + messages = new Messages(dataFolder, new LogConverter(logger), d); } } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index a315f55..350b604 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -8,6 +8,7 @@ import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.ServerBuilder; import us.ajg0702.queue.common.players.QueuePlayerImpl; +import us.ajg0702.queue.common.queues.QueueServerImpl; import us.ajg0702.utils.bungee.BungeeUtils; import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.TimeUtils; @@ -31,7 +32,39 @@ public class QueueManagerImpl implements QueueManager { serverBuilderFuture.thenRunAsync(() -> { try { servers = serverBuilderFuture.get().buildServers(); - // TODO: groups + List groupsRaw = main.getConfig().getStringList("server-groups"); + for(String groupRaw : groupsRaw) { + if(groupRaw.isEmpty()) { + main.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); + continue; + } + + String groupName = groupRaw.split(":")[0]; + String[] serversRaw = groupRaw.split(":")[1].split(","); + + if(main.getServerBuilder().getServer(groupName) != null) { + main.getLogger().warning("The name of a group ('"+groupName+"') cannot be the same as the name of a server!"); + continue; + } + + List groupServers = new ArrayList<>(); + + for(String serverRaw : serversRaw) { + AdaptedServer si = main.getServerBuilder().getServer(serverRaw); + if(si == null) { + main.getLogger().warning("Could not find server named '"+serverRaw+"' in servergroup '"+groupName+"'!"); + continue; + } + groupServers.add(si); + } + + if(groupServers.size() == 0) { + main.getLogger().warning("Server group '"+groupName+"' has no servers! Ignoring it."); + continue; + } + + servers.add(new QueueServerImpl(groupName, main, groupServers)); + } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } @@ -81,7 +114,8 @@ public class QueueManagerImpl implements QueueManager { } else { int priority = player.hasPermission("ajqueue.priority") || player.hasPermission("ajqueue.serverpriority."+server.getName()) ? 1 : 0; - queuePlayer = new QueuePlayerImpl(player, server, priority); + int maxOfflineTime = player.hasPermission("ajqueue.stayqueued") ? 60 : 0; + queuePlayer = new QueuePlayerImpl(player, server, priority, maxOfflineTime); if( priority == 1 && server.getQueue().size() > 0 @@ -180,7 +214,9 @@ public class QueueManagerImpl implements QueueManager { @Override public String getQueuedName(AdaptedPlayer player) { - return getSingleServer(player).getName(); + QueueServer server = getSingleServer(player); + if(server == null) return main.getMessages().getString("placeholders.queued.none"); + return server.getName(); } @Override @@ -367,6 +403,12 @@ public class QueueManagerImpl implements QueueManager { } for(QueueServer server : sendingServers) { + for(QueuePlayer queuePlayer : server.getQueue()) { + if(queuePlayer.getPlayer() != null) continue; + if(main.getLogic().playerDisconnectedTooLong(queuePlayer)) { + server.removePlayer(queuePlayer); + } + } if(!server.isOnline()) continue; if(server.getQueue().size() == 0) continue; diff --git a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java index 756b356..14385f9 100644 --- a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java @@ -18,7 +18,9 @@ public class QueuePlayerImpl implements QueuePlayer { private final UUID uuid; private final String name; - public QueuePlayerImpl(AdaptedPlayer player, QueueServer server, int highestPriority) { + private final int maxOfflineTime; + + public QueuePlayerImpl(AdaptedPlayer player, QueueServer server, int highestPriority, int maxOfflineTime) { this.player = player; this.server = server; @@ -26,6 +28,8 @@ public class QueuePlayerImpl implements QueuePlayer { uuid = player.getUniqueId(); name = player.getName(); + + this.maxOfflineTime = maxOfflineTime; } @Override @@ -84,6 +88,11 @@ public class QueuePlayerImpl implements QueuePlayer { return System.currentTimeMillis()-leaveTime; } + @Override + public int getMaxOfflineTime() { + return maxOfflineTime; + } + private long leaveTime = 0; public void setLeaveTime(long leaveTime) { diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index c457c2d..f352ff8 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -244,12 +244,12 @@ public class QueueServerImpl implements QueueServer { } @Override - public synchronized void addPlayer(QueuePlayer player) { + public void addPlayer(QueuePlayer player) { addPlayer(player, -1); } @Override - public void addPlayer(QueuePlayer player, int position) { + public synchronized void addPlayer(QueuePlayer player, int position) { if(!player.getQueueServer().equals(this) || queue.contains(player)) return; if(position > 0) { queue.add(position, player); diff --git a/common/src/main/java/us/ajg0702/queue/common/utils/LogConverter.java b/common/src/main/java/us/ajg0702/queue/common/utils/LogConverter.java new file mode 100644 index 0000000..3e9449d --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/common/utils/LogConverter.java @@ -0,0 +1,32 @@ +package us.ajg0702.queue.common.utils; + +import org.jetbrains.annotations.NotNull; +import us.ajg0702.queue.api.util.QueueLogger; + +import java.util.logging.LogRecord; +import java.util.logging.Logger; + +public class LogConverter extends Logger { + private final QueueLogger logger; + public LogConverter(QueueLogger logger) { + super("ajqueue-convert", null); + this.logger = logger; + } + + @Override + public void log(@NotNull LogRecord logRecord) { + String message = logRecord.getMessage(); + switch(logRecord.getLevel().getName()) { + case "OFF": + break; + case "SEVERE": + logger.error(message); + case "WARNING": + logger.warn(message); + case "INFO": + logger.info(message); + default: + logger.info(message); + } + } +} diff --git a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java index bf73f3b..948da26 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java @@ -18,6 +18,6 @@ public class FreeLogic implements Logic { @Override public boolean playerDisconnectedTooLong(QueuePlayer player) { - return true; + return 60000L < player.getTimeSinceOnline(); } } diff --git a/common/src/main/java/us/ajg0702/queue/logic/LogicGetter.java b/common/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java similarity index 83% rename from common/src/main/java/us/ajg0702/queue/logic/LogicGetter.java rename to common/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java index 9bf6f83..611dbff 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/LogicGetter.java +++ b/common/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java @@ -4,7 +4,7 @@ import us.ajg0702.queue.api.AliasManager; import us.ajg0702.queue.api.Logic; import us.ajg0702.utils.common.Config; -public class LogicGetter implements us.ajg0702.queue.api.LogicGetter { +public class LogicGetterImpl implements us.ajg0702.queue.api.LogicGetter { @Override public Logic constructLogic() { diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityLogger.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityLogger.java new file mode 100644 index 0000000..ce3706d --- /dev/null +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityLogger.java @@ -0,0 +1,39 @@ +package us.ajg0702.queue.platforms.velocity; + + +import org.slf4j.Logger; +import us.ajg0702.queue.api.util.QueueLogger; + +public class VelocityLogger implements QueueLogger { + + private final Logger logger; + + protected VelocityLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void warn(String message) { + logger.warn(message); + } + + @Override + public void warning(String message) { + logger.warn(message); + } + + @Override + public void info(String message) { + logger.info(message); + } + + @Override + public void error(String message) { + logger.error(message); + } + + @Override + public void severe(String message) { + logger.error(message); + } +} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java index bf4bc7e..784f943 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java @@ -5,16 +5,15 @@ import com.google.common.io.ByteStreams; import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; -import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import com.velocitypowered.api.proxy.server.RegisteredServer; -import net.kyori.adventure.text.Component; + import us.ajg0702.queue.api.PlatformMethods; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; -import us.ajg0702.queue.api.players.QueuePlayer; -import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.util.QueueLogger; import us.ajg0702.queue.commands.commands.PlayerSender; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; @@ -22,15 +21,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Optional; -import java.util.logging.Logger; public class VelocityMethods implements PlatformMethods { final ProxyServer proxyServer; - final Logger logger; + final QueueLogger logger; final VelocityQueue plugin; - public VelocityMethods(VelocityQueue plugin, ProxyServer proxyServer, Logger logger) { + public VelocityMethods(VelocityQueue plugin, ProxyServer proxyServer, QueueLogger logger) { this.proxyServer = proxyServer; this.logger = logger; this.plugin = plugin; @@ -46,8 +44,11 @@ public class VelocityMethods implements PlatformMethods { for(String s : data) { out.writeUTF( s ); } - - velocityPlayer.sendPluginMessage(MinecraftChannelIdentifier.from("ajqueue:tospigot"), out.toByteArray()); + Optional server = velocityPlayer.getCurrentServer(); + if(!server.isPresent()) { + throw new IllegalStateException("No server to send data to"); + } + server.get().sendPluginMessage(MinecraftChannelIdentifier.from("ajqueue:tospigot"), out.toByteArray()); } @Override diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index dcba9d3..3db804e 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -13,7 +13,6 @@ import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; -import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.commands.BaseCommand; import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; @@ -29,7 +28,8 @@ import java.io.File; import java.nio.file.Path; import java.util.Arrays; import java.util.List; -import java.util.logging.Logger; + +import org.slf4j.Logger; @Plugin( id = "ajqueue", @@ -42,7 +42,7 @@ import java.util.logging.Logger; public class VelocityQueue { final ProxyServer proxyServer; - final Logger logger; + final VelocityLogger logger; QueueMain main; @@ -51,7 +51,7 @@ public class VelocityQueue { @Inject public VelocityQueue(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataFolder) { this.proxyServer = proxyServer; - this.logger = logger; + this.logger = new VelocityLogger(logger); this.dataFolder = dataFolder.toFile(); } @@ -104,14 +104,9 @@ public class VelocityQueue { System.out.println("Skipping message: "+e.getIdentifier().getId()); return; } - if(!e.getIdentifier().getId().equals("ajqueue:toproxy")) { - System.out.println("Skipping message: "+e.getIdentifier().getId()); - return; - } + if(!e.getIdentifier().getId().equals("ajqueue:toproxy")) return; e.setResult(PluginMessageEvent.ForwardResult.handled()); - System.out.println("Processing message: "+e.getIdentifier().getId()); - if(!(e.getTarget() instanceof Player)) return; main.getEventHandler().handleMessage(new VelocityPlayer((Player) e.getTarget()), e.getData()); diff --git a/premium/build.gradle.kts b/premium/build.gradle.kts new file mode 100644 index 0000000..59952ae --- /dev/null +++ b/premium/build.gradle.kts @@ -0,0 +1,50 @@ +plugins { + `java-library` + id("com.github.johnrengelman.shadow") + `maven-publish` +} + +group = "us.ajg0702.queue" + +repositories { + mavenCentral() + maven { url = uri("https://repo.ajg0702.us") } +} + +dependencies { + implementation(project(":free")) + + compileOnly(project(":api")) + compileOnly(project(":common")) + + compileOnly("com.google.guava:guava:30.1.1-jre") + + compileOnly("us.ajg0702:ajUtils:1.1.6") + + compileOnly("net.kyori:adventure-api:4.8.1") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["jar"]) + } + } + + repositories { + + val mavenUrl = "https://repo.ajg0702.us/releases" + + if(!System.getenv("REPO_TOKEN").isNullOrEmpty()) { + maven { + url = uri(mavenUrl) + name = "ajRepo" + + credentials { + username = "plugins" + password = System.getenv("REPO_TOKEN") + } + } + } + } +} \ No newline at end of file diff --git a/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java b/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java new file mode 100644 index 0000000..2bb3814 --- /dev/null +++ b/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java @@ -0,0 +1,18 @@ +package us.ajg0702.queue.logic; + +import us.ajg0702.queue.api.AliasManager; +import us.ajg0702.queue.api.Logic; +import us.ajg0702.queue.api.LogicGetter; +import us.ajg0702.utils.common.Config; + +public class LogicGetterImpl implements LogicGetter { + @Override + public Logic constructLogic() { + return new PremiumLogic(); + } + + @Override + public AliasManager constructAliasManager(Config config) { + return new PremiumAliasManager(config); + } +} diff --git a/premium/src/main/java/us/ajg0702/queue/logic/PremiumAliasManager.java b/premium/src/main/java/us/ajg0702/queue/logic/PremiumAliasManager.java new file mode 100644 index 0000000..324de46 --- /dev/null +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumAliasManager.java @@ -0,0 +1,37 @@ +package us.ajg0702.queue.logic; + +import us.ajg0702.queue.api.AliasManager; +import us.ajg0702.utils.common.Config; + +import java.util.List; + +public class PremiumAliasManager implements AliasManager { + + private final Config config; + + protected PremiumAliasManager(Config config) { + this.config = config; + } + + @Override + public String getAlias(String server) { + List aliasesraw = config.getStringList("server-aliases"); + for(String aliasraw : aliasesraw) { + String realname = aliasraw.split(":")[0]; + if(!realname.equalsIgnoreCase(server)) continue; + return aliasraw.split(":")[1]; + } + return server; + } + + @Override + public String getServer(String alias) { + List aliasesraw = config.getStringList("server-aliases"); + for(String aliasraw : aliasesraw) { + String salias = aliasraw.split(":")[1]; + if(!alias.equalsIgnoreCase(salias)) continue; + return aliasraw.split(":")[0]; + } + return alias; + } +} diff --git a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java new file mode 100644 index 0000000..cd6df55 --- /dev/null +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java @@ -0,0 +1,80 @@ +package us.ajg0702.queue.logic; + +import com.google.common.collect.ImmutableList; +import us.ajg0702.queue.api.Logic; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.util.QueueLogger; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.common.players.QueuePlayerImpl; +import us.ajg0702.queue.logic.permissions.PermissionGetter; + +public class PremiumLogic implements Logic { + @Override + public boolean isPremium() { + return true; + } + + @Override + public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) { + int maxOfflineTime = PermissionGetter.getMaxOfflineTime(player); + + QueueMain main = QueueMain.getInstance(); + + if(player.hasPermission("ajqueue.bypass") || player.hasPermission("ajqueue.serverbypass."+server.getName())) { + QueuePlayer queuePlayer = new QueuePlayerImpl(player, server, Integer.MAX_VALUE, maxOfflineTime); + server.addPlayer(queuePlayer, 0); + main.getQueueManager().sendPlayers(server); + return queuePlayer; + } + + int priority = PermissionGetter.getPriority(player); + int serverPriority = PermissionGetter.getServerPriotity(server.getName(), player); + + int highestPriority = Math.max(priority, serverPriority); + + QueuePlayer queuePlayer = new QueuePlayerImpl(player, server, highestPriority, maxOfflineTime); + + QueueLogger logger = main.getLogger(); + boolean debug = main.getConfig().getBoolean("priority-queue-debug"); + + if(debug) { + logger.info("[priority] "+player.getName()+" highestPriority: "+highestPriority); + logger.info("[priority] "+player.getName()+" priority: "+priority); + logger.info("[priority] "+player.getName()+" serverPriority: "+serverPriority); + } + + if(highestPriority <= 0) { + if(debug) { + logger.info("[priority] "+player.getName()+" No priority" ); + } + server.addPlayer(queuePlayer); + return queuePlayer; + } + + ImmutableList list = server.getQueue(); + + for(int i = 0; i < list.size(); i++) { + QueuePlayer pl = list.get(i); + if(pl.getPriority() < highestPriority) { + if(debug) { + logger.info("[priority] "+player.getName()+" Adding to: "+i); + } + server.addPlayer(queuePlayer, i); + return queuePlayer; + } + } + + if(debug) { + logger.info("[priority] "+player.getName()+" Cant go infront of anyone" ); + } + server.addPlayer(queuePlayer); + return queuePlayer; + } + + @Override + public boolean playerDisconnectedTooLong(QueuePlayer player) { + return player.getTimeSinceOnline() > player.getMaxOfflineTime(); + } +} diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java new file mode 100644 index 0000000..4b5140b --- /dev/null +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java @@ -0,0 +1,20 @@ +package us.ajg0702.queue.logic.permissions; + +import us.ajg0702.queue.api.players.AdaptedPlayer; + +public class PermissionGetter { + + //TODO: all of this + + public static int getMaxOfflineTime(AdaptedPlayer player) { + return -1; + } + + public static int getPriority(AdaptedPlayer player) { + return -1; + } + + public static int getServerPriotity(String server, AdaptedPlayer player) { + return -1; + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 0b2c159..1c312a2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,4 +7,5 @@ include(":spigot") include(":platforms:velocity") -include(":free") \ No newline at end of file +include(":free") +include(":premium") \ No newline at end of file diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java index 356fd41..30f0db3 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java @@ -9,8 +9,8 @@ import org.bukkit.entity.Player; public class Commands implements CommandExecutor { - Main pl; - public Commands(Main pl) { + SpigotMain pl; + public Commands(SpigotMain pl) { this.pl = pl; } diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java index b7a21ff..cecb7a4 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java @@ -14,7 +14,7 @@ import java.util.Iterator; */ public class Placeholders extends PlaceholderExpansion { - private Main plugin; + private SpigotMain plugin; /** * Since we register the expansion inside our own plugin, we @@ -24,7 +24,7 @@ public class Placeholders extends PlaceholderExpansion { * @param plugin * The instance of our plugin. */ - public Placeholders(Main plugin){ + public Placeholders(SpigotMain plugin){ this.plugin = plugin; } diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java b/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java similarity index 86% rename from spigot/src/main/java/us/ajg0702/queue/spigot/Main.java rename to spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java index 9f41511..23d3284 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Main.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java @@ -15,7 +15,7 @@ import us.ajg0702.queue.spigot.utils.VersionSupport; import java.util.HashMap; -public class Main extends JavaPlugin implements PluginMessageListener,Listener { +public class SpigotMain extends JavaPlugin implements PluginMessageListener,Listener { boolean papi = false; Placeholders placeholders; @@ -64,30 +64,12 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener { @Override public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] message) { - if (!channel.equals("ajqueue:tospigot")) { - getLogger().info("Skipping message: "+channel); - return; - } - getLogger().info("Processing message: "+channel); + if (!channel.equals("ajqueue:tospigot")) return; ByteArrayDataInput in = ByteStreams.newDataInput(message); String subchannel = in.readUTF(); - - if(subchannel.equals("actionbar")) { - String playername = in.readUTF(); - Player p = Bukkit.getPlayer(playername); - if(p == null) return; - - String data = in.readUTF(); - final String text = data.split(";time=")[0]; - //getLogger().info("recieved actionbar for "+player.getName()+": "+text); - VersionSupport.sendActionBar(p, text); - - /*QueueActionbarUpdateEvent e = new QueueActionbarUpdateEvent(p); - Bukkit.getPluginManager().callEvent(e);*/ - return; - } + if(subchannel.equals("inqueueevent")) { String playername = in.readUTF(); Player p = Bukkit.getPlayer(playername); @@ -161,7 +143,6 @@ public class Main extends JavaPlugin implements PluginMessageListener,Listener { public void sendMessage(Player player, String subchannel, String data) { - //getLogger().info("Sending message. "+subchannel+" "+data); ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF(subchannel); out.writeUTF(data); diff --git a/spigot/src/main/resources/plugin.yml b/spigot/src/main/resources/plugin.yml index 81632df..afc875e 100644 --- a/spigot/src/main/resources/plugin.yml +++ b/spigot/src/main/resources/plugin.yml @@ -1,4 +1,4 @@ -main: us.ajg0702.queue.spigot.Main +main: us.ajg0702.queue.spigot.SpigotMain version: "@VERSION@" api-version: 1.13 author: ajgeiss0702 From 15fd7f61ad994d08e845872146f872ab513f9ce2 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Wed, 28 Jul 2021 14:25:05 -0700 Subject: [PATCH 24/56] premium logic finished --- .../us/ajg0702/queue/api/PlatformMethods.java | 10 ++- .../queue/api/players/AdaptedPlayer.java | 3 + .../queue/api/players/QueuePlayer.java | 2 +- .../commands/listqueues/ListCommand.java | 2 +- .../queue/commands/commands/manage/Pause.java | 1 - .../queue/commands/commands/manage/Send.java | 2 - .../queue/common/EventHandlerImpl.java | 2 +- .../queue/common/QueueManagerImpl.java | 1 - .../us/ajg0702/queue/common/TaskManager.java | 4 +- .../us/ajg0702/queue/logic/FreeLogic.java | 2 +- .../platforms/velocity/VelocityMethods.java | 12 +++- .../velocity/players/VelocityPlayer.java | 6 ++ .../velocity/server/VelocityServer.java | 1 - premium/build.gradle.kts | 8 +++ .../ajg0702/queue/logic/LogicGetterImpl.java | 3 +- .../us/ajg0702/queue/logic/PremiumLogic.java | 25 ++++++-- .../logic/permissions/PermissionGetter.java | 64 +++++++++++++++++-- .../logic/permissions/PermissionHook.java | 11 ++++ .../logic/permissions/hooks/BuiltIn.java | 34 ++++++++++ .../permissions/hooks/LuckPermsHook.java | 51 +++++++++++++++ .../us/ajg0702/queue/spigot/Commands.java | 6 +- .../java/us/ajg0702/queue/spigot/Config.java | 6 +- .../us/ajg0702/queue/spigot/Placeholders.java | 53 ++++++--------- .../spigot/QueueScoreboardActivator.java | 5 +- .../us/ajg0702/queue/spigot/SpigotMain.java | 33 +++++----- .../ajg0702/queue/spigot/utils/ActionBar.java | 11 ++-- 26 files changed, 267 insertions(+), 91 deletions(-) create mode 100644 premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionHook.java create mode 100644 premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/BuiltIn.java create mode 100644 premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/LuckPermsHook.java diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index 51f118a..8cd0433 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -3,8 +3,6 @@ package us.ajg0702.queue.api; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; -import us.ajg0702.queue.api.players.QueuePlayer; -import us.ajg0702.queue.api.queues.QueueServer; import java.util.List; @@ -34,6 +32,14 @@ public interface PlatformMethods { List getServerNames(); + String getImplementationName(); List getCommands(); + + /** + * Checks if a plugin is installed + * @param pluginName The name of the plugin to check for (case in-sensitive) + * @return if the plugin is on the server + */ + boolean hasPlugin(String pluginName); } diff --git a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java index 6a8ced7..7e725e4 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/AdaptedPlayer.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.util.Handle; +import java.util.List; import java.util.UUID; /** @@ -70,4 +71,6 @@ public interface AdaptedPlayer extends Handle, Audience { * @return the player's username */ String getName(); + + List getPermissions(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java index ed5d6e9..7008553 100644 --- a/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java +++ b/api/src/main/java/us/ajg0702/queue/api/players/QueuePlayer.java @@ -65,7 +65,7 @@ public interface QueuePlayer { /** * Gets the max number of seconds this player is allowed to be offline before getting removed from the queue. - * @return + * @return the max number of seconds this player can be offline before being removed from the queue */ int getMaxOfflineTime(); } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java index 8c83202..1c6f35f 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java @@ -68,7 +68,7 @@ public class ListCommand extends BaseCommand { m = m.append(Component.text("\n")); m = m.append(main.getMessages().getComponent("commands.listqueues.format", "COLOR:" + main.getMessages().color(color), - "NAME:" + s.getName(), + "NAME:" + s.getAlias(), "COUNT:" + s.getQueue().size(), "STATUS:" + s.getStatusString(spp) )); diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java index d25575c..1813c3d 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java @@ -1,7 +1,6 @@ package us.ajg0702.queue.commands.commands.manage; import com.google.common.collect.ImmutableList; -import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.commands.SubCommand; diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java index 37cc4bf..1eea23e 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java @@ -4,14 +4,12 @@ import com.google.common.collect.ImmutableList; import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; -import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.commands.SubCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.Messages; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class Send extends SubCommand { diff --git a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java index b200990..1853b32 100644 --- a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -15,7 +15,7 @@ import java.io.IOException; public class EventHandlerImpl implements EventHandler { - QueueMain main; + final QueueMain main; public EventHandlerImpl(QueueMain main) { this.main = main; } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 350b604..07cb3cf 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -9,7 +9,6 @@ import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.ServerBuilder; import us.ajg0702.queue.common.players.QueuePlayerImpl; import us.ajg0702.queue.common.queues.QueueServerImpl; -import us.ajg0702.utils.bungee.BungeeUtils; import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.TimeUtils; diff --git a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java index 04bc2b9..f972ea1 100644 --- a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java +++ b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java @@ -50,7 +50,7 @@ public class TaskManager { updateTask = scheduleAtFixedRate(updateExecutor, main.getQueueManager()::updateServers, - 0L, + 500L, (long) (Math.max(main.getTimeBetweenPlayers(), 2)*1000L), TimeUnit.MILLISECONDS ); @@ -88,7 +88,7 @@ public class TaskManager { sendTask.cancel(false); } if(updateTask != null && !updateTask.isCancelled()) { - updateTask.cancel(false); + updateTask.cancel(true); } if(messageTask != null && !messageTask.isCancelled()) { messageTask.cancel(false); diff --git a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java index 948da26..fbfe2d3 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java @@ -18,6 +18,6 @@ public class FreeLogic implements Logic { @Override public boolean playerDisconnectedTooLong(QueuePlayer player) { - return 60000L < player.getTimeSinceOnline(); + return player.getMaxOfflineTime() < player.getTimeSinceOnline(); } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java index 784f943..9882ad4 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java @@ -38,7 +38,7 @@ public class VelocityMethods implements PlatformMethods { public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) { if(player == null) return; Player velocityPlayer = ((VelocityPlayer) player).getHandle(); - ByteArrayDataOutput out = ByteStreams.newDataOutput(); + @SuppressWarnings("UnstableApiUsage") ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF( channel ); out.writeUTF(player.getName()); for(String s : data) { @@ -109,8 +109,18 @@ public class VelocityMethods implements PlatformMethods { return names; } + @Override + public String getImplementationName() { + return "velocity"; + } + @Override public List getCommands() { return plugin.commands; } + + @Override + public boolean hasPlugin(String pluginName) { + return proxyServer.getPluginManager().getPlugin(pluginName.toLowerCase(Locale.ROOT)).isPresent(); + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java index 0d72b6d..e266045 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.server.AdaptedServer; +import java.util.List; import java.util.Optional; import java.util.UUID; @@ -70,6 +71,11 @@ public class VelocityPlayer implements AdaptedPlayer, Audience { return handle.getUsername(); } + @Override + public List getPermissions() { + throw new IllegalStateException("AdaptedPlayer#getPermissions cannot be used on velocity"); + } + @Override public Player getHandle() { return handle; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java index 5d0eac1..c43333c 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java @@ -10,7 +10,6 @@ import us.ajg0702.queue.api.server.AdaptedServerPing; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/premium/build.gradle.kts b/premium/build.gradle.kts index 59952ae..8d76ba5 100644 --- a/premium/build.gradle.kts +++ b/premium/build.gradle.kts @@ -9,6 +9,8 @@ group = "us.ajg0702.queue" repositories { mavenCentral() maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } + } dependencies { @@ -22,6 +24,12 @@ dependencies { compileOnly("us.ajg0702:ajUtils:1.1.6") compileOnly("net.kyori:adventure-api:4.8.1") + + compileOnly("net.luckperms:api:5.0") +} + +tasks.shadowJar { + archiveFileName.set("${baseName}-${version}.${extension}") } publishing { diff --git a/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java b/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java index 2bb3814..3cc1a27 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java @@ -3,12 +3,13 @@ package us.ajg0702.queue.logic; import us.ajg0702.queue.api.AliasManager; import us.ajg0702.queue.api.Logic; import us.ajg0702.queue.api.LogicGetter; +import us.ajg0702.queue.common.QueueMain; import us.ajg0702.utils.common.Config; public class LogicGetterImpl implements LogicGetter { @Override public Logic constructLogic() { - return new PremiumLogic(); + return new PremiumLogic(QueueMain.getInstance()); } @Override diff --git a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java index cd6df55..bd94188 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java @@ -11,6 +11,12 @@ import us.ajg0702.queue.common.players.QueuePlayerImpl; import us.ajg0702.queue.logic.permissions.PermissionGetter; public class PremiumLogic implements Logic { + + private final PermissionGetter permissionGetter; + public PremiumLogic(QueueMain main) { + permissionGetter = new PermissionGetter(main); + } + @Override public boolean isPremium() { return true; @@ -18,27 +24,34 @@ public class PremiumLogic implements Logic { @Override public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) { - int maxOfflineTime = PermissionGetter.getMaxOfflineTime(player); + int maxOfflineTime = permissionGetter.getMaxOfflineTime(player); QueueMain main = QueueMain.getInstance(); + QueueLogger logger = main.getLogger(); + boolean debug = main.getConfig().getBoolean("priority-queue-debug"); + if(player.hasPermission("ajqueue.bypass") || player.hasPermission("ajqueue.serverbypass."+server.getName())) { + if(debug) { + logger.info("[priority] "+player.getName()+" bypass"); + } QueuePlayer queuePlayer = new QueuePlayerImpl(player, server, Integer.MAX_VALUE, maxOfflineTime); server.addPlayer(queuePlayer, 0); main.getQueueManager().sendPlayers(server); return queuePlayer; } - int priority = PermissionGetter.getPriority(player); - int serverPriority = PermissionGetter.getServerPriotity(server.getName(), player); + int priority = permissionGetter.getPriority(player); + int serverPriority = permissionGetter.getServerPriotity(server.getName(), player); + + if(debug) { + logger.info("[priority] Using "+permissionGetter.getSelected().getName()+" for permissions"); + } int highestPriority = Math.max(priority, serverPriority); QueuePlayer queuePlayer = new QueuePlayerImpl(player, server, highestPriority, maxOfflineTime); - QueueLogger logger = main.getLogger(); - boolean debug = main.getConfig().getBoolean("priority-queue-debug"); - if(debug) { logger.info("[priority] "+player.getName()+" highestPriority: "+highestPriority); logger.info("[priority] "+player.getName()+" priority: "+priority); diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java index 4b5140b..aec11b2 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java @@ -1,20 +1,70 @@ package us.ajg0702.queue.logic.permissions; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.logic.permissions.hooks.BuiltIn; +import us.ajg0702.queue.logic.permissions.hooks.LuckPermsHook; + +import java.util.*; public class PermissionGetter { - //TODO: all of this + private final List hooks; - public static int getMaxOfflineTime(AdaptedPlayer player) { - return -1; + private QueueMain main; + public PermissionGetter(QueueMain main) { + hooks = Arrays.asList( + new BuiltIn(main), + new LuckPermsHook(main) + ); } - public static int getPriority(AdaptedPlayer player) { - return -1; + private PermissionHook selected; + public PermissionHook getSelected() { + if(selected != null) return selected; + if(hooks == null) { + throw new IllegalStateException("Hooks are not initialized yet!"); + } + for(PermissionHook hook : hooks) { + if(hook.canUse()) { + selected = hook; + } + } + return selected; } - public static int getServerPriotity(String server, AdaptedPlayer player) { - return -1; + public int getMaxOfflineTime(AdaptedPlayer player) { + return getHighestPermission(player, "ajqueue.stayqueued."); + } + + public int getPriority(AdaptedPlayer player) { + return getHighestPermission(player, "ajqueue.priority."); + } + + public int getServerPriotity(String server, AdaptedPlayer player) { + return getHighestPermission(player, "ajqueue.serverpriority."+server+"."); + } + + private int getHighestPermission(AdaptedPlayer player, String prefix) { + if(getSelected() == null) { + return -1; + } + List perms = getSelected().getPermissions(player); + Iterator it = perms.iterator(); + String highestPerm = prefix+"0"; + while(it.hasNext()) { + String perm = it.next(); + if(!perm.startsWith(prefix)) continue; + if(highestPerm.isEmpty()) { + highestPerm = perm; + continue; + } + int level = Integer.parseInt(perm.substring(prefix.length())); + int highestlevel = Integer.parseInt(highestPerm.substring(prefix.length())); + if(level > highestlevel) { + highestPerm = perm; + } + } + return Integer.parseInt(highestPerm.substring(prefix.length())); } } diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionHook.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionHook.java new file mode 100644 index 0000000..b9b7e97 --- /dev/null +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionHook.java @@ -0,0 +1,11 @@ +package us.ajg0702.queue.logic.permissions; + +import us.ajg0702.queue.api.players.AdaptedPlayer; + +import java.util.List; + +public interface PermissionHook { + String getName(); + boolean canUse(); + List getPermissions(AdaptedPlayer player); +} diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/BuiltIn.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/BuiltIn.java new file mode 100644 index 0000000..289d046 --- /dev/null +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/BuiltIn.java @@ -0,0 +1,34 @@ +package us.ajg0702.queue.logic.permissions.hooks; + +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.logic.permissions.PermissionHook; + +import java.util.ArrayList; +import java.util.List; + +public class BuiltIn implements PermissionHook { + + private final QueueMain main; + public BuiltIn(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "Built-In"; + } + + @Override + public boolean canUse() { + return true; + } + + @Override + public List getPermissions(AdaptedPlayer player) { + if(main.getPlatformMethods().getImplementationName().equals("velocity")) { + return new ArrayList<>(); + } + return player.getPermissions(); + } +} diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/LuckPermsHook.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/LuckPermsHook.java new file mode 100644 index 0000000..f7b9c53 --- /dev/null +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/LuckPermsHook.java @@ -0,0 +1,51 @@ +package us.ajg0702.queue.logic.permissions.hooks; + +import net.luckperms.api.LuckPerms; +import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.model.user.User; +import net.luckperms.api.node.Node; +import net.luckperms.api.node.NodeType; +import net.luckperms.api.query.QueryOptions; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.logic.permissions.PermissionHook; + +import java.util.*; + +public class LuckPermsHook implements PermissionHook { + + private final QueueMain main; + public LuckPermsHook(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "LuckPerms"; + } + + @Override + public boolean canUse() { + return main.getPlatformMethods().hasPlugin("LuckPerms"); + } + + @Override + public List getPermissions(AdaptedPlayer player) { + LuckPerms api = LuckPermsProvider.get(); + + User user = api.getUserManager().getUser(player.getUniqueId()); + + assert user != null; + SortedSet nodes = user.resolveDistinctInheritedNodes(QueryOptions.defaultContextualOptions()); + + List perms = new ArrayList<>(); + + for (Node node : nodes) { + if (!node.getType().equals(NodeType.PERMISSION)) continue; + if (!node.getValue()) continue; + perms.add(node.getKey()); + } + + return perms; + } +} diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java index 30f0db3..c4a0368 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java @@ -6,16 +6,17 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; public class Commands implements CommandExecutor { - SpigotMain pl; + final SpigotMain pl; public Commands(SpigotMain pl) { this.pl = pl; } @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { Player player = null; if(sender instanceof Player) { player = (Player) sender; @@ -51,6 +52,7 @@ public class Commands implements CommandExecutor { if(pl.config.getBoolean("send-queue-commands-in-batches")) { pl.queuebatch.put(player, srvname); } else { + assert player != null; pl.sendMessage(player, "queue", srvname); } diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Config.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Config.java index 47226de..b1eafb6 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Config.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Config.java @@ -9,10 +9,10 @@ import java.io.PrintWriter; import java.nio.file.Files; public class Config { - File f; - YamlConfiguration yml; + final File f; + final YamlConfiguration yml; - JavaPlugin pl; + final JavaPlugin pl; public boolean getBoolean(String key) { diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java index cecb7a4..3d3dbdc 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java @@ -14,7 +14,7 @@ import java.util.Iterator; */ public class Placeholders extends PlaceholderExpansion { - private SpigotMain plugin; + private final SpigotMain plugin; /** * Since we register the expansion inside our own plugin, we @@ -89,7 +89,7 @@ public class Placeholders extends PlaceholderExpansion { return plugin.getDescription().getVersion(); } - HashMap> responseCache = new HashMap<>(); + final HashMap> responseCache = new HashMap<>(); public void cleanCache() { Iterator it = responseCache.keySet().iterator(); @@ -135,31 +135,25 @@ public class Placeholders extends PlaceholderExpansion { } } - Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { - public void run() { - HashMap playerCache; - if(responseCache.containsKey(player)) { - playerCache = responseCache.get(player); - } else { - playerCache = new HashMap(); - } - if(playerCache.size() > 75) { - try { - playerCache.remove(playerCache.keySet().toArray()[0]); - } catch(ConcurrentModificationException e) { - Bukkit.getScheduler().runTask(plugin, new Runnable() { - public void run() { - playerCache.remove(playerCache.keySet().toArray()[0]); - } - }); - } - } - String resp = parsePlaceholder(player, identifier); - if(resp == null) return; - playerCache.put(identifier, resp); - responseCache.put(player, playerCache); - } - }); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + HashMap playerCache; + if(responseCache.containsKey(player)) { + playerCache = responseCache.get(player); + } else { + playerCache = new HashMap<>(); + } + if(playerCache.size() > 75) { + try { + playerCache.remove(playerCache.keySet().toArray()[0]); + } catch(ConcurrentModificationException e) { + Bukkit.getScheduler().runTask(plugin, () -> playerCache.remove(playerCache.keySet().toArray()[0])); + } + } + String resp = parsePlaceholder(player, identifier); + if(resp == null) return; + playerCache.put(identifier, resp); + responseCache.put(player, playerCache); + }); if(responseCache.containsKey(player)) { @@ -189,23 +183,18 @@ public class Placeholders extends PlaceholderExpansion { private String parsePlaceholder(Player player, String identifier) { if(identifier.equalsIgnoreCase("queued")) { plugin.sendMessage(player, "queuename", ""); - return null; } if(identifier.equalsIgnoreCase("position")) { plugin.sendMessage(player, "position", ""); - return null; } if(identifier.equalsIgnoreCase("of")) { plugin.sendMessage(player, "positionof", ""); - return null; } if(identifier.equalsIgnoreCase("inqueue")) { plugin.sendMessage(player, "inqueue", ""); - return null; } if(identifier.matches("queuedfor_*.*")) { plugin.sendMessage(player, "queuedfor", identifier.split("_")[1]); - return null; } diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java b/spigot/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java index 9c621b0..46ba47f 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/QueueScoreboardActivator.java @@ -3,11 +3,12 @@ package us.ajg0702.queue.spigot; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; public class QueueScoreboardActivator extends Event { private static final HandlerList HANDLERS = new HandlerList(); - public HandlerList getHandlers() { + public @NotNull HandlerList getHandlers() { return HANDLERS; } @@ -15,7 +16,7 @@ public class QueueScoreboardActivator extends Event { return HANDLERS; } - Player ply; + final Player ply; public QueueScoreboardActivator(Player p) { this.ply = p; diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java b/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java index 23d3284..79366b6 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java @@ -11,10 +11,10 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.messaging.PluginMessageListener; import org.jetbrains.annotations.NotNull; -import us.ajg0702.queue.spigot.utils.VersionSupport; import java.util.HashMap; +@SuppressWarnings("UnstableApiUsage") public class SpigotMain extends JavaPlugin implements PluginMessageListener,Listener { boolean papi = false; @@ -22,6 +22,7 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List Config config; + @SuppressWarnings("ConstantConditions") public void onEnable() { getServer().getMessenger().registerIncomingPluginChannel(this, "ajqueue:tospigot", this); getServer().getMessenger().registerOutgoingPluginChannel(this, "ajqueue:toproxy"); @@ -39,20 +40,18 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List getLogger().info("Registered PlaceholderAPI placeholders"); } - Bukkit.getScheduler().runTaskTimer(this, new Runnable() { - public void run() { - if(Bukkit.getOnlinePlayers().size() <= 0 || queuebatch.size() <= 0) return; - String msg = ""; - for(Player p : queuebatch.keySet()) { - if(p == null || !p.isOnline()) continue; - msg += p.getName()+":"+queuebatch.get(p)+","; - } - if(msg.length() > 1) { - msg = msg.substring(0, msg.length()-1); - } - queuebatch.clear(); - sendMessage("massqueue", msg); + Bukkit.getScheduler().runTaskTimer(this, () -> { + if(Bukkit.getOnlinePlayers().size() <= 0 || queuebatch.size() <= 0) return; + StringBuilder msg = new StringBuilder(); + for(Player p : queuebatch.keySet()) { + if(p == null || !p.isOnline()) continue; + msg.append(p.getName()).append(":").append(queuebatch.get(p)).append(","); } + if(msg.length() > 1) { + msg = new StringBuilder(msg.substring(0, msg.length() - 1)); + } + queuebatch.clear(); + sendMessage("massqueue", msg.toString()); }, 2*20, 20); config = new Config(this); @@ -60,10 +59,10 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List getLogger().info("Spigot side enabled! v"+getDescription().getVersion()); } - HashMap queuebatch = new HashMap<>(); + final HashMap queuebatch = new HashMap<>(); @Override - public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, @NotNull byte[] message) { + public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, byte[] message) { if (!channel.equals("ajqueue:tospigot")) return; ByteArrayDataInput in = ByteStreams.newDataInput(message); @@ -133,7 +132,7 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List if(p == null) return; if(!p.isOnline()) return; - int number = Integer.valueOf(in.readUTF()); + int number = Integer.parseInt(in.readUTF()); HashMap phs = placeholders.responseCache.get(p); if(phs == null) phs = new HashMap<>(); phs.put("queuedfor_"+queuename, number+""); diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java b/spigot/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java index eab8c59..acc3c60 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/utils/ActionBar.java @@ -12,18 +12,15 @@ import java.lang.reflect.Method; * */ public class ActionBar { - - private static String version; - private static boolean old; - public static void send(Player player, String message) { + public static void send(Player player, String message) { if(player == null) return; if(!player.isOnline()) return; - - version = Bukkit.getServer().getClass().getPackage().getName(); + + String version = Bukkit.getServer().getClass().getPackage().getName(); version = version.substring(version.lastIndexOf(".") + 1); - old = version.equalsIgnoreCase("v1_8_R1") || version.startsWith("v1_7_"); + boolean old = version.equalsIgnoreCase("v1_8_R1") || version.startsWith("v1_7_"); try { Class craftPlayerClass = Class.forName("org.bukkit.craftbukkit." + version + ".entity.CraftPlayer"); From e9785ffe4e0c5577c46d7edd56e2d4af84a595ce Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Wed, 28 Jul 2021 18:54:49 -0700 Subject: [PATCH 25/56] maybe fix ci --- build.gradle.kts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 7b470d8..3ff4053 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,12 @@ plugins { `maven-publish` } +repositories { + mavenCentral() + maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } +} + allprojects { version = "2.0.0" group = "us.ajg0702" From 07721809fb1c21eed4dfd6606efb5e1bf23f2950 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 29 Jul 2021 14:17:25 -0700 Subject: [PATCH 26/56] almost done :) --- api/build.gradle.kts | 1 + .../us/ajg0702/queue/api/EventHandler.java | 11 ++ .../us/ajg0702/queue/api/QueueManager.java | 2 + .../queue/api/server/ServerBuilder.java | 2 - .../commands/listqueues/ListCommand.java | 1 + .../queue/common/EventHandlerImpl.java | 85 ++++++++++- .../queue/common/QueueManagerImpl.java | 53 ++----- .../us/ajg0702/queue/common/TaskManager.java | 4 + free/build.gradle.kts | 7 +- platforms/bungeecord/build.gradle.kts | 68 +++++++++ .../platforms/bungeecord/BungeeLogger.java | 39 ++++++ .../platforms/bungeecord/BungeeMethods.java | 103 ++++++++++++++ .../platforms/bungeecord/BungeeQueue.java | 132 ++++++++++++++++++ .../bungeecord/commands/BungeeCommand.java | 28 ++++ .../bungeecord/commands/BungeeSender.java | 37 +++++ .../bungeecord/players/BungeePlayer.java | 86 ++++++++++++ .../bungeecord/server/BungeeServer.java | 63 +++++++++ .../server/BungeeServerBuilder.java | 42 ++++++ .../bungeecord/server/BungeeServerInfo.java | 22 +++ .../bungeecord/server/BungeeServerPing.java | 43 ++++++ .../bungeecord/src/main/resources/bungee.yml | 4 + .../platforms/velocity/VelocityMethods.java | 3 +- .../platforms/velocity/VelocityQueue.java | 29 +++- .../velocity/commands/VelocityCommand.java | 2 - .../velocity/players/VelocityPlayer.java | 14 +- ...erImpl.java => VelocityServerBuilder.java} | 10 +- premium/build.gradle.kts | 8 +- settings.gradle.kts | 1 + 28 files changed, 835 insertions(+), 65 deletions(-) create mode 100644 platforms/bungeecord/build.gradle.kts create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeLogger.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeCommand.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeSender.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/players/BungeePlayer.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServer.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerInfo.java create mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerPing.java create mode 100644 platforms/bungeecord/src/main/resources/bungee.yml rename platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/{ServerBuilderImpl.java => VelocityServerBuilder.java} (82%) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index a0dbbd3..24dcb53 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -13,6 +13,7 @@ repositories { dependencies { implementation("net.kyori:adventure-api:4.8.1") + implementation("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") compileOnly("com.google.guava:guava:30.1.1-jre") compileOnly("us.ajg0702:ajUtils:1.1.6") diff --git a/api/src/main/java/us/ajg0702/queue/api/EventHandler.java b/api/src/main/java/us/ajg0702/queue/api/EventHandler.java index 1286746..4b41130 100644 --- a/api/src/main/java/us/ajg0702/queue/api/EventHandler.java +++ b/api/src/main/java/us/ajg0702/queue/api/EventHandler.java @@ -1,6 +1,8 @@ package us.ajg0702.queue.api; +import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; public interface EventHandler { @@ -9,4 +11,13 @@ public interface EventHandler { void onPlayerJoin(AdaptedPlayer player); void onPlayerLeave(AdaptedPlayer player); + + /** + * Called when a player joins a server or switches between servers + * @param player the player + */ + void + onPlayerJoinServer(AdaptedPlayer player); + + void onServerKick(AdaptedPlayer player, AdaptedServer from, Component reason, boolean moving); } diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java index d31eb27..f8f49f0 100644 --- a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -116,4 +116,6 @@ public interface QueueManager { * @return A list of QueueServers that this player is queued for */ ImmutableList getPlayerQueues(AdaptedPlayer p); + + void clear(AdaptedPlayer player); } diff --git a/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java index e63975c..23b08e8 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java @@ -8,6 +8,4 @@ public interface ServerBuilder { List buildServers(); AdaptedServer getServer(String name); - - QueueServer buildGroup(String name, List servers); } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java index 1c6f35f..29d4e0e 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/listqueues/ListCommand.java @@ -50,6 +50,7 @@ public class ListCommand extends BaseCommand { public void execute(ICommandSender sender, String[] args) { if(!checkPermission(sender)) return; + AdaptedPlayer spp = null; if(sender.isPlayer()) { spp = main.getPlatformMethods().senderToPlayer(sender); diff --git a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java index 1853b32..24592d3 100644 --- a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -1,17 +1,22 @@ package us.ajg0702.queue.common; import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import us.ajg0702.queue.api.EventHandler; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.commands.commands.PlayerSender; import us.ajg0702.queue.common.players.QueuePlayerImpl; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; +import java.util.List; +import java.util.concurrent.TimeUnit; public class EventHandlerImpl implements EventHandler { @@ -91,7 +96,6 @@ public class EventHandlerImpl implements EventHandler { } } - @Override public void onPlayerJoin(AdaptedPlayer player) { ImmutableList queues = main.getQueueManager().findPlayerInQueues(player); @@ -109,5 +113,84 @@ public class EventHandlerImpl implements EventHandler { for(QueuePlayer queuePlayer : queues) { ((QueuePlayerImpl) queuePlayer).setLeaveTime(System.currentTimeMillis()); } + main.getQueueManager().clear(player); + } + + @Override + public void onPlayerJoinServer(AdaptedPlayer player) { + ImmutableList alreadyqueued = main.getQueueManager().findPlayerInQueues(player); + for(QueuePlayer queuePlayer : alreadyqueued) { + QueueServer server = queuePlayer.getQueueServer(); + int pos = queuePlayer.getPosition(); + if((pos <= 1 && server.getServerNames().contains(player.getServerName())) || main.getConfig().getBoolean("remove-player-on-server-switch")) { + server.removePlayer(player); + server.setLastSentTime(System.currentTimeMillis()); + } + } + + + + String serverName = player.getServerName(); + List svs = main.getConfig().getStringList("queue-servers"); + for(String s : svs) { + if(!s.contains(":")) continue; + String[] parts = s.split(":"); + String from = parts[0]; + String to = parts[1]; + if(from.equalsIgnoreCase(serverName)) { + main.getQueueManager().addToQueue(player, to); + } + } + } + + @Override + public void onServerKick(AdaptedPlayer player, AdaptedServer from, Component reason, boolean moving) { + + if(!player.isConnected()) return; + + String plainReason = PlainTextComponentSerializer.plainText().serialize(reason); + + if(!moving && main.getConfig().getBoolean("send-fail-debug")) { + main.getLogger().warning("Failed to send "+player.getName()+" to "+from.getName()+". Kicked with reason: "+plainReason); + } + + ImmutableList queuedServers = main.getQueueManager().getPlayerQueues(player); + if(!queuedServers.contains(main.getQueueManager().findServer(from.getName())) && main.getConfig().getBoolean("auto-add-to-queue-on-kick")) { + + List reasons = main.getConfig().getStringList("auto-add-kick-reasons"); + boolean shouldqueue = false; + for(String kickReason : reasons) { + if(plainReason.toLowerCase().contains(kickReason.toLowerCase())) { + shouldqueue = true; + break; + } + } + + if(shouldqueue || reasons.isEmpty()) { + main.getTaskManager().runLater(() -> { + if(!player.isConnected()) return; + + String toName = from.getName(); + player.sendMessage(main.getMessages().getComponent("auto-queued", "SERVER:"+toName)); + main.getQueueManager().addToQueue(player, toName); + }, (long) (main.getConfig().getDouble("auto-add-to-queue-on-kick-delay")*1000), TimeUnit.MILLISECONDS); + return; + } + + } + + + for(QueueServer server : queuedServers) { + if(!(server.getServerNames().contains(from.getName()))) continue; + QueuePlayer queuePlayer = server.findPlayer(player); + if(queuePlayer.getPosition() != 1) continue; + List kickReasons = main.getConfig().getStringList("kick-reasons"); + + for(String kickReason : kickReasons) { + if(plainReason.toLowerCase().contains(kickReason.toLowerCase())) { + server.removePlayer(queuePlayer); + } + } + } } } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 07cb3cf..4006e56 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -15,6 +15,7 @@ import us.ajg0702.utils.common.TimeUtils; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; public class QueueManagerImpl implements QueueManager { @@ -27,47 +28,12 @@ public class QueueManagerImpl implements QueueManager { this.main = main; this.msgs = main.getMessages(); - CompletableFuture serverBuilderFuture = main.getFutureServerBuilder(); - serverBuilderFuture.thenRunAsync(() -> { - try { - servers = serverBuilderFuture.get().buildServers(); - List groupsRaw = main.getConfig().getStringList("server-groups"); - for(String groupRaw : groupsRaw) { - if(groupRaw.isEmpty()) { - main.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); - continue; - } + int delay = main.getConfig().getBoolean("wait-to-load-servers") ? main.getConfig().getInt("wait-to-load-servers-delay") : 0; - String groupName = groupRaw.split(":")[0]; - String[] serversRaw = groupRaw.split(":")[1].split(","); - - if(main.getServerBuilder().getServer(groupName) != null) { - main.getLogger().warning("The name of a group ('"+groupName+"') cannot be the same as the name of a server!"); - continue; - } - - List groupServers = new ArrayList<>(); - - for(String serverRaw : serversRaw) { - AdaptedServer si = main.getServerBuilder().getServer(serverRaw); - if(si == null) { - main.getLogger().warning("Could not find server named '"+serverRaw+"' in servergroup '"+groupName+"'!"); - continue; - } - groupServers.add(si); - } - - if(groupServers.size() == 0) { - main.getLogger().warning("Server group '"+groupName+"' has no servers! Ignoring it."); - continue; - } - - servers.add(new QueueServerImpl(groupName, main, groupServers)); - } - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - }); + main.getTaskManager().runLater(() -> { + CompletableFuture serverBuilderFuture = main.getFutureServerBuilder(); + serverBuilderFuture.thenRunAsync(this::reloadServers); + }, delay, TimeUnit.MILLISECONDS); } @Override @@ -261,7 +227,7 @@ public class QueueManagerImpl implements QueueManager { continue; } - this.servers.add(main.getServerBuilder().buildGroup(groupName, groupServers)); + this.servers.add(new QueueServerImpl(groupName, main, groupServers)); } } @@ -515,4 +481,9 @@ public class QueueManagerImpl implements QueueManager { } return ImmutableList.copyOf(srs); } + + @Override + public void clear(AdaptedPlayer player) { + sendingNowAntiSpam.remove(player); + } } diff --git a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java index f972ea1..b99e1d4 100644 --- a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java +++ b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java @@ -109,6 +109,10 @@ public class TaskManager { return scheduleAtFixedRate(executor, command, 0, period, unit); } + public ScheduledFuture runLater(Runnable runnable, long delay, TimeUnit unit) { + return executor.schedule(runnable, delay, unit); + } + private ScheduledFuture scheduleAtFixedRate(ScheduledExecutorService executor, Runnable command, long initialDelay, long period, TimeUnit unit) { return executor.scheduleAtFixedRate(() -> { diff --git a/free/build.gradle.kts b/free/build.gradle.kts index bb6fb1e..a74d973 100644 --- a/free/build.gradle.kts +++ b/free/build.gradle.kts @@ -19,9 +19,9 @@ dependencies { implementation("us.ajg0702:ajUtils:1.1.6") - //implementation("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT") - implementation(project(":platforms:velocity")) + implementation(project(":platforms:bungeecord")) + implementation(project(":spigot")) } @@ -32,7 +32,8 @@ tasks.shadowJar { relocate("io.leangen.geantyref", "us.ajg0702.queue.libs.geantyref") relocate("org.spongepowered", "us.ajg0702.queue.libs.sponge") relocate("org.yaml", "us.ajg0702.queue.libs.yaml") - archiveFileName.set("${baseName}-${version}.${extension}") + archiveBaseName.set("ajQueue") + archiveClassifier.set("") } publishing { diff --git a/platforms/bungeecord/build.gradle.kts b/platforms/bungeecord/build.gradle.kts new file mode 100644 index 0000000..9b2682f --- /dev/null +++ b/platforms/bungeecord/build.gradle.kts @@ -0,0 +1,68 @@ +plugins { + `java-library` + `maven-publish` +} + +group = "us.ajg0702.queue.platforms.bungeecord" + +repositories { + mavenCentral() + maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://nexus.velocitypowered.com/repository/maven-public/") } +} + +dependencies { + compileOnly("net.kyori:adventure-api:4.8.1") + compileOnly("com.google.guava:guava:30.1.1-jre") + compileOnly("us.ajg0702:ajUtils:1.1.6") + + compileOnly("net.md-5:bungeecord-api:1.14-SNAPSHOT") + + compileOnly("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT") + + implementation("net.kyori:adventure-platform-bungeecord:4.0.0-SNAPSHOT") + compileOnly("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") + + implementation(project(":common")) + implementation(project(":api")) +} + + +tasks.withType { + from(sourceSets.main.get().java.srcDirs) + filter( + "tokens" to mapOf( + "VERSION" to project.version.toString() + ) + ).into("$buildDir/src") +} + +tasks.jar { + exclude("**/*.java") +} + + +publishing { + publications { + create("mavenJava") { + artifact(tasks["jar"]) + } + } + + repositories { + + val mavenUrl = "https://repo.ajg0702.us/releases" + + if(!System.getenv("REPO_TOKEN").isNullOrEmpty()) { + maven { + url = uri(mavenUrl) + name = "ajRepo" + + credentials { + username = "plugins" + password = System.getenv("REPO_TOKEN") + } + } + } + } +} \ No newline at end of file diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeLogger.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeLogger.java new file mode 100644 index 0000000..51dc44b --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeLogger.java @@ -0,0 +1,39 @@ +package us.ajg0702.queue.platforms.bungeecord; + +import us.ajg0702.queue.api.util.QueueLogger; + +import java.util.logging.Logger; + +public class BungeeLogger implements QueueLogger { + + private final Logger logger; + + protected BungeeLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void warn(String message) { + logger.warning(message); + } + + @Override + public void warning(String message) { + logger.warning(message); + } + + @Override + public void info(String message) { + logger.info(message); + } + + @Override + public void error(String message) { + logger.severe(message); + } + + @Override + public void severe(String message) { + logger.severe(message); + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java new file mode 100644 index 0000000..7c55d47 --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java @@ -0,0 +1,103 @@ +package us.ajg0702.queue.platforms.bungeecord; + +import com.google.common.io.ByteArrayDataOutput; +import com.google.common.io.ByteStreams; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import us.ajg0702.queue.api.PlatformMethods; +import us.ajg0702.queue.api.commands.IBaseCommand; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.util.QueueLogger; +import us.ajg0702.queue.commands.commands.PlayerSender; +import us.ajg0702.queue.platforms.bungeecord.players.BungeePlayer; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +public class BungeeMethods implements PlatformMethods { + + final ProxyServer proxyServer; + final QueueLogger logger; + final BungeeQueue plugin; + + public BungeeMethods(BungeeQueue plugin, ProxyServer proxyServer, QueueLogger logger) { + this.proxyServer = proxyServer; + this.logger = logger; + this.plugin = plugin; + } + + @SuppressWarnings("UnstableApiUsage") + @Override + public void sendPluginMessage(AdaptedPlayer player, String channel, String... data) { + Collection networkPlayers = ProxyServer.getInstance().getPlayers(); + if (networkPlayers != null && !networkPlayers.isEmpty()) { + ByteArrayDataOutput out = ByteStreams.newDataOutput(); + out.writeUTF(channel); + out.writeUTF(player.getName()); + int length = data.length; + + for (String s : data) { + out.writeUTF(s); + } + + ((BungeePlayer) player).getHandle().getServer().sendData("ajqueue:tospigot", out.toByteArray()); + } + } + + @Override + public AdaptedPlayer senderToPlayer(ICommandSender sender) { + if(sender instanceof PlayerSender) { + return ((PlayerSender) sender).getHandle(); + } + return new BungeePlayer((ProxiedPlayer) sender.getHandle()); + } + + @Override + public String getPluginVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public List getOnlinePlayers() { + List players = new ArrayList<>(); + proxyServer.getPlayers().forEach(pp -> players.add(new BungeePlayer(pp))); + return players; + } + + @Override + public List getPlayerNames(boolean lowercase) { + List names = new ArrayList<>(); + proxyServer.getPlayers().forEach(player -> names.add(lowercase ? player.getName().toLowerCase(Locale.ROOT) : player.getName())); + return names; + } + + @Override + public AdaptedPlayer getPlayer(String name) { + ProxiedPlayer player = proxyServer.getPlayer(name); + if(player == null) return null; + return new BungeePlayer(player); + } + + @Override + public List getServerNames() { + return new ArrayList<>(proxyServer.getServers().keySet()); + } + + @Override + public String getImplementationName() { + return "BungeeCord"; + } + + @Override + public List getCommands() { + return plugin.commands; + } + + @Override + public boolean hasPlugin(String pluginName) { + return proxyServer.getPluginManager().getPlugin(pluginName) != null; + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java new file mode 100644 index 0000000..ecdba70 --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java @@ -0,0 +1,132 @@ +package us.ajg0702.queue.platforms.bungeecord; + +import net.kyori.adventure.platform.bungeecord.BungeeAudiences; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.*; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.event.EventHandler; +import org.checkerframework.checker.nullness.qual.NonNull; +import us.ajg0702.queue.api.commands.IBaseCommand; +import us.ajg0702.queue.api.util.QueueLogger; +import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; +import us.ajg0702.queue.commands.commands.listqueues.ListCommand; +import us.ajg0702.queue.commands.commands.manage.ManageCommand; +import us.ajg0702.queue.commands.commands.queue.QueueCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.platforms.bungeecord.commands.BungeeCommand; +import us.ajg0702.queue.platforms.bungeecord.players.BungeePlayer; +import us.ajg0702.queue.platforms.bungeecord.server.BungeeServer; +import us.ajg0702.queue.platforms.bungeecord.server.BungeeServerBuilder; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +public class BungeeQueue extends Plugin implements Listener { + + private QueueLogger logger; + + private QueueMain main; + + private File dataFolder; + + List commands; + + @Override + public void onEnable() { + logger = new BungeeLogger(getLogger()); + dataFolder = getDataFolder(); + + main = new QueueMain( + logger, + new BungeeMethods(this, getProxy(), logger), + dataFolder + ); + main.setServerBuilder(new BungeeServerBuilder(main, getProxy())); + + getProxy().registerChannel("ajqueue:tospigot"); + getProxy().registerChannel("ajqueue:tobungee"); + + commands = Arrays.asList( + new QueueCommand(main), + new LeaveCommand(main), + new ListCommand(main), + new ManageCommand(main) + ); + + for(IBaseCommand command : commands) { + getProxy().getPluginManager() + .registerCommand(this, new BungeeCommand(main, (BaseCommand) command)); + } + + getProxy().getPluginManager().registerListener(this, this); + + adventure = BungeeAudiences.create(this); + + } + + private static BungeeAudiences adventure; + + public static @NonNull BungeeAudiences adventure() { + if(adventure == null) { + throw new IllegalStateException("Cannot retrieve audience provider while plugin is not enabled"); + } + return adventure; + } + + @Override + public void onDisable() { + main.shutdown(); + if(adventure != null) { + adventure.close(); + adventure = null; + } + } + + @EventHandler + public void onPluginMessage(PluginMessageEvent e) { + + if(e.getTag().equals("ajqueue:tospigot")) { + e.setCancelled(true); + return; + } + if(!e.getTag().equals("ajqueue:toproxy")) return; + e.setCancelled(true); + + if(!(e.getReceiver() instanceof ProxiedPlayer)) return; + + main.getEventHandler().handleMessage(new BungeePlayer((ProxiedPlayer) e.getReceiver()), e.getData()); + } + + @EventHandler + public void onJoin(PostLoginEvent e) { + main.getEventHandler().onPlayerJoin(new BungeePlayer(e.getPlayer())); + } + + @EventHandler + public void onServerSwitch(ServerSwitchEvent e) { + main.getEventHandler().onPlayerJoinServer(new BungeePlayer(e.getPlayer())); + } + + @EventHandler + public void onLeave(PlayerDisconnectEvent e) { + main.getEventHandler().onPlayerLeave(new BungeePlayer(e.getPlayer())); + } + + @EventHandler + public void onKick(ServerKickEvent e) { + if(!e.getPlayer().isConnected()) return; + if(e.getPlayer().getServer() == null) return; // if the player is kicked on initial join, we dont care + Component reason = BungeeComponentSerializer.get().deserialize(e.getKickReasonComponent()); + main.getEventHandler().onServerKick( + new BungeePlayer(e.getPlayer()), + new BungeeServer(e.getCancelServer()), + reason, + false + ); + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeCommand.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeCommand.java new file mode 100644 index 0000000..3334ec3 --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeCommand.java @@ -0,0 +1,28 @@ +package us.ajg0702.queue.platforms.bungeecord.commands; + + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.api.plugin.TabExecutor; +import us.ajg0702.queue.commands.BaseCommand; +import us.ajg0702.queue.common.QueueMain; + +public class BungeeCommand extends Command implements TabExecutor { + QueueMain main; + BaseCommand command; + public BungeeCommand(QueueMain main, BaseCommand command) { + super(command.getName(), command.getPermission(), command.getAliases().toArray(new String[0])); + this.main = main; + this.command = command; + } + + @Override + public void execute(CommandSender sender, String[] args) { + command.execute(new BungeeSender(sender), args); + } + + @Override + public Iterable onTabComplete(CommandSender sender, String[] args) { + return command.autoComplete(new BungeeSender(sender), args); + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeSender.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeSender.java new file mode 100644 index 0000000..bcc5a7a --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeSender.java @@ -0,0 +1,37 @@ +package us.ajg0702.queue.platforms.bungeecord.commands; + +import net.kyori.adventure.text.Component; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import org.jetbrains.annotations.NotNull; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.platforms.bungeecord.BungeeQueue; + +public class BungeeSender implements ICommandSender { + + final CommandSender handle; + + public BungeeSender(CommandSender handle) { + this.handle = handle; + } + + @Override + public boolean hasPermission(String permission) { + return handle.hasPermission(permission); + } + + @Override + public boolean isPlayer() { + return handle instanceof ProxiedPlayer; + } + + @Override + public void sendMessage(@NotNull Component message) { + BungeeQueue.adventure().sender(handle).sendMessage(message); + } + + @Override + public CommandSender getHandle() { + return handle; + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/players/BungeePlayer.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/players/BungeePlayer.java new file mode 100644 index 0000000..a6e0f0b --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/players/BungeePlayer.java @@ -0,0 +1,86 @@ +package us.ajg0702.queue.platforms.bungeecord.players; + +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.chat.BaseComponentSerializer; +import org.jetbrains.annotations.NotNull; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.platforms.bungeecord.BungeeQueue; +import us.ajg0702.queue.platforms.bungeecord.server.BungeeServer; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class BungeePlayer implements AdaptedPlayer, Audience { + + final ProxiedPlayer handle; + + public BungeePlayer(ProxiedPlayer player) { + handle = player; + } + + @Override + public boolean isConnected() { + return handle.isConnected(); + } + + @Override + public void sendMessage(@NotNull Component message) { + if(PlainTextComponentSerializer.plainText().serialize(message).isEmpty()) return; + BungeeQueue.adventure().player(handle).sendMessage(message); + } + + @Override + public void sendActionBar(@NotNull Component message) { + if(PlainTextComponentSerializer.plainText().serialize(message).isEmpty()) return; + BungeeQueue.adventure().player(handle).sendActionBar(message); + } + + @Override + public void sendMessage(String message) { + if(message.isEmpty()) return; + BungeeQueue.adventure().player(handle).sendMessage(Component.text(message)); + } + + @Override + public boolean hasPermission(String permission) { + return handle.hasPermission(permission); + } + + @Override + public String getServerName() { + return handle.getServer().getInfo().getName(); + } + + @Override + public UUID getUniqueId() { + return handle.getUniqueId(); + } + + @Override + public void connect(AdaptedServer server) { + handle.connect(((BungeeServer) server).getHandle()); + } + + @Override + public String getName() { + return handle.getName(); + } + + @Override + public List getPermissions() { + return new ArrayList<>(handle.getPermissions()); + } + + @Override + public ProxiedPlayer getHandle() { + return handle; + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServer.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServer.java new file mode 100644 index 0000000..6c8dc38 --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServer.java @@ -0,0 +1,63 @@ +package us.ajg0702.queue.platforms.bungeecord.server; + +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.api.server.AdaptedServerInfo; +import us.ajg0702.queue.api.server.AdaptedServerPing; +import us.ajg0702.queue.platforms.bungeecord.players.BungeePlayer; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class BungeeServer implements AdaptedServer { + + final ServerInfo handle; + final BungeeServerInfo serverInfo; + + public BungeeServer(ServerInfo handle) { + this.handle = handle; + serverInfo = new BungeeServerInfo(handle); + } + + @Override + public AdaptedServerInfo getServerInfo() { + return serverInfo; + } + + @Override + public String getName() { + return serverInfo.getName(); + } + + @Override + public CompletableFuture ping() { + CompletableFuture future = new CompletableFuture<>(); + handle.ping((pp, error) -> { + if(error != null) { + future.complete(null); + } + future.complete(new BungeeServerPing(pp)); + }); + return future; + } + + @Override + public boolean canAccess(AdaptedPlayer player) { + return handle.canAccess((ProxiedPlayer) player.getHandle()); + } + + @Override + public List getPlayers() { + List players = new ArrayList<>(); + handle.getPlayers().forEach(pp -> players.add(new BungeePlayer(pp))); + return players; + } + + @Override + public ServerInfo getHandle() { + return handle; + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java new file mode 100644 index 0000000..15d143c --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java @@ -0,0 +1,42 @@ +package us.ajg0702.queue.platforms.bungeecord.server; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.api.server.ServerBuilder; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.common.queues.QueueServerImpl; + +import java.util.*; + +public class BungeeServerBuilder implements ServerBuilder { + + private final ProxyServer proxyServer; + private final QueueMain main; + public BungeeServerBuilder(QueueMain main, ProxyServer proxyServer) { + this.proxyServer = proxyServer; + this.main = main; + } + + @Override + public List buildServers() { + List result = new ArrayList<>(); + Map servers = proxyServer.getServers(); + + for(String serverName : servers.keySet()) { + ServerInfo serverInfo = servers.get(serverName); + AdaptedServer adaptedServer = new BungeeServer(serverInfo); + result.add(new QueueServerImpl(adaptedServer.getName(), main, adaptedServer)); + } + + return result; + } + + @Override + public AdaptedServer getServer(String name) { + ServerInfo server = proxyServer.getServerInfo(name); + if(server == null) return null; + return new BungeeServer(server); + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerInfo.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerInfo.java new file mode 100644 index 0000000..98e151d --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerInfo.java @@ -0,0 +1,22 @@ +package us.ajg0702.queue.platforms.bungeecord.server; + +import net.md_5.bungee.api.config.ServerInfo; +import us.ajg0702.queue.api.server.AdaptedServerInfo; + +public class BungeeServerInfo implements AdaptedServerInfo { + + final ServerInfo handle; + public BungeeServerInfo(ServerInfo handle) { + this.handle = handle; + } + + @Override + public String getName() { + return handle.getName(); + } + + @Override + public ServerInfo getHandle() { + return handle; + } +} diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerPing.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerPing.java new file mode 100644 index 0000000..a4c21c3 --- /dev/null +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerPing.java @@ -0,0 +1,43 @@ +package us.ajg0702.queue.platforms.bungeecord.server; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; +import net.md_5.bungee.api.ServerPing; +import net.md_5.bungee.api.chat.BaseComponent; +import us.ajg0702.queue.api.server.AdaptedServerPing; + +public class BungeeServerPing implements AdaptedServerPing { + + final ServerPing handle; + + public BungeeServerPing(ServerPing handle) { + this.handle = handle; + } + + @Override + public Component getDescriptionComponent() { + BaseComponent[] baseComponents = new BaseComponent[1]; + baseComponents[0] = handle.getDescriptionComponent(); + return BungeeComponentSerializer.get().deserialize(baseComponents); + } + + @Override + public String getPlainDescription() { + return handle.getDescriptionComponent().toPlainText(); + } + + @Override + public int getPlayerCount() { + return handle.getPlayers().getOnline(); + } + + @Override + public int getMaxPlayers() { + return handle.getPlayers().getMax(); + } + + @Override + public ServerPing getHandle() { + return handle; + } +} diff --git a/platforms/bungeecord/src/main/resources/bungee.yml b/platforms/bungeecord/src/main/resources/bungee.yml new file mode 100644 index 0000000..a6e82ec --- /dev/null +++ b/platforms/bungeecord/src/main/resources/bungee.yml @@ -0,0 +1,4 @@ +name: ajQueue +version: "@VERSION@" +main: us.ajg0702.queue.platforms.bungeecord.BungeeQueue +author: ajgeiss0702 \ No newline at end of file diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java index 9882ad4..4517550 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java @@ -64,8 +64,7 @@ public class VelocityMethods implements PlatformMethods { Optional plugin = proxyServer.getPluginManager().getPlugin("ajqueue"); if(!plugin.isPresent()) return "?E"; Optional version = plugin.get().getDescription().getVersion(); - if(!version.isPresent()) return "?V"; - return version.get(); + return version.orElse("?V"); } @Override diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 3db804e..0654575 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -5,6 +5,7 @@ import com.velocitypowered.api.command.CommandManager; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.event.player.KickedFromServerEvent; import com.velocitypowered.api.event.player.ServerPostConnectEvent; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; @@ -13,6 +14,7 @@ import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import net.kyori.adventure.text.Component; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.commands.BaseCommand; import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; @@ -22,14 +24,16 @@ import us.ajg0702.queue.commands.commands.queue.QueueCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.velocity.commands.VelocityCommand; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; -import us.ajg0702.queue.platforms.velocity.server.ServerBuilderImpl; +import us.ajg0702.queue.platforms.velocity.server.VelocityServerBuilder; import java.io.File; import java.nio.file.Path; import java.util.Arrays; import java.util.List; +import java.util.Optional; import org.slf4j.Logger; +import us.ajg0702.queue.platforms.velocity.server.VelocityServer; @Plugin( id = "ajqueue", @@ -65,7 +69,7 @@ public class VelocityQueue { new VelocityMethods(this, proxyServer, logger), dataFolder ); - main.setServerBuilder(new ServerBuilderImpl(main, proxyServer)); + main.setServerBuilder(new VelocityServerBuilder(main, proxyServer)); commands = Arrays.asList( new QueueCommand(main), @@ -101,7 +105,6 @@ public class VelocityQueue { if(e.getIdentifier().getId().equals("ajqueue:tospigot")) { e.setResult(PluginMessageEvent.ForwardResult.handled()); - System.out.println("Skipping message: "+e.getIdentifier().getId()); return; } if(!e.getIdentifier().getId().equals("ajqueue:toproxy")) return; @@ -115,12 +118,28 @@ public class VelocityQueue { @SuppressWarnings("UnstableApiUsage") @Subscribe public void onJoin(ServerPostConnectEvent e) { - if(e.getPreviousServer() != null) return; // only run if the player just joined - main.getEventHandler().onPlayerJoin(new VelocityPlayer(e.getPlayer())); + if(e.getPreviousServer() != null) { // only run if the player just joined + main.getEventHandler().onPlayerJoin(new VelocityPlayer(e.getPlayer())); + } + main.getEventHandler().onPlayerJoinServer(new VelocityPlayer(e.getPlayer())); } @Subscribe public void onLeave(DisconnectEvent e) { main.getEventHandler().onPlayerLeave(new VelocityPlayer(e.getPlayer())); } + + @Subscribe + public void onKick(KickedFromServerEvent e) { + if(!e.getPlayer().getCurrentServer().isPresent()) return; // if the player is kicked on initial join, we dont care + Optional reasonOptional = e.getServerKickReason(); + main.getEventHandler().onServerKick( + new VelocityPlayer(e.getPlayer()), + new VelocityServer(e.getServer()), + reasonOptional.orElseGet(() -> Component.text("Proxy lost connection")), + // According to Tux on discord, velocity doesnt give a reason when the proxy loses connection to the connected server + e.kickedDuringServerConnect() + ); + } + } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java index 25548b6..c8d21f1 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java @@ -10,8 +10,6 @@ import java.util.List; public class VelocityCommand implements RawCommand { - - final QueueMain main; final BaseCommand command; diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java index e266045..350f165 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/players/VelocityPlayer.java @@ -9,6 +9,7 @@ import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.server.AdaptedServer; +import us.ajg0702.queue.common.QueueMain; import java.util.List; import java.util.Optional; @@ -63,7 +64,18 @@ public class VelocityPlayer implements AdaptedPlayer, Audience { @Override public void connect(AdaptedServer server) { - handle.createConnectionRequest((RegisteredServer) server.getHandle()).connect(); + handle.createConnectionRequest((RegisteredServer) server.getHandle()).connect().thenAcceptAsync( + result -> { + if(!result.isSuccessful()) { + QueueMain.getInstance().getEventHandler().onServerKick( + this, + server, + result.getReasonComponent().orElseGet(() -> Component.text("Connection failed")), + false + ); + } + } + ); } @Override diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java similarity index 82% rename from platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java rename to platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java index 94ab073..1349c8f 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/ServerBuilderImpl.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java @@ -13,11 +13,11 @@ import java.util.Collection; import java.util.List; import java.util.Optional; -public class ServerBuilderImpl implements ServerBuilder { +public class VelocityServerBuilder implements ServerBuilder { private final ProxyServer proxyServer; private final QueueMain main; - public ServerBuilderImpl(QueueMain main, ProxyServer proxyServer) { + public VelocityServerBuilder(QueueMain main, ProxyServer proxyServer) { this.proxyServer = proxyServer; this.main = main; } @@ -35,15 +35,11 @@ public class ServerBuilderImpl implements ServerBuilder { return result; } + @SuppressWarnings("OptionalIsPresent") @Override public AdaptedServer getServer(String name) { Optional serverOptional = proxyServer.getServer(name); if(!serverOptional.isPresent()) return null; return new VelocityServer(serverOptional.get()); } - - @Override - public QueueServer buildGroup(String name, List servers) { - return new QueueServerImpl(name, main, servers); - } } diff --git a/premium/build.gradle.kts b/premium/build.gradle.kts index 8d76ba5..b1ce7ce 100644 --- a/premium/build.gradle.kts +++ b/premium/build.gradle.kts @@ -29,7 +29,13 @@ dependencies { } tasks.shadowJar { - archiveFileName.set("${baseName}-${version}.${extension}") + relocate("us.ajg0702.utils", "us.ajg0702.queue.libs.utils") + relocate("org.bstats", "us.ajg0702.queue.libs.bstats") + relocate("io.leangen.geantyref", "us.ajg0702.queue.libs.geantyref") + relocate("org.spongepowered", "us.ajg0702.queue.libs.sponge") + relocate("org.yaml", "us.ajg0702.queue.libs.yaml") + archiveBaseName.set("ajQueuePlus") + archiveClassifier.set("") } publishing { diff --git a/settings.gradle.kts b/settings.gradle.kts index 1c312a2..ca75773 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,6 +6,7 @@ include(":common") include(":spigot") include(":platforms:velocity") +include(":platforms:bungeecord") include(":free") include(":premium") \ No newline at end of file From bbf644109b27c404dec753574b0209cb95186c7e Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 29 Jul 2021 14:28:09 -0700 Subject: [PATCH 27/56] clean-up --- .../java/us/ajg0702/queue/commands/BaseCommand.java | 2 ++ .../java/us/ajg0702/queue/common/QueueManagerImpl.java | 4 +--- .../main/java/us/ajg0702/queue/common/TaskManager.java | 1 + .../queue/platforms/bungeecord/BungeeQueue.java | 10 +++------- .../platforms/bungeecord/commands/BungeeCommand.java | 7 ++----- .../platforms/bungeecord/players/BungeePlayer.java | 4 ---- platforms/velocity/build.gradle.kts | 4 ++-- .../java/us/ajg0702/queue/spigot/Placeholders.java | 6 ++++-- 8 files changed, 15 insertions(+), 23 deletions(-) diff --git a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java index 9b9993e..bdec887 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java @@ -20,6 +20,7 @@ public class BaseCommand implements IBaseCommand { return null; } + @SuppressWarnings("unused") @Override public ImmutableList getSubCommands() { return null; @@ -35,6 +36,7 @@ public class BaseCommand implements IBaseCommand { return null; } + @SuppressWarnings("unused") @Override public void addSubCommand(ISubCommand subCommand) { diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 4006e56..911f040 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -14,12 +14,11 @@ import us.ajg0702.utils.common.TimeUtils; import java.util.*; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; public class QueueManagerImpl implements QueueManager { - private List servers = new ArrayList<>(); + private final List servers = new ArrayList<>(); private final QueueMain main; private final Messages msgs; @@ -283,7 +282,6 @@ public class QueueManagerImpl implements QueueManager { @Override public void sendMessages() { - if(servers == null) return; try { for(QueueServer server : servers) { for(QueuePlayer queuePlayer : server.getQueue()) { diff --git a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java index b99e1d4..77725fb 100644 --- a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java +++ b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java @@ -109,6 +109,7 @@ public class TaskManager { return scheduleAtFixedRate(executor, command, 0, period, unit); } + @SuppressWarnings("UnusedReturnValue") public ScheduledFuture runLater(Runnable runnable, long delay, TimeUnit unit) { return executor.schedule(runnable, delay, unit); } diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java index ecdba70..6e2efe1 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java @@ -28,18 +28,14 @@ import java.util.List; public class BungeeQueue extends Plugin implements Listener { - private QueueLogger logger; - private QueueMain main; - private File dataFolder; - List commands; @Override public void onEnable() { - logger = new BungeeLogger(getLogger()); - dataFolder = getDataFolder(); + QueueLogger logger = new BungeeLogger(getLogger()); + File dataFolder = getDataFolder(); main = new QueueMain( logger, @@ -60,7 +56,7 @@ public class BungeeQueue extends Plugin implements Listener { for(IBaseCommand command : commands) { getProxy().getPluginManager() - .registerCommand(this, new BungeeCommand(main, (BaseCommand) command)); + .registerCommand(this, new BungeeCommand((BaseCommand) command)); } getProxy().getPluginManager().registerListener(this, this); diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeCommand.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeCommand.java index 3334ec3..e0d949b 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeCommand.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeCommand.java @@ -5,14 +5,11 @@ import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.plugin.Command; import net.md_5.bungee.api.plugin.TabExecutor; import us.ajg0702.queue.commands.BaseCommand; -import us.ajg0702.queue.common.QueueMain; public class BungeeCommand extends Command implements TabExecutor { - QueueMain main; - BaseCommand command; - public BungeeCommand(QueueMain main, BaseCommand command) { + final BaseCommand command; + public BungeeCommand(BaseCommand command) { super(command.getName(), command.getPermission(), command.getAliases().toArray(new String[0])); - this.main = main; this.command = command; } diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/players/BungeePlayer.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/players/BungeePlayer.java index a6e0f0b..c45b73f 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/players/BungeePlayer.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/players/BungeePlayer.java @@ -2,12 +2,8 @@ package us.ajg0702.queue.platforms.bungeecord.players; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.chat.BaseComponentSerializer; import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.server.AdaptedServer; diff --git a/platforms/velocity/build.gradle.kts b/platforms/velocity/build.gradle.kts index 074f234..9c53527 100644 --- a/platforms/velocity/build.gradle.kts +++ b/platforms/velocity/build.gradle.kts @@ -35,11 +35,11 @@ tasks.withType { } tasks.jar { - exclude("**/*.java"); + exclude("**/*.java") } tasks.compileJava { - source = tasks.getByName("processResources").outputs.files.asFileTree; + source = tasks.getByName("processResources").outputs.files.asFileTree } diff --git a/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java b/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java index 3d3dbdc..5945862 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Placeholders.java @@ -118,7 +118,8 @@ public class Placeholders extends PlaceholderExpansion { * * @return possibly-null String of the requested identifier. */ - @Override + @SuppressWarnings("SuspiciousMethodCalls") + @Override public String onPlaceholderRequest(Player player, final String identifier){ //Bukkit.getLogger().info("itentifier: "+identifier); @@ -180,7 +181,8 @@ public class Placeholders extends PlaceholderExpansion { return null; } - private String parsePlaceholder(Player player, String identifier) { + @SuppressWarnings("SameReturnValue") + private String parsePlaceholder(Player player, String identifier) { if(identifier.equalsIgnoreCase("queued")) { plugin.sendMessage(player, "queuename", ""); } From 1c1430fd50fba3b0be6333f6666fe59fea8642c4 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 29 Jul 2021 14:30:35 -0700 Subject: [PATCH 28/56] pre1 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3ff4053..3e5f8d6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ repositories { } allprojects { - version = "2.0.0" + version = "2.0.0-pre1" group = "us.ajg0702" tasks.withType().configureEach { From 7825bd650db7e88642562b6781770f5ab7b748db Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 30 Jul 2021 07:58:21 -0700 Subject: [PATCH 29/56] pre2 --- build.gradle.kts | 2 +- .../us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3e5f8d6..38c9e2e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ repositories { } allprojects { - version = "2.0.0-pre1" + version = "2.0.0-pre2" group = "us.ajg0702" tasks.withType().configureEach { diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java index 6e2efe1..aa7f949 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java @@ -45,7 +45,7 @@ public class BungeeQueue extends Plugin implements Listener { main.setServerBuilder(new BungeeServerBuilder(main, getProxy())); getProxy().registerChannel("ajqueue:tospigot"); - getProxy().registerChannel("ajqueue:tobungee"); + getProxy().registerChannel("ajqueue:toproxy"); commands = Arrays.asList( new QueueCommand(main), @@ -85,7 +85,6 @@ public class BungeeQueue extends Plugin implements Listener { @EventHandler public void onPluginMessage(PluginMessageEvent e) { - if(e.getTag().equals("ajqueue:tospigot")) { e.setCancelled(true); return; From 86744676c06eeeda059f454d2ab19adae7ccef0f Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 11:12:31 -0700 Subject: [PATCH 30/56] fixed rejoin queue not working on velocity --- .../java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 0654575..37e4c47 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -118,7 +118,7 @@ public class VelocityQueue { @SuppressWarnings("UnstableApiUsage") @Subscribe public void onJoin(ServerPostConnectEvent e) { - if(e.getPreviousServer() != null) { // only run if the player just joined + if(e.getPreviousServer() == null) { // only run if the player just joined main.getEventHandler().onPlayerJoin(new VelocityPlayer(e.getPlayer())); } main.getEventHandler().onPlayerJoinServer(new VelocityPlayer(e.getPlayer())); From 090199b7ffe8734db9d7da35849c4ee660370abe Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 11:12:55 -0700 Subject: [PATCH 31/56] added more of a "buffer" for laggy connections --- .../us/ajg0702/queue/common/TaskManager.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java index 77725fb..2db235f 100644 --- a/common/src/main/java/us/ajg0702/queue/common/TaskManager.java +++ b/common/src/main/java/us/ajg0702/queue/common/TaskManager.java @@ -63,14 +63,14 @@ public class TaskManager { actionBarTask = scheduleAtFixedRate( main.getQueueManager()::sendActionBars, - 2L, - TimeUnit.SECONDS + 1500L, + TimeUnit.MILLISECONDS ); queueEventTask = scheduleAtFixedRate( main.getQueueManager()::sendQueueEvents, - 2L, - TimeUnit.SECONDS + 1500L, + TimeUnit.MILLISECONDS ); if(main.getConfig().getInt("reload-servers-interval") > 0) { @@ -85,22 +85,22 @@ public class TaskManager { public void cancelTasks() { if(sendTask != null && !sendTask.isCancelled()) { - sendTask.cancel(false); + sendTask.cancel(true); } if(updateTask != null && !updateTask.isCancelled()) { updateTask.cancel(true); } if(messageTask != null && !messageTask.isCancelled()) { - messageTask.cancel(false); + messageTask.cancel(true); } if(actionBarTask != null && !actionBarTask.isCancelled()) { - actionBarTask.cancel(false); + actionBarTask.cancel(true); } if(queueEventTask != null && !queueEventTask.isCancelled()) { - queueEventTask.cancel(false); + queueEventTask.cancel(true); } if(reloadServerTask != null && !reloadServerTask.isCancelled()) { - reloadServerTask.cancel(false); + reloadServerTask.cancel(true); reloadServerTask = null; } } From edb89c620a910733d1c4e3b475843bc1c54c2239 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 11:13:05 -0700 Subject: [PATCH 32/56] fixed reload command not reloading messages --- .../java/us/ajg0702/queue/commands/commands/manage/Reload.java | 1 + 1 file changed, 1 insertion(+) diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java index 5b2a1b4..476de41 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java @@ -53,6 +53,7 @@ public class Reload extends SubCommand { main.setTimeBetweenPlayers(); main.getTaskManager().rescheduleTasks(); main.getQueueManager().reloadServers(); + main.getMessages().reload(); sender.sendMessage(getMessages().getComponent("commands.reload")); } From 5f76577be66021d2d447fd78b354c841aef77af9 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 11:13:31 -0700 Subject: [PATCH 33/56] Fixed possible NPE if player logs out when an actionbar is being sent --- .../src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 911f040..ec066c9 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -250,7 +250,7 @@ public class QueueManagerImpl implements QueueManager { if(!getSingleServer(player).equals(server)) continue; if(!server.isJoinable(player)) { - queuePlayer.getPlayer().sendActionBar(msgs.getComponent("spigot.actionbar.offline", + player.sendActionBar(msgs.getComponent("spigot.actionbar.offline", "POS:"+pos, "LEN:"+server.getQueue().size(), "SERVER:"+server.getAlias(), From 7302a9f910af4be58e6c53d7092be88621f9a72c Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 11:14:19 -0700 Subject: [PATCH 34/56] fix rejoin mixing miliseconds and seconds without converting --- common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java | 2 +- premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java index fbfe2d3..6e26917 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java @@ -18,6 +18,6 @@ public class FreeLogic implements Logic { @Override public boolean playerDisconnectedTooLong(QueuePlayer player) { - return player.getMaxOfflineTime() < player.getTimeSinceOnline(); + return player.getMaxOfflineTime() < player.getTimeSinceOnline()*1000; } } diff --git a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java index bd94188..4818bd6 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java @@ -88,6 +88,6 @@ public class PremiumLogic implements Logic { @Override public boolean playerDisconnectedTooLong(QueuePlayer player) { - return player.getTimeSinceOnline() > player.getMaxOfflineTime(); + return player.getTimeSinceOnline() > player.getMaxOfflineTime()*1000L; } } From 347baf072d53e537d47fe7c2b4e0b6f18e7fc7fe Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 11:14:45 -0700 Subject: [PATCH 35/56] dont rejoin queue in queue-servers --- .../java/us/ajg0702/queue/common/EventHandlerImpl.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java index 24592d3..17b0a84 100644 --- a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -112,6 +112,15 @@ public class EventHandlerImpl implements EventHandler { ImmutableList queues = main.getQueueManager().findPlayerInQueues(player); for(QueuePlayer queuePlayer : queues) { ((QueuePlayerImpl) queuePlayer).setLeaveTime(System.currentTimeMillis()); + List svs = main.getConfig().getStringList("queue-servers"); + for(String s : svs) { + if(!s.contains(":")) continue; + String[] parts = s.split(":"); + String from = parts[0]; + if(queuePlayer.getQueueServer().getServerNames().contains(from)) { + queuePlayer.getQueueServer().removePlayer(queuePlayer); + } + } } main.getQueueManager().clear(player); } From bf907855b3191f6fa8aeba1aa8c55235c54523a5 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 11:15:34 -0700 Subject: [PATCH 36/56] pre3 --- api/build.gradle.kts | 3 ++- build.gradle.kts | 2 +- common/build.gradle.kts | 3 ++- free/build.gradle.kts | 3 ++- platforms/bungeecord/build.gradle.kts | 3 ++- platforms/velocity/build.gradle.kts | 3 ++- premium/build.gradle.kts | 3 ++- spigot/build.gradle.kts | 3 ++- 8 files changed, 15 insertions(+), 8 deletions(-) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 24dcb53..832835b 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -6,6 +6,7 @@ plugins { group = "us.ajg0702.queue.api" repositories { + mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } @@ -16,7 +17,7 @@ dependencies { implementation("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.6") + compileOnly("us.ajg0702:ajUtils:1.1.7") } publishing { diff --git a/build.gradle.kts b/build.gradle.kts index 38c9e2e..64a90f4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ repositories { } allprojects { - version = "2.0.0-pre2" + version = "2.0.0-pre3" group = "us.ajg0702" tasks.withType().configureEach { diff --git a/common/build.gradle.kts b/common/build.gradle.kts index e62ad3b..e344096 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -6,6 +6,7 @@ plugins { group = "us.ajg0702.queue.common" repositories { + mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } } @@ -15,7 +16,7 @@ dependencies { compileOnly("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.6") + compileOnly("us.ajg0702:ajUtils:1.1.7") compileOnly("org.slf4j:slf4j-log4j12:1.7.29") diff --git a/free/build.gradle.kts b/free/build.gradle.kts index a74d973..f8a2e54 100644 --- a/free/build.gradle.kts +++ b/free/build.gradle.kts @@ -7,6 +7,7 @@ plugins { group = "us.ajg0702.queue" repositories { + mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } @@ -17,7 +18,7 @@ dependencies { compileOnly("com.google.guava:guava:30.1.1-jre") compileOnly("org.spongepowered:configurate-yaml:4.0.0") - implementation("us.ajg0702:ajUtils:1.1.6") + implementation("us.ajg0702:ajUtils:1.1.7") implementation(project(":platforms:velocity")) implementation(project(":platforms:bungeecord")) diff --git a/platforms/bungeecord/build.gradle.kts b/platforms/bungeecord/build.gradle.kts index 9b2682f..2913b87 100644 --- a/platforms/bungeecord/build.gradle.kts +++ b/platforms/bungeecord/build.gradle.kts @@ -6,6 +6,7 @@ plugins { group = "us.ajg0702.queue.platforms.bungeecord" repositories { + mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } maven { url = uri("https://nexus.velocitypowered.com/repository/maven-public/") } @@ -14,7 +15,7 @@ repositories { dependencies { compileOnly("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.6") + compileOnly("us.ajg0702:ajUtils:1.1.7") compileOnly("net.md-5:bungeecord-api:1.14-SNAPSHOT") diff --git a/platforms/velocity/build.gradle.kts b/platforms/velocity/build.gradle.kts index 9c53527..2079a8e 100644 --- a/platforms/velocity/build.gradle.kts +++ b/platforms/velocity/build.gradle.kts @@ -6,6 +6,7 @@ plugins { group = "us.ajg0702.queue.platforms.velocity" repositories { + mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } maven { url = uri("https://nexus.velocitypowered.com/repository/maven-public/") } @@ -14,7 +15,7 @@ repositories { dependencies { compileOnly("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.6") + compileOnly("us.ajg0702:ajUtils:1.1.7") compileOnly("com.velocitypowered:velocity-api:3.0.0") annotationProcessor("com.velocitypowered:velocity-api:3.0.0") diff --git a/premium/build.gradle.kts b/premium/build.gradle.kts index b1ce7ce..6c79fbc 100644 --- a/premium/build.gradle.kts +++ b/premium/build.gradle.kts @@ -7,6 +7,7 @@ plugins { group = "us.ajg0702.queue" repositories { + mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } @@ -21,7 +22,7 @@ dependencies { compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.6") + compileOnly("us.ajg0702:ajUtils:1.1.7") compileOnly("net.kyori:adventure-api:4.8.1") diff --git a/spigot/build.gradle.kts b/spigot/build.gradle.kts index f0d692a..f43f38c 100644 --- a/spigot/build.gradle.kts +++ b/spigot/build.gradle.kts @@ -6,6 +6,7 @@ plugins { group = "us.ajg0702.queue.spigot" repositories { + mavenLocal() mavenCentral() maven { url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/") } @@ -19,7 +20,7 @@ dependencies { implementation("net.kyori:adventure-api:4.8.1") compileOnly("com.google.guava:guava:30.1.1-jre") - compileOnly("us.ajg0702:ajUtils:1.1.6") + compileOnly("us.ajg0702:ajUtils:1.1.7") compileOnly(group = "org.spigotmc", name = "spigot", version = "1.16.5-R0.1-SNAPSHOT") compileOnly("me.clip:placeholderapi:2.10.4") From f644745c2492f04690bc1903ea4f57bcf67b4c21 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 14:10:57 -0700 Subject: [PATCH 37/56] fix reload CME --- .../main/java/us/ajg0702/queue/common/QueueManagerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index ec066c9..545274f 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -14,11 +14,12 @@ import us.ajg0702.utils.common.TimeUtils; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; public class QueueManagerImpl implements QueueManager { - private final List servers = new ArrayList<>(); + private final List servers = new CopyOnWriteArrayList<>(); private final QueueMain main; private final Messages msgs; From f5693532137a05dd4854c3d2478a4b708356726a Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 31 Jul 2021 14:11:30 -0700 Subject: [PATCH 38/56] check if a player is in a queue server and isnt queued --- .../us/ajg0702/queue/api/PlatformMethods.java | 3 +++ .../queue/common/QueueManagerImpl.java | 19 +++++++++++++++++-- .../platforms/bungeecord/BungeeMethods.java | 10 ++++++++++ .../platforms/velocity/VelocityMethods.java | 10 ++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index 8cd0433..91c2256 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.api; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; import java.util.List; @@ -42,4 +43,6 @@ public interface PlatformMethods { * @return if the plugin is on the server */ boolean hasPlugin(String pluginName); + + AdaptedServer getServer(String name); } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 545274f..7dcec34 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -194,8 +194,8 @@ public class QueueManagerImpl implements QueueManager { servers.addAll(main.getServerBuilder().buildServers()); - List groupsraw = main.getConfig().getStringList("server-groups"); - for(String groupraw : groupsraw) { + List groupsRaw = main.getConfig().getStringList("server-groups"); + for(String groupraw : groupsRaw) { if(groupraw.isEmpty()) { main.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); continue; @@ -272,6 +272,21 @@ public class QueueManagerImpl implements QueueManager { @Override public void sendQueueEvents() { + List svs = main.getConfig().getStringList("queue-servers"); + for(String s : svs) { + if(!s.contains(":")) continue; + String[] parts = s.split(":"); + String fromName = parts[0]; + String toName = parts[1]; + AdaptedServer from = main.getPlatformMethods().getServer(fromName); + QueueServer to = findServer(toName); + if(from == null || to == null) continue; + from.getPlayers().forEach(player -> { + if(!getPlayerQueues(player).contains(to)) { + addToQueue(player, to); + } + }); + } for (QueueServer s : servers) { for (QueuePlayer queuePlayer : s.getQueue()) { AdaptedPlayer player = queuePlayer.getPlayer(); diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java index 7c55d47..d334c34 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java @@ -3,14 +3,17 @@ package us.ajg0702.queue.platforms.bungeecord; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import us.ajg0702.queue.api.PlatformMethods; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.util.QueueLogger; import us.ajg0702.queue.commands.commands.PlayerSender; import us.ajg0702.queue.platforms.bungeecord.players.BungeePlayer; +import us.ajg0702.queue.platforms.bungeecord.server.BungeeServer; import java.util.ArrayList; import java.util.Collection; @@ -100,4 +103,11 @@ public class BungeeMethods implements PlatformMethods { public boolean hasPlugin(String pluginName) { return proxyServer.getPluginManager().getPlugin(pluginName) != null; } + + @Override + public AdaptedServer getServer(String name) { + ServerInfo server = proxyServer.getServerInfo(name); + if(server == null) return null; + return new BungeeServer(server); + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java index 4517550..993ec9e 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java @@ -13,15 +13,18 @@ import us.ajg0702.queue.api.PlatformMethods; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.commands.ICommandSender; import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.util.QueueLogger; import us.ajg0702.queue.commands.commands.PlayerSender; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; +import us.ajg0702.queue.platforms.velocity.server.VelocityServer; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Optional; +@SuppressWarnings("OptionalIsPresent") public class VelocityMethods implements PlatformMethods { final ProxyServer proxyServer; @@ -122,4 +125,11 @@ public class VelocityMethods implements PlatformMethods { public boolean hasPlugin(String pluginName) { return proxyServer.getPluginManager().getPlugin(pluginName.toLowerCase(Locale.ROOT)).isPresent(); } + + @Override + public AdaptedServer getServer(String name) { + Optional server = proxyServer.getServer(name); + if(!server.isPresent()) return null; + return new VelocityServer(server.get()); + } } From a8668890cefe87c581faf7e02ef5b606d07e3694 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 11:19:25 -0700 Subject: [PATCH 39/56] fixed messages from commands not disabling correctly --- .../queue/platforms/bungeecord/commands/BungeeSender.java | 2 ++ .../queue/platforms/velocity/commands/VelocitySender.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeSender.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeSender.java index bcc5a7a..dda2f74 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeSender.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/commands/BungeeSender.java @@ -1,6 +1,7 @@ package us.ajg0702.queue.platforms.bungeecord.commands; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import org.jetbrains.annotations.NotNull; @@ -27,6 +28,7 @@ public class BungeeSender implements ICommandSender { @Override public void sendMessage(@NotNull Component message) { + if(PlainTextComponentSerializer.plainText().serialize(message).isEmpty()) return; BungeeQueue.adventure().sender(handle).sendMessage(message); } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java index bd9a6ea..765651e 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocitySender.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.platforms.velocity.commands; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.ConsoleCommandSource; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.jetbrains.annotations.NotNull; import us.ajg0702.queue.api.commands.ICommandSender; @@ -26,6 +27,7 @@ public class VelocitySender implements ICommandSender { @Override public void sendMessage(@NotNull Component message) { + if(PlainTextComponentSerializer.plainText().serialize(message).isEmpty()) return; handle.sendMessage(message); } From 02577f741bf6c132b286b8bff6028eab6548c343 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 11:19:59 -0700 Subject: [PATCH 40/56] Check if target server exists before queueing player (for queue-server) --- .../main/java/us/ajg0702/queue/common/EventHandlerImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java index 17b0a84..9316cbd 100644 --- a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -138,18 +138,18 @@ public class EventHandlerImpl implements EventHandler { } - String serverName = player.getServerName(); List svs = main.getConfig().getStringList("queue-servers"); for(String s : svs) { if(!s.contains(":")) continue; String[] parts = s.split(":"); String from = parts[0]; - String to = parts[1]; - if(from.equalsIgnoreCase(serverName)) { + QueueServer to = main.getQueueManager().findServer(parts[1]); + if(from.equalsIgnoreCase(serverName) && to != null) { main.getQueueManager().addToQueue(player, to); } } + } @Override From fc6c7f725c95db310c52e0fa3c0a5ea9d0364a18 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 11:21:04 -0700 Subject: [PATCH 41/56] Fixed no permission message on player join (on velocity --- .../queue/platforms/velocity/commands/VelocityCommand.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java index c8d21f1..c95021c 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/commands/VelocityCommand.java @@ -34,6 +34,8 @@ public class VelocityCommand implements RawCommand { @Override public boolean hasPermission(final Invocation invocation) { - return command.checkPermission(new VelocitySender(invocation.source())); + String permission = command.getPermission(); + if(permission == null) return true; + return invocation.source().hasPermission(permission); } } From 19a17b8ddf3563b636a5fdd4764e2bf284b30e3c Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 11:50:15 -0700 Subject: [PATCH 42/56] add players back to queue and preserve paused state on reload --- .../queue/api/server/ServerBuilder.java | 2 +- .../queue/common/QueueManagerImpl.java | 45 +++++++++++++++---- .../queue/common/players/QueuePlayerImpl.java | 13 +++++- .../queue/common/queues/QueueServerImpl.java | 31 +++++++++++-- .../platforms/bungeecord/BungeeQueue.java | 2 +- .../server/BungeeServerBuilder.java | 22 +++------ .../platforms/velocity/VelocityQueue.java | 2 +- .../server/VelocityServerBuilder.java | 21 +++------ 8 files changed, 92 insertions(+), 46 deletions(-) diff --git a/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java index 23b08e8..53955fd 100644 --- a/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java +++ b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java @@ -5,7 +5,7 @@ import us.ajg0702.queue.api.queues.QueueServer; import java.util.List; public interface ServerBuilder { - List buildServers(); + List getServers(); AdaptedServer getServer(String name); } diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 7dcec34..44b7948 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -19,7 +19,7 @@ import java.util.concurrent.TimeUnit; public class QueueManagerImpl implements QueueManager { - private final List servers = new CopyOnWriteArrayList<>(); + private List servers = new CopyOnWriteArrayList<>(); private final QueueMain main; private final Messages msgs; @@ -36,6 +36,27 @@ public class QueueManagerImpl implements QueueManager { }, delay, TimeUnit.MILLISECONDS); } + public List buildServers() { + List result = new ArrayList<>(); + List servers = main.getServerBuilder().getServers(); + + for(AdaptedServer server : servers) { + QueueServer previousServer = main.getQueueManager().findServer(server.getName()); + List previousPlayers = previousServer == null ? new ArrayList<>() : previousServer.getQueue(); + if(previousPlayers.size() > 0) { + main.getLogger().info("Adding "+previousPlayers.size()+" players back to the queue for "+server.getName()); + } + QueueServer queueServer = new QueueServerImpl(server.getName(), main, server, previousPlayers); + if(previousServer != null) { + queueServer.setPaused(previousServer.isPaused()); + queueServer.setLastSentTime(previousServer.getLastSentTime()); + } + result.add(queueServer); + } + + return result; + } + @Override public boolean addToQueue(AdaptedPlayer player, QueueServer server) { if(player == null || server == null) { @@ -190,19 +211,19 @@ public class QueueManagerImpl implements QueueManager { main.getLogger().severe("[MAN] Config is null"); } - servers.clear(); + List oldServers = ImmutableList.copyOf(servers); - servers.addAll(main.getServerBuilder().buildServers()); + servers = buildServers(); List groupsRaw = main.getConfig().getStringList("server-groups"); - for(String groupraw : groupsRaw) { - if(groupraw.isEmpty()) { + for(String groupRaw : groupsRaw) { + if(groupRaw.isEmpty()) { main.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); continue; } - String groupName = groupraw.split(":")[0]; - String[] serversraw = groupraw.split(":")[1].split(","); + String groupName = groupRaw.split(":")[0]; + String[] serversraw = groupRaw.split(":")[1].split(","); if(findServer(groupName) != null) { main.getLogger().warning("The name of a group ('"+groupName+"') cannot be the same as the name of a server!"); @@ -227,7 +248,15 @@ public class QueueManagerImpl implements QueueManager { continue; } - this.servers.add(new QueueServerImpl(groupName, main, groupServers)); + + final List previousPlayers = new ArrayList<>(); + oldServers.forEach(queueServer -> { + if(queueServer.getName().equals(groupName)) { + previousPlayers.addAll(queueServer.getQueue()); + } + }); + + this.servers.add(new QueueServerImpl(groupName, main, groupServers, previousPlayers)); } } diff --git a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java index 14385f9..5c1b619 100644 --- a/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/players/QueuePlayerImpl.java @@ -1,5 +1,6 @@ package us.ajg0702.queue.common.players; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; @@ -20,14 +21,22 @@ public class QueuePlayerImpl implements QueuePlayer { private final int maxOfflineTime; + public QueuePlayerImpl(UUID uuid, String name, QueueServer server, int highestPriority, int maxOfflineTime) { + this(null, name, uuid, server, highestPriority, maxOfflineTime); + } + public QueuePlayerImpl(AdaptedPlayer player, QueueServer server, int highestPriority, int maxOfflineTime) { + this(player, player.getName(), player.getUniqueId(), server, highestPriority, maxOfflineTime); + } + + private QueuePlayerImpl(@Nullable AdaptedPlayer player, String name, @NotNull UUID uuid, QueueServer server, int highestPriority, int maxOfflineTime) { this.player = player; this.server = server; this.highestPriority = highestPriority; - uuid = player.getUniqueId(); - name = player.getName(); + this.uuid = uuid; + this.name = name; this.maxOfflineTime = maxOfflineTime; } diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index f352ff8..483c640 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -7,6 +7,7 @@ import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.AdaptedServerPing; import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.common.players.QueuePlayerImpl; import us.ajg0702.utils.common.GenUtils; import us.ajg0702.utils.common.Messages; @@ -20,14 +21,37 @@ public class QueueServerImpl implements QueueServer { private final String name; - public QueueServerImpl(String name, QueueMain main, AdaptedServer server) { - this(name, main, Collections.singletonList(server)); + public QueueServerImpl(String name, QueueMain main, AdaptedServer server, List previousPlayers) { + this(name, main, Collections.singletonList(server), previousPlayers); } - public QueueServerImpl(String name, QueueMain main, List servers) { + public QueueServerImpl(String name, QueueMain main, List servers, List previousPlayers) { this.name = name; this.servers = servers; this.main = main; + + for(QueuePlayer queuePlayer : previousPlayers) { + if(queuePlayer.getPlayer() == null) { + addPlayer( + new QueuePlayerImpl( + queuePlayer.getUniqueId(), + queuePlayer.getName(), + this, + queuePlayer.getPriority(), + queuePlayer.getMaxOfflineTime() + ) + ); + } else { + addPlayer( + new QueuePlayerImpl( + queuePlayer.getPlayer(), + this, + queuePlayer.getPriority(), + queuePlayer.getMaxOfflineTime() + ) + ); + } + } } private final QueueMain main; @@ -251,6 +275,7 @@ public class QueueServerImpl implements QueueServer { @Override public synchronized void addPlayer(QueuePlayer player, int position) { if(!player.getQueueServer().equals(this) || queue.contains(player)) return; + if(position > 0) { queue.add(position, player); } else { diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java index aa7f949..f8dfe6c 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java @@ -42,7 +42,7 @@ public class BungeeQueue extends Plugin implements Listener { new BungeeMethods(this, getProxy(), logger), dataFolder ); - main.setServerBuilder(new BungeeServerBuilder(main, getProxy())); + main.setServerBuilder(new BungeeServerBuilder(getProxy())); getProxy().registerChannel("ajqueue:tospigot"); getProxy().registerChannel("ajqueue:toproxy"); diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java index 15d143c..bf16da8 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java @@ -2,33 +2,25 @@ package us.ajg0702.queue.platforms.bungeecord.server; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ServerInfo; -import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; import us.ajg0702.queue.api.server.ServerBuilder; -import us.ajg0702.queue.common.QueueMain; -import us.ajg0702.queue.common.queues.QueueServerImpl; -import java.util.*; +import java.util.ArrayList; +import java.util.List; public class BungeeServerBuilder implements ServerBuilder { private final ProxyServer proxyServer; - private final QueueMain main; - public BungeeServerBuilder(QueueMain main, ProxyServer proxyServer) { + + public BungeeServerBuilder(ProxyServer proxyServer) { this.proxyServer = proxyServer; - this.main = main; } @Override - public List buildServers() { - List result = new ArrayList<>(); - Map servers = proxyServer.getServers(); + public List getServers() { + List result = new ArrayList<>(); - for(String serverName : servers.keySet()) { - ServerInfo serverInfo = servers.get(serverName); - AdaptedServer adaptedServer = new BungeeServer(serverInfo); - result.add(new QueueServerImpl(adaptedServer.getName(), main, adaptedServer)); - } + proxyServer.getServers().forEach((s, serverInfo) -> result.add(new BungeeServer(serverInfo))); return result; } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index 37e4c47..fd07797 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -69,7 +69,7 @@ public class VelocityQueue { new VelocityMethods(this, proxyServer, logger), dataFolder ); - main.setServerBuilder(new VelocityServerBuilder(main, proxyServer)); + main.setServerBuilder(new VelocityServerBuilder(proxyServer)); commands = Arrays.asList( new QueueCommand(main), diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java index 1349c8f..c8988f6 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java @@ -2,35 +2,26 @@ package us.ajg0702.queue.platforms.velocity.server; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.server.RegisteredServer; -import us.ajg0702.queue.api.server.ServerBuilder; -import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; -import us.ajg0702.queue.common.QueueMain; -import us.ajg0702.queue.common.queues.QueueServerImpl; +import us.ajg0702.queue.api.server.ServerBuilder; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Optional; public class VelocityServerBuilder implements ServerBuilder { private final ProxyServer proxyServer; - private final QueueMain main; - public VelocityServerBuilder(QueueMain main, ProxyServer proxyServer) { + + public VelocityServerBuilder(ProxyServer proxyServer) { this.proxyServer = proxyServer; - this.main = main; } @Override - public List buildServers() { - List result = new ArrayList<>(); - Collection servers = proxyServer.getAllServers(); + public List getServers() { + List result = new ArrayList<>(); - for(RegisteredServer server : servers) { - AdaptedServer adaptedServer = new VelocityServer(server); - result.add(new QueueServerImpl(adaptedServer.getName(), main, adaptedServer)); - } + proxyServer.getAllServers().forEach(registeredServer -> result.add(new VelocityServer(registeredServer))); return result; } From 1874ad78e8ecfafade0341cc40b731c8089b7ec5 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 11:57:22 -0700 Subject: [PATCH 43/56] Remove ServerBuilder --- .../us/ajg0702/queue/api/PlatformMethods.java | 2 ++ .../queue/api/server/ServerBuilder.java | 11 ------ .../queue/commands/commands/manage/Send.java | 2 +- .../us/ajg0702/queue/common/QueueMain.java | 25 ------------- .../queue/common/QueueManagerImpl.java | 14 ++++---- .../platforms/bungeecord/BungeeMethods.java | 9 +++++ .../platforms/bungeecord/BungeeQueue.java | 2 -- .../server/BungeeServerBuilder.java | 34 ------------------ .../platforms/velocity/VelocityMethods.java | 10 ++++++ .../platforms/velocity/VelocityQueue.java | 7 ++-- .../server/VelocityServerBuilder.java | 36 ------------------- 11 files changed, 30 insertions(+), 122 deletions(-) delete mode 100644 api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java delete mode 100644 platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java delete mode 100644 platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java diff --git a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java index 91c2256..14bfcc4 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -45,4 +45,6 @@ public interface PlatformMethods { boolean hasPlugin(String pluginName); AdaptedServer getServer(String name); + + List getServers(); } diff --git a/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java b/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java deleted file mode 100644 index 53955fd..0000000 --- a/api/src/main/java/us/ajg0702/queue/api/server/ServerBuilder.java +++ /dev/null @@ -1,11 +0,0 @@ -package us.ajg0702.queue.api.server; - -import us.ajg0702.queue.api.queues.QueueServer; - -import java.util.List; - -public interface ServerBuilder { - List getServers(); - - AdaptedServer getServer(String name); -} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java index 1eea23e..7d04795 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java @@ -66,7 +66,7 @@ public class Send extends SubCommand { ); } else if(main.getQueueManager().getServerNames().contains(args[0])) { - AdaptedServer from = main.getServerBuilder().getServer(args[0]); + AdaptedServer from = main.getPlatformMethods().getServer(args[0]); if(from == null) { sender.sendMessage(getMessages().getComponent("errors.server-not-exist", "SERVER:"+args[0])); return; diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 8b860b9..8f1dc22 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -2,7 +2,6 @@ package us.ajg0702.queue.common; import org.spongepowered.configurate.ConfigurateException; import us.ajg0702.queue.api.*; -import us.ajg0702.queue.api.server.ServerBuilder; import us.ajg0702.queue.api.util.QueueLogger; import us.ajg0702.queue.common.utils.LogConverter; import us.ajg0702.queue.logic.LogicGetterImpl; @@ -10,10 +9,7 @@ import us.ajg0702.utils.common.Config; import us.ajg0702.utils.common.Messages; import java.io.File; -import java.util.ArrayList; import java.util.LinkedHashMap; -import java.util.List; -import java.util.concurrent.*; public class QueueMain { @@ -74,27 +70,6 @@ public class QueueMain { return eventHandler; } - private final List> serverCompletableFutures = new ArrayList<>(); - private ServerBuilder serverBuilder; - public ServerBuilder getServerBuilder() { - return serverBuilder; - } - public CompletableFuture getFutureServerBuilder() { - CompletableFuture completableFuture = new CompletableFuture<>(); - if(serverBuilder != null) { - completableFuture.complete(serverBuilder); - } - serverCompletableFutures.add(completableFuture); - return completableFuture; - } - public void setServerBuilder(ServerBuilder serverBuilder) { - if(this.serverBuilder != null) throw new IllegalStateException("SeverBuilder already set"); - this.serverBuilder = serverBuilder; - for(CompletableFuture future : serverCompletableFutures) { - future.complete(serverBuilder); - } - } - private QueueManager queueManager; public QueueManager getQueueManager() { return queueManager; diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index 44b7948..d380ad0 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -6,14 +6,15 @@ import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.queues.QueueServer; import us.ajg0702.queue.api.server.AdaptedServer; -import us.ajg0702.queue.api.server.ServerBuilder; import us.ajg0702.queue.common.players.QueuePlayerImpl; import us.ajg0702.queue.common.queues.QueueServerImpl; import us.ajg0702.utils.common.Messages; import us.ajg0702.utils.common.TimeUtils; -import java.util.*; -import java.util.concurrent.CompletableFuture; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; @@ -30,15 +31,12 @@ public class QueueManagerImpl implements QueueManager { int delay = main.getConfig().getBoolean("wait-to-load-servers") ? main.getConfig().getInt("wait-to-load-servers-delay") : 0; - main.getTaskManager().runLater(() -> { - CompletableFuture serverBuilderFuture = main.getFutureServerBuilder(); - serverBuilderFuture.thenRunAsync(this::reloadServers); - }, delay, TimeUnit.MILLISECONDS); + main.getTaskManager().runLater(this::reloadServers, delay, TimeUnit.MILLISECONDS); } public List buildServers() { List result = new ArrayList<>(); - List servers = main.getServerBuilder().getServers(); + List servers = main.getPlatformMethods().getServers(); for(AdaptedServer server : servers) { QueueServer previousServer = main.getQueueManager().findServer(server.getName()); diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java index d334c34..9a6ef6e 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeMethods.java @@ -110,4 +110,13 @@ public class BungeeMethods implements PlatformMethods { if(server == null) return null; return new BungeeServer(server); } + + @Override + public List getServers() { + List result = new ArrayList<>(); + + proxyServer.getServers().forEach((s, serverInfo) -> result.add(new BungeeServer(serverInfo))); + + return result; + } } diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java index f8dfe6c..1d41a21 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java @@ -20,7 +20,6 @@ import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.bungeecord.commands.BungeeCommand; import us.ajg0702.queue.platforms.bungeecord.players.BungeePlayer; import us.ajg0702.queue.platforms.bungeecord.server.BungeeServer; -import us.ajg0702.queue.platforms.bungeecord.server.BungeeServerBuilder; import java.io.File; import java.util.Arrays; @@ -42,7 +41,6 @@ public class BungeeQueue extends Plugin implements Listener { new BungeeMethods(this, getProxy(), logger), dataFolder ); - main.setServerBuilder(new BungeeServerBuilder(getProxy())); getProxy().registerChannel("ajqueue:tospigot"); getProxy().registerChannel("ajqueue:toproxy"); diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java deleted file mode 100644 index bf16da8..0000000 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/server/BungeeServerBuilder.java +++ /dev/null @@ -1,34 +0,0 @@ -package us.ajg0702.queue.platforms.bungeecord.server; - -import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.config.ServerInfo; -import us.ajg0702.queue.api.server.AdaptedServer; -import us.ajg0702.queue.api.server.ServerBuilder; - -import java.util.ArrayList; -import java.util.List; - -public class BungeeServerBuilder implements ServerBuilder { - - private final ProxyServer proxyServer; - - public BungeeServerBuilder(ProxyServer proxyServer) { - this.proxyServer = proxyServer; - } - - @Override - public List getServers() { - List result = new ArrayList<>(); - - proxyServer.getServers().forEach((s, serverInfo) -> result.add(new BungeeServer(serverInfo))); - - return result; - } - - @Override - public AdaptedServer getServer(String name) { - ServerInfo server = proxyServer.getServerInfo(name); - if(server == null) return null; - return new BungeeServer(server); - } -} diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java index 993ec9e..e899725 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityMethods.java @@ -132,4 +132,14 @@ public class VelocityMethods implements PlatformMethods { if(!server.isPresent()) return null; return new VelocityServer(server.get()); } + + + @Override + public List getServers() { + List result = new ArrayList<>(); + + proxyServer.getAllServers().forEach(registeredServer -> result.add(new VelocityServer(registeredServer))); + + return result; + } } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index fd07797..d4f0e27 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -15,6 +15,7 @@ import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import net.kyori.adventure.text.Component; +import org.slf4j.Logger; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.commands.BaseCommand; import us.ajg0702.queue.commands.commands.leavequeue.LeaveCommand; @@ -24,7 +25,7 @@ import us.ajg0702.queue.commands.commands.queue.QueueCommand; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.velocity.commands.VelocityCommand; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; -import us.ajg0702.queue.platforms.velocity.server.VelocityServerBuilder; +import us.ajg0702.queue.platforms.velocity.server.VelocityServer; import java.io.File; import java.nio.file.Path; @@ -32,9 +33,6 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; -import org.slf4j.Logger; -import us.ajg0702.queue.platforms.velocity.server.VelocityServer; - @Plugin( id = "ajqueue", name = "ajQueue", @@ -69,7 +67,6 @@ public class VelocityQueue { new VelocityMethods(this, proxyServer, logger), dataFolder ); - main.setServerBuilder(new VelocityServerBuilder(proxyServer)); commands = Arrays.asList( new QueueCommand(main), diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java deleted file mode 100644 index c8988f6..0000000 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServerBuilder.java +++ /dev/null @@ -1,36 +0,0 @@ -package us.ajg0702.queue.platforms.velocity.server; - -import com.velocitypowered.api.proxy.ProxyServer; -import com.velocitypowered.api.proxy.server.RegisteredServer; -import us.ajg0702.queue.api.server.AdaptedServer; -import us.ajg0702.queue.api.server.ServerBuilder; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -public class VelocityServerBuilder implements ServerBuilder { - - private final ProxyServer proxyServer; - - public VelocityServerBuilder(ProxyServer proxyServer) { - this.proxyServer = proxyServer; - } - - @Override - public List getServers() { - List result = new ArrayList<>(); - - proxyServer.getAllServers().forEach(registeredServer -> result.add(new VelocityServer(registeredServer))); - - return result; - } - - @SuppressWarnings("OptionalIsPresent") - @Override - public AdaptedServer getServer(String name) { - Optional serverOptional = proxyServer.getServer(name); - if(!serverOptional.isPresent()) return null; - return new VelocityServer(serverOptional.get()); - } -} From 326add3db510fb62fd72c9794cf03d4d15cbac49 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 12:03:21 -0700 Subject: [PATCH 44/56] pre4 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 64a90f4..2b612c9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ repositories { } allprojects { - version = "2.0.0-pre3" + version = "2.0.0-pre4" group = "us.ajg0702" tasks.withType().configureEach { From af81a70c77c3e471744c34cfe9bf54e4ec599ba3 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 17:48:12 -0700 Subject: [PATCH 45/56] update readme --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 2ecd4f2..be07c4c 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@ # ajQueue -ajQueue is (as far as I can tell) the best queue plugin out there (even better than queue plugins that cost $10, and ajQueue is free :D). -This is the source code for ajQueue. If you make changes, open a merge request and ill probably approve it, as long as its not dumb :p +[Wiki](https://wiki.ajg0702.us/ajqueue/) | +[Spigot (free)](https://www.spigotmc.org/resources/ajqueue.78266/) | +[Spigot (premium)](https://www.spigotmc.org/resources/ajqueueplus.79123/) -## My dumb code -If you say my code is ugly, fix it and open a merge reguest before making fun of it ;) +ajQueue is (as far as I can tell) the best queue plugin out there. +It was made because I wasn't satisfied with the existing queue plugins, all of them either being massively overpriced, +or lacking basic features -## ajQueuePlus -The source code for ajQueuePlus will probably stay private. \ No newline at end of file +# Contributing +As long as you don't break anything, i'll probably accept any merge requests you submit. +If you need *any* help making your changes, feel free to contact me on discord. The invite link is on the plugin page ;) From 1dbf14553e27791eee5fe41e977ceb4c6e690142 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 17:49:56 -0700 Subject: [PATCH 46/56] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index be07c4c..ca3914c 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,6 @@ or lacking basic features # Contributing As long as you don't break anything, i'll probably accept any merge requests you submit. +I like to have the least number of steps possible for server owners updating my plugin. + If you need *any* help making your changes, feel free to contact me on discord. The invite link is on the plugin page ;) From 6380805d7241a5ead2651504d6ed911a1343c0b3 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 1 Aug 2021 20:39:04 -0700 Subject: [PATCH 47/56] Change permissions to be more specific --- .../java/us/ajg0702/queue/commands/commands/manage/ISP.java | 2 +- .../java/us/ajg0702/queue/commands/commands/manage/Pause.java | 2 +- .../us/ajg0702/queue/commands/commands/manage/QueueList.java | 2 +- .../java/us/ajg0702/queue/commands/commands/manage/Reload.java | 2 +- .../java/us/ajg0702/queue/commands/commands/manage/Send.java | 2 +- .../java/us/ajg0702/queue/commands/commands/manage/Tasks.java | 2 +- .../java/us/ajg0702/queue/commands/commands/manage/Version.java | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java index d9661ee..f36bd45 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java @@ -29,7 +29,7 @@ public class ISP extends SubCommand { @Override public String getPermission() { - return "ajqueue.isp"; + return null; } @Override diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java index 1813c3d..a165642 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Pause.java @@ -30,7 +30,7 @@ public class Pause extends SubCommand { @Override public String getPermission() { - return "ajqueue.pause"; + return "ajqueue.manage.pause"; } @Override diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/QueueList.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/QueueList.java index b481916..1aa49e3 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/QueueList.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/QueueList.java @@ -34,7 +34,7 @@ public class QueueList extends SubCommand { @Override public String getPermission() { - return "ajqueue.list"; + return "ajqueue.manage.list"; } @Override diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java index 476de41..6793df3 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Reload.java @@ -31,7 +31,7 @@ public class Reload extends SubCommand { @Override public String getPermission() { - return "ajqueue.reload"; + return "ajqueue.manage.reload"; } @Override diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java index 7d04795..dc4c1af 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Send.java @@ -31,7 +31,7 @@ public class Send extends SubCommand { @Override public String getPermission() { - return "ajqueue.send"; + return "ajqueue.manage.send"; } @Override diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java index 37b48d7..818875f 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java @@ -29,7 +29,7 @@ public class Tasks extends SubCommand { @Override public String getPermission() { - return "ajqueue.tasks"; + return "ajqueue.manage.tasks"; } @Override diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Version.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Version.java index ab3311b..f7d019e 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Version.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Version.java @@ -29,7 +29,7 @@ public class Version extends SubCommand { @Override public String getPermission() { - return "ajqueue.version"; + return null; } @Override From 9d1161247b0de89f691efc1d64771ef6e52a7455 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 2 Aug 2021 13:27:47 -0700 Subject: [PATCH 48/56] pre5 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2b612c9..7e3ab7c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ repositories { } allprojects { - version = "2.0.0-pre4" + version = "2.0.0-pre5" group = "us.ajg0702" tasks.withType().configureEach { From a01bd759d278e61586480000df0f05c79fb13455 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 2 Aug 2021 22:33:47 -0700 Subject: [PATCH 49/56] Fix kyori, add permissionlist command, fix luckperms getting wrong context --- api/build.gradle.kts | 2 +- .../us/ajg0702/queue/api/LogicGetter.java | 4 ++ .../queue/api/commands/IBaseCommand.java | 2 + common/build.gradle.kts | 2 +- .../ajg0702/queue/commands/BaseCommand.java | 5 ++ .../queue/commands/commands/manage/ISP.java | 5 ++ .../commands/manage/ManageCommand.java | 2 + .../commands/manage/PermissionList.java | 64 +++++++++++++++++++ .../queue/commands/commands/manage/Tasks.java | 5 ++ .../us/ajg0702/queue/common/QueueMain.java | 10 ++- .../ajg0702/queue/logic/LogicGetterImpl.java | 8 +++ free/build.gradle.kts | 2 +- platforms/bungeecord/build.gradle.kts | 6 +- .../platforms/bungeecord/BungeeQueue.java | 6 +- platforms/velocity/build.gradle.kts | 4 +- premium/build.gradle.kts | 2 +- .../ajg0702/queue/logic/LogicGetterImpl.java | 17 ++++- .../us/ajg0702/queue/logic/PremiumLogic.java | 4 ++ .../permissions/hooks/LuckPermsHook.java | 2 +- spigot/build.gradle.kts | 2 +- 20 files changed, 137 insertions(+), 17 deletions(-) create mode 100644 common/src/main/java/us/ajg0702/queue/commands/commands/manage/PermissionList.java diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 832835b..e0874fc 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -6,7 +6,7 @@ plugins { group = "us.ajg0702.queue.api" repositories { - mavenLocal() + //mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } diff --git a/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java b/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java index 09bbf59..af2b7e9 100644 --- a/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java +++ b/api/src/main/java/us/ajg0702/queue/api/LogicGetter.java @@ -1,9 +1,13 @@ package us.ajg0702.queue.api; +import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.utils.common.Config; +import java.util.List; + @SuppressWarnings("unused") public interface LogicGetter { Logic constructLogic(); AliasManager constructAliasManager(Config config); + List getPermissions(AdaptedPlayer player); } diff --git a/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java b/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java index 04bca20..b4bc659 100644 --- a/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java +++ b/api/src/main/java/us/ajg0702/queue/api/commands/IBaseCommand.java @@ -16,6 +16,8 @@ public interface IBaseCommand { String getPermission(); + boolean showInTabComplete(); + Messages getMessages(); void addSubCommand(ISubCommand subCommand); diff --git a/common/build.gradle.kts b/common/build.gradle.kts index e344096..4cdefba 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -6,7 +6,7 @@ plugins { group = "us.ajg0702.queue.common" repositories { - mavenLocal() + //mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } } diff --git a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java index bdec887..b2e0718 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/BaseCommand.java @@ -31,6 +31,11 @@ public class BaseCommand implements IBaseCommand { return null; } + @Override + public boolean showInTabComplete() { + return true; + } + @Override public Messages getMessages() { return null; diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java index f36bd45..ad29978 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ISP.java @@ -27,6 +27,11 @@ public class ISP extends SubCommand { return ImmutableList.of(); } + @Override + public boolean showInTabComplete() { + return false; + } + @Override public String getPermission() { return null; diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java index e1518fc..e97d81f 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java @@ -27,6 +27,7 @@ public class ManageCommand extends BaseCommand { addSubCommand(new ISP(main)); addSubCommand(new QueueList(main)); addSubCommand(new Send(main)); + addSubCommand(new PermissionList(main)); } @@ -87,6 +88,7 @@ public class ManageCommand extends BaseCommand { } List commands = new ArrayList<>(); for(ISubCommand subCommand : subCommands) { + if(!subCommand.showInTabComplete()) continue; commands.add(subCommand.getName()); commands.addAll(subCommand.getAliases()); } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/PermissionList.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/PermissionList.java new file mode 100644 index 0000000..3626926 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/PermissionList.java @@ -0,0 +1,64 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public class PermissionList extends SubCommand { + + final QueueMain main; + public PermissionList(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "permissionlist"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public boolean showInTabComplete() { + return false; + } + + @Override + public String getPermission() { + return null; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + List permissions = main.getLogicGetter().getPermissions(main.getPlatformMethods().senderToPlayer(sender)); + if(permissions == null) { + sender.sendMessage(Component.text("no permission handler")); + return; + } + permissions.forEach(s -> { + if(!s.toLowerCase(Locale.ROOT).contains("ajqueue")) return; + sender.sendMessage(Component.text(s)); + }); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + return new ArrayList<>(); + } +} diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java index 818875f..6d44014 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Tasks.java @@ -32,6 +32,11 @@ public class Tasks extends SubCommand { return "ajqueue.manage.tasks"; } + @Override + public boolean showInTabComplete() { + return false; + } + @Override public Messages getMessages() { return main.getMessages(); diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 8f1dc22..8d27916 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -75,6 +75,10 @@ public class QueueMain { return queueManager; } + private final LogicGetter logicGetter; + public LogicGetter getLogicGetter() { + return logicGetter; + } public void shutdown() { taskManager.shutdown(); @@ -86,6 +90,8 @@ public class QueueMain { public QueueMain(QueueLogger logger, PlatformMethods platformMethods, File dataFolder) { + logicGetter = new LogicGetterImpl(); + if(instance != null) { try { throw new Exception("ajQueue QueueMain is being initialized when there is already one! Still initializing it, but this can cause issues."); @@ -114,8 +120,8 @@ public class QueueMain { queueManager = new QueueManagerImpl(this); - logic = new LogicGetterImpl().constructLogic(); - aliasManager = new LogicGetterImpl().constructAliasManager(config); + logic = logicGetter.constructLogic(); + aliasManager = logicGetter.constructAliasManager(config); taskManager.rescheduleTasks(); diff --git a/common/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java b/common/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java index 611dbff..37598cc 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java +++ b/common/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java @@ -2,8 +2,11 @@ package us.ajg0702.queue.logic; import us.ajg0702.queue.api.AliasManager; import us.ajg0702.queue.api.Logic; +import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.utils.common.Config; +import java.util.List; + public class LogicGetterImpl implements us.ajg0702.queue.api.LogicGetter { @Override @@ -15,4 +18,9 @@ public class LogicGetterImpl implements us.ajg0702.queue.api.LogicGetter { public AliasManager constructAliasManager(Config config) { return new FreeAliasManager(config); } + + @Override + public List getPermissions(AdaptedPlayer player) { + return null; + } } diff --git a/free/build.gradle.kts b/free/build.gradle.kts index f8a2e54..289c987 100644 --- a/free/build.gradle.kts +++ b/free/build.gradle.kts @@ -7,7 +7,7 @@ plugins { group = "us.ajg0702.queue" repositories { - mavenLocal() + //mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } diff --git a/platforms/bungeecord/build.gradle.kts b/platforms/bungeecord/build.gradle.kts index 2913b87..2271fe3 100644 --- a/platforms/bungeecord/build.gradle.kts +++ b/platforms/bungeecord/build.gradle.kts @@ -6,7 +6,7 @@ plugins { group = "us.ajg0702.queue.platforms.bungeecord" repositories { - mavenLocal() + //mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } maven { url = uri("https://nexus.velocitypowered.com/repository/maven-public/") } @@ -17,9 +17,9 @@ dependencies { compileOnly("com.google.guava:guava:30.1.1-jre") compileOnly("us.ajg0702:ajUtils:1.1.7") - compileOnly("net.md-5:bungeecord-api:1.14-SNAPSHOT") + compileOnly("net.md-5:bungeecord-api:1.16-R0.4") - compileOnly("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT") + compileOnly("net.kyori:adventure-text-minimessage:4.0.0-SNAPSHOT") implementation("net.kyori:adventure-platform-bungeecord:4.0.0-SNAPSHOT") compileOnly("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java index 1d41a21..519dfb5 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java @@ -36,6 +36,8 @@ public class BungeeQueue extends Plugin implements Listener { QueueLogger logger = new BungeeLogger(getLogger()); File dataFolder = getDataFolder(); + adventure = BungeeAudiences.create(this); + main = new QueueMain( logger, new BungeeMethods(this, getProxy(), logger), @@ -59,15 +61,13 @@ public class BungeeQueue extends Plugin implements Listener { getProxy().getPluginManager().registerListener(this, this); - adventure = BungeeAudiences.create(this); - } private static BungeeAudiences adventure; public static @NonNull BungeeAudiences adventure() { if(adventure == null) { - throw new IllegalStateException("Cannot retrieve audience provider while plugin is not enabled"); + throw new IllegalStateException("Cannot retrieve audience provider. Not loaded yet."); } return adventure; } diff --git a/platforms/velocity/build.gradle.kts b/platforms/velocity/build.gradle.kts index 2079a8e..0b51e4e 100644 --- a/platforms/velocity/build.gradle.kts +++ b/platforms/velocity/build.gradle.kts @@ -6,7 +6,7 @@ plugins { group = "us.ajg0702.queue.platforms.velocity" repositories { - mavenLocal() + //mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } maven { url = uri("https://nexus.velocitypowered.com/repository/maven-public/") } @@ -19,7 +19,7 @@ dependencies { compileOnly("com.velocitypowered:velocity-api:3.0.0") annotationProcessor("com.velocitypowered:velocity-api:3.0.0") - compileOnly("net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT") + compileOnly("net.kyori:adventure-text-minimessage:4.0.0-SNAPSHOT") implementation(project(":common")) implementation(project(":api")) diff --git a/premium/build.gradle.kts b/premium/build.gradle.kts index 6c79fbc..4189b2a 100644 --- a/premium/build.gradle.kts +++ b/premium/build.gradle.kts @@ -7,7 +7,7 @@ plugins { group = "us.ajg0702.queue" repositories { - mavenLocal() + //mavenLocal() mavenCentral() maven { url = uri("https://repo.ajg0702.us") } maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } diff --git a/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java b/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java index 3cc1a27..1613779 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/LogicGetterImpl.java @@ -3,17 +3,32 @@ package us.ajg0702.queue.logic; import us.ajg0702.queue.api.AliasManager; import us.ajg0702.queue.api.Logic; import us.ajg0702.queue.api.LogicGetter; +import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.logic.permissions.PermissionGetter; import us.ajg0702.utils.common.Config; +import java.util.List; + public class LogicGetterImpl implements LogicGetter { + PremiumLogic logic; + @Override public Logic constructLogic() { - return new PremiumLogic(QueueMain.getInstance()); + if(logic == null) { + logic = new PremiumLogic(QueueMain.getInstance()); + } + return logic; } @Override public AliasManager constructAliasManager(Config config) { return new PremiumAliasManager(config); } + + @Override + public List getPermissions(AdaptedPlayer player) { + if(logic == null) return null; + return logic.getPermissionGetter().getSelected().getPermissions(player); + } } diff --git a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java index 4818bd6..7cdd042 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java @@ -12,6 +12,10 @@ import us.ajg0702.queue.logic.permissions.PermissionGetter; public class PremiumLogic implements Logic { + public PermissionGetter getPermissionGetter() { + return permissionGetter; + } + private final PermissionGetter permissionGetter; public PremiumLogic(QueueMain main) { permissionGetter = new PermissionGetter(main); diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/LuckPermsHook.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/LuckPermsHook.java index f7b9c53..1b21b79 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/LuckPermsHook.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/LuckPermsHook.java @@ -36,7 +36,7 @@ public class LuckPermsHook implements PermissionHook { User user = api.getUserManager().getUser(player.getUniqueId()); assert user != null; - SortedSet nodes = user.resolveDistinctInheritedNodes(QueryOptions.defaultContextualOptions()); + SortedSet nodes = user.resolveDistinctInheritedNodes(QueryOptions.nonContextual()); List perms = new ArrayList<>(); diff --git a/spigot/build.gradle.kts b/spigot/build.gradle.kts index f43f38c..aec53f1 100644 --- a/spigot/build.gradle.kts +++ b/spigot/build.gradle.kts @@ -6,7 +6,7 @@ plugins { group = "us.ajg0702.queue.spigot" repositories { - mavenLocal() + //mavenLocal() mavenCentral() maven { url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/") } From cde8c0a49c5da1317c51a46f9cf8e412b48063e2 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Wed, 4 Aug 2021 09:49:11 -0700 Subject: [PATCH 50/56] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c09a764..915ff76 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ dependency-reduced-pom.xml build .DS_Store .nosync +libs/**.* From 4e6c10ccb2fc3454080ff5379de7503b23a0340d Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 5 Aug 2021 17:28:11 -0700 Subject: [PATCH 51/56] pre6 - UltraPermissions hook & bstats --- .../commands/manage/PermissionList.java | 1 + platforms/bungeecord/build.gradle.kts | 2 + .../platforms/bungeecord/BungeeQueue.java | 7 +++ platforms/velocity/build.gradle.kts | 2 + .../platforms/velocity/VelocityQueue.java | 15 ++++++- premium/build.gradle.kts | 2 + .../logic/permissions/PermissionGetter.java | 5 ++- .../hooks/UltraPermissionsHook.java | 44 +++++++++++++++++++ 8 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/UltraPermissionsHook.java diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/PermissionList.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/PermissionList.java index 3626926..84c340d 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/PermissionList.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/PermissionList.java @@ -51,6 +51,7 @@ public class PermissionList extends SubCommand { sender.sendMessage(Component.text("no permission handler")); return; } + permissions.forEach(s -> { if(!s.toLowerCase(Locale.ROOT).contains("ajqueue")) return; sender.sendMessage(Component.text(s)); diff --git a/platforms/bungeecord/build.gradle.kts b/platforms/bungeecord/build.gradle.kts index 2271fe3..136f1e8 100644 --- a/platforms/bungeecord/build.gradle.kts +++ b/platforms/bungeecord/build.gradle.kts @@ -24,6 +24,8 @@ dependencies { implementation("net.kyori:adventure-platform-bungeecord:4.0.0-SNAPSHOT") compileOnly("net.kyori:adventure-text-serializer-plain:4.0.0-SNAPSHOT") + implementation("org.bstats:bstats-bungeecord:2.2.1") + implementation(project(":common")) implementation(project(":api")) } diff --git a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java index 519dfb5..a55b795 100644 --- a/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java +++ b/platforms/bungeecord/src/main/java/us/ajg0702/queue/platforms/bungeecord/BungeeQueue.java @@ -8,6 +8,8 @@ import net.md_5.bungee.api.event.*; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; +import org.bstats.bungeecord.Metrics; +import org.bstats.charts.SimplePie; import org.checkerframework.checker.nullness.qual.NonNull; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.api.util.QueueLogger; @@ -61,6 +63,11 @@ public class BungeeQueue extends Plugin implements Listener { getProxy().getPluginManager().registerListener(this, this); + + Metrics metrics = new Metrics(this, 7404); + + metrics.addCustomChart(new SimplePie("premium", () -> String.valueOf(main.getLogic().isPremium()))); + metrics.addCustomChart(new SimplePie("implementation", () -> main.getPlatformMethods().getImplementationName())); } private static BungeeAudiences adventure; diff --git a/platforms/velocity/build.gradle.kts b/platforms/velocity/build.gradle.kts index 0b51e4e..48d296f 100644 --- a/platforms/velocity/build.gradle.kts +++ b/platforms/velocity/build.gradle.kts @@ -21,6 +21,8 @@ dependencies { annotationProcessor("com.velocitypowered:velocity-api:3.0.0") compileOnly("net.kyori:adventure-text-minimessage:4.0.0-SNAPSHOT") + implementation("org.bstats:bstats-velocity:2.2.1") + implementation(project(":common")) implementation(project(":api")) } diff --git a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java index d4f0e27..b1b1696 100644 --- a/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java +++ b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/VelocityQueue.java @@ -15,6 +15,8 @@ import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import net.kyori.adventure.text.Component; +import org.bstats.charts.SimplePie; +import org.bstats.velocity.Metrics; import org.slf4j.Logger; import us.ajg0702.queue.api.commands.IBaseCommand; import us.ajg0702.queue.commands.BaseCommand; @@ -50,12 +52,16 @@ public class VelocityQueue { final File dataFolder; + private final Metrics.Factory metricsFactory; + @Inject - public VelocityQueue(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataFolder) { + public VelocityQueue(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataFolder, Metrics.Factory metricsFactory) { this.proxyServer = proxyServer; this.logger = new VelocityLogger(logger); this.dataFolder = dataFolder.toFile(); + + this.metricsFactory = metricsFactory; } List commands; @@ -90,6 +96,12 @@ public class VelocityQueue { new VelocityCommand(main, (BaseCommand) command) ); } + + + Metrics metrics = metricsFactory.make(this, 7404); + + metrics.addCustomChart(new SimplePie("premium", () -> String.valueOf(main.getLogic().isPremium()))); + metrics.addCustomChart(new SimplePie("implementation", () -> main.getPlatformMethods().getImplementationName())); } @Subscribe @@ -126,6 +138,7 @@ public class VelocityQueue { main.getEventHandler().onPlayerLeave(new VelocityPlayer(e.getPlayer())); } + @SuppressWarnings("SimplifyOptionalCallChains") @Subscribe public void onKick(KickedFromServerEvent e) { if(!e.getPlayer().getCurrentServer().isPresent()) return; // if the player is kicked on initial join, we dont care diff --git a/premium/build.gradle.kts b/premium/build.gradle.kts index 4189b2a..f6e9ee7 100644 --- a/premium/build.gradle.kts +++ b/premium/build.gradle.kts @@ -26,6 +26,8 @@ dependencies { compileOnly("net.kyori:adventure-api:4.8.1") + compileOnly(fileTree(mapOf("dir" to "../libs", "include" to listOf("*.jar")))) + compileOnly("net.luckperms:api:5.0") } diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java index aec11b2..cadc613 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java @@ -4,6 +4,7 @@ import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.logic.permissions.hooks.BuiltIn; import us.ajg0702.queue.logic.permissions.hooks.LuckPermsHook; +import us.ajg0702.queue.logic.permissions.hooks.UltraPermissionsHook; import java.util.*; @@ -15,7 +16,8 @@ public class PermissionGetter { public PermissionGetter(QueueMain main) { hooks = Arrays.asList( new BuiltIn(main), - new LuckPermsHook(main) + new LuckPermsHook(main), + new UltraPermissionsHook(main) ); } @@ -30,6 +32,7 @@ public class PermissionGetter { selected = hook; } } + main.getLogger().info("Using "+selected.getName()+" for permissions."); return selected; } diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/UltraPermissionsHook.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/UltraPermissionsHook.java new file mode 100644 index 0000000..259bfa8 --- /dev/null +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/hooks/UltraPermissionsHook.java @@ -0,0 +1,44 @@ +package us.ajg0702.queue.logic.permissions.hooks; + +import me.TechsCode.UltraPermissions.UltraPermissions; +import me.TechsCode.UltraPermissions.UltraPermissionsAPI; +import me.TechsCode.UltraPermissions.storage.objects.User; +import us.ajg0702.queue.api.players.AdaptedPlayer; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.logic.permissions.PermissionHook; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +@SuppressWarnings("SimplifyOptionalCallChains") +public class UltraPermissionsHook implements PermissionHook { + + private final QueueMain main; + public UltraPermissionsHook(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "UltraPermissions"; + } + + @Override + public boolean canUse() { + return main.getPlatformMethods().hasPlugin("UltraPermissions"); + } + + @Override + public List getPermissions(AdaptedPlayer player) { + UltraPermissionsAPI ultraPermissionsAPI = UltraPermissions.getAPI(); + + Optional userOptional = ultraPermissionsAPI.getUsers().uuid(player.getUniqueId()); + if(!userOptional.isPresent()) return new ArrayList<>(); + User user = userOptional.get(); + + List permissions = new ArrayList<>(); + user.getPermissions().bungee().forEach(permission -> permissions.add(permission.getName())); + return permissions; + } +} From 24ca5d9cfdc18a44b221569acaecb65954a43dfc Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 5 Aug 2021 17:56:41 -0700 Subject: [PATCH 52/56] pre6 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 7e3ab7c..89112a1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ repositories { } allprojects { - version = "2.0.0-pre5" + version = "2.0.0-pre6" group = "us.ajg0702" tasks.withType().configureEach { From bdd5fe968f5b15d883d543683fa3551a4fd6883f Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 7 Aug 2021 11:54:07 -0700 Subject: [PATCH 53/56] Fix priority queue --- .../java/us/ajg0702/queue/common/queues/QueueServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java index 483c640..2238771 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/QueueServerImpl.java @@ -276,7 +276,7 @@ public class QueueServerImpl implements QueueServer { public synchronized void addPlayer(QueuePlayer player, int position) { if(!player.getQueueServer().equals(this) || queue.contains(player)) return; - if(position > 0) { + if(position >= 0) { queue.add(position, player); } else { queue.add(player); From 471162041094643fad368309c78d0b5f7a48b765 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 7 Aug 2021 11:54:24 -0700 Subject: [PATCH 54/56] Fix main not being initialized in PermissionGetter --- .../ajg0702/queue/logic/permissions/PermissionGetter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java index cadc613..49dfb56 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/permissions/PermissionGetter.java @@ -12,13 +12,14 @@ public class PermissionGetter { private final List hooks; - private QueueMain main; + private final QueueMain main; public PermissionGetter(QueueMain main) { hooks = Arrays.asList( new BuiltIn(main), new LuckPermsHook(main), new UltraPermissionsHook(main) ); + this.main = main; } private PermissionHook selected; @@ -32,6 +33,9 @@ public class PermissionGetter { selected = hook; } } + if(selected == null) { + throw new IllegalStateException("All hooks are unusable!"); + } main.getLogger().info("Using "+selected.getName()+" for permissions."); return selected; } From b30b0bfc881299b268427deb98ce123f4b67d2f0 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 7 Aug 2021 11:59:51 -0700 Subject: [PATCH 55/56] update ci stuff --- .gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6dac4b4..5474105 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,10 +12,10 @@ build: stage: build script: - rm -rf build - - ./gradlew shadowJar + - gradle :free:shadowJar artifacts: paths: - - build/libs + - free/build/libs pages: stage: build @@ -23,8 +23,8 @@ pages: only: - master script: - - ./gradlew javadoc - - mv build/docs/javadoc public + - gradle :api:javadoc + - mv api/build/docs/javadoc public artifacts: paths: - public @@ -34,7 +34,7 @@ test: dependencies: - build script: - - ./gradlew test + - gradle test deploy to maven repo: stage: deploy @@ -43,7 +43,7 @@ deploy to maven repo: dependencies: - build script: - - ./gradlew :api:publish --stacktrace + - gradle :api:publish --stacktrace upload to updater: stage: deploy @@ -52,6 +52,6 @@ upload to updater: dependencies: - build script: - - cd build/libs + - cd free/build/libs - files=(*) - curl -i -F "submit=true" -F "secret=$UPLOAD_SECRET" -F "file=@${files[0]}" https://ajg0702.us/pl/updater/upload.php From 818cc56978d790b062260b394e90dc729b68ab42 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 7 Aug 2021 12:00:00 -0700 Subject: [PATCH 56/56] 2.0.0 release!!!!!!! --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 89112a1..3ff4053 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ repositories { } allprojects { - version = "2.0.0-pre6" + version = "2.0.0" group = "us.ajg0702" tasks.withType().configureEach {