From bcc62c7ef33d77d349169abeef35606f994cdf11 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 6 Aug 2022 15:41:22 -0700 Subject: [PATCH 01/21] ajQueuePlus automated releases on polymart --- .github/workflows/prerelease.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index 2c525da..8e2eaea 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -44,5 +44,5 @@ jobs: POLYMART_TOKEN: ${{ secrets.POLYMART_TOKEN }} run: | export VERSION=`cat build.gradle.kts | grep "version " | awk -F'"' '{print $2}'` - file free/build/libs/ajQueue-$VERSION.jar curl -F "file=@free/build/libs/ajQueue-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2535" -F version="$VERSION" -F title="Pre-release v$VERSION" -F beta=1 -F message=$'Note: This is a (most likely) un-tested build. It is not guarenteed to work!\n\nChange since previous build:\n[url=${{ github.event.compare }}"]${{ github.event.head_commit.message }}[/url]' "https://api.polymart.org/v1/postUpdate" + curl -F "file=@premium/build/libs/ajQueuePlus-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2714" -F version="$VERSION" -F title="Pre-release v$VERSION" -F beta=1 -F message=$'Note: This is a (most likely) un-tested build. It is not guarenteed to work!\n\nChange since previous build:\n[url=${{ github.event.compare }}"]${{ github.event.head_commit.message }}[/url]' "https://api.polymart.org/v1/postUpdate" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ee2c511..9c97f66 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,5 +39,5 @@ jobs: POLYMART_TOKEN: ${{ secrets.POLYMART_TOKEN }} run: | export VERSION=`cat build.gradle.kts | grep "version " | awk -F'"' '{print $2}'` - file free/build/libs/ajQueue-$VERSION.jar curl -F "file=@free/build/libs/ajQueue-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2535" -F version="$VERSION" -F title="v$VERSION" -F message="$(cat changelogs.bb)" "https://api.polymart.org/v1/postUpdate" + curl -F "file=@premium/build/libs/ajQueuePlus-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2714" -F version="$VERSION" -F title="v$VERSION" -F message="$(cat changelogs.bb)" "https://api.polymart.org/v1/postUpdate" From 26b4f7dc335c9db60b6ca5b63f67cb780df3d637 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 7 Aug 2022 08:33:48 -0700 Subject: [PATCH 02/21] minor improvements to the spigot-side --- .../main/java/us/ajg0702/queue/spigot/Commands.java | 4 ++-- .../java/us/ajg0702/queue/spigot/SpigotMain.java | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) 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 f39b8cd..acaa951 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/Commands.java @@ -17,7 +17,7 @@ public class Commands implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - if(!pl.hasProxy() && pl.config.getBoolean("check-proxy-response")) { + if(!pl.hasProxy() && pl.getAConfig().getBoolean("check-proxy-response")) { sender.sendMessage(color("&cajQueue must also be installed on the proxy!&7 If it has been installed on the proxy, make sure it loaded correctly and try relogging.")); return true; } @@ -53,7 +53,7 @@ public class Commands implements CommandExecutor { player = tply; srvname = args[1]; } - if(pl.config.getBoolean("send-queue-commands-in-batches")) { + if(pl.getAConfig().getBoolean("send-queue-commands-in-batches")) { pl.queuebatch.put(player, srvname); } else { assert player != null; 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 66baa35..443bf70 100644 --- a/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java +++ b/spigot/src/main/java/us/ajg0702/queue/spigot/SpigotMain.java @@ -23,12 +23,12 @@ import java.util.HashMap; @SuppressWarnings("UnstableApiUsage") public class SpigotMain extends JavaPlugin implements PluginMessageListener,Listener { - boolean papi = false; - Placeholders placeholders; + private boolean papi = false; + private Placeholders placeholders; - ConfigFile config; + private ConfigFile config; - boolean hasProxy = false; + private boolean hasProxy = false; @SuppressWarnings("ConstantConditions") public void onEnable() { @@ -242,4 +242,9 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List } e.setMotd("ajQueue;whitelisted="+whitelist); } + + + public ConfigFile getAConfig() { + return config; + } } From 12daae7600bf2185f684439599cbd9ec68e047ba Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 12 Aug 2022 10:13:14 -0700 Subject: [PATCH 03/21] [nolist] dont run pre/release on forks, and dont run prerelease if commit is nolist --- .github/workflows/prerelease.yml | 3 +++ .github/workflows/release.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index 8e2eaea..ab8c93c 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -10,6 +10,9 @@ jobs: build: runs-on: ubuntu-latest environment: polymart_deploy + if: | + !github.event.pull_request.head.repo.fork && + !contains(github.event.head_commit.message, '[nolist]') steps: - uses: actions/checkout@v2 - name: Set up JDK 11 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9c97f66..8ec3367 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,6 +10,7 @@ jobs: build: runs-on: ubuntu-latest environment: polymart_deploy + if: ${{ !github.event.pull_request.head.repo.fork }} steps: - uses: actions/checkout@v2 - name: Set up JDK 11 From 6a993497182f3bf2b60d01624cecd22c73c60a64 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 15 Aug 2022 11:05:23 -0700 Subject: [PATCH 04/21] Throw a warning instead of an error if a player is queued when they arent connected --- .../main/java/us/ajg0702/queue/common/QueueManagerImpl.java | 5 +++++ 1 file changed, 5 insertions(+) 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 2da51d1..74494d5 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -99,6 +99,11 @@ public class QueueManagerImpl implements QueueManager { return false; } + if(player.getServerName() == null) { + main.getLogger().warning("Tried to queue " + player.getName() + " when they aren't connected!"); + return false; + } + Debug.info("addToQueue method called for "+player.getName()+" to "+server.getName()); if(main.getConfig().getBoolean("joinfrom-server-permission") && !player.hasPermission("ajqueue.joinfrom."+player.getServerName())) { From 478f2cf78d388466528e687db8f180f24c199340 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 15 Aug 2022 13:41:32 -0700 Subject: [PATCH 05/21] Move server ping cache storage to the AdaptedServer instance --- .../us/ajg0702/queue/api/PlatformMethods.java | 2 +- .../us/ajg0702/queue/api/premium/Logic.java | 13 +- .../ajg0702/queue/api/queues/QueueServer.java | 89 +------ .../queue/api/server/AdaptedServer.java | 109 +++++++- .../queue/api/server/AdaptedServerPing.java | 8 +- .../ajg0702/queue/api/util/QueueLogger.java | 6 + .../commands/manage/debug/Whitelist.java | 3 +- .../queue/common/QueueManagerImpl.java | 52 ++-- .../queue/common/queues/QueueServerImpl.java | 246 ++---------------- .../queues/balancers/DefaultBalancer.java | 25 +- .../queues/balancers/MinigameBalancer.java | 31 +-- .../us/ajg0702/queue/logic/FreeLogic.java | 3 +- .../platforms/bungeecord/BungeeLogger.java | 26 ++ .../platforms/bungeecord/BungeeMethods.java | 40 ++- .../platforms/bungeecord/BungeeQueue.java | 6 +- .../bungeecord/server/BungeeServer.java | 87 ++++++- .../bungeecord/server/BungeeServerPing.java | 9 +- .../platforms/velocity/VelocityLogger.java | 25 ++ .../platforms/velocity/VelocityMethods.java | 44 +++- .../platforms/velocity/VelocityQueue.java | 6 +- .../velocity/server/VelocityServer.java | 88 ++++++- .../velocity/server/VelocityServerPing.java | 9 +- .../us/ajg0702/queue/logic/PremiumLogic.java | 31 +-- 23 files changed, 549 insertions(+), 409 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 367c8a1..9d1e346 100644 --- a/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java +++ b/api/src/main/java/us/ajg0702/queue/api/PlatformMethods.java @@ -73,7 +73,7 @@ public interface PlatformMethods { */ AdaptedServer getServer(String name); - List getServers(); + List getServers(); String getProtocolName(int protocol); } diff --git a/api/src/main/java/us/ajg0702/queue/api/premium/Logic.java b/api/src/main/java/us/ajg0702/queue/api/premium/Logic.java index 063a612..cdebdf4 100644 --- a/api/src/main/java/us/ajg0702/queue/api/premium/Logic.java +++ b/api/src/main/java/us/ajg0702/queue/api/premium/Logic.java @@ -4,6 +4,7 @@ import us.ajg0702.queue.api.AjQueueAPI; 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.utils.common.Config; @SuppressWarnings({"SameReturnValue", "unused"}) @@ -17,10 +18,12 @@ public interface Logic { /** * The priority logic that is executed if the plugin is premium. - * @param server The server/group name that is being queued for - * @param player The player that is being queued + * + * @param queueServer The server/group name that is being queued for + * @param player The player that is being queued + * @param server The server/group name that is being queued for */ - QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player); + QueuePlayer priorityLogic(QueueServer queueServer, AdaptedPlayer player, AdaptedServer server); /** * The logic for checking if a player has been disconnected for too long @@ -35,7 +38,7 @@ public interface Logic { */ PermissionGetter getPermissionGetter(); - static int getUnJoinablePriorities(QueueServer server, AdaptedPlayer player) { + static int getUnJoinablePriorities(QueueServer queueServer, AdaptedServer server, AdaptedPlayer player) { Config config = AjQueueAPI.getInstance().getConfig(); int highest = 0; @@ -50,7 +53,7 @@ public interface Logic { } if(bypassPausedPriotity > 0) { - if(server.isPaused() && (player.hasPermission("ajqueue.bypasspaused"))) { + if(queueServer.isPaused() && (player.hasPermission("ajqueue.bypasspaused"))) { highest = Math.max(highest, bypassPausedPriotity); } } 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 17ab09e..652ca67 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 @@ -50,17 +50,6 @@ public interface QueueServer { */ String getStatus(); - /** - * 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 @@ -73,30 +62,6 @@ public interface QueueServer { */ void setLastSentTime(long lastSentTime); - - - /** - * 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 @@ -116,24 +81,6 @@ public interface QueueServer { */ 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(); - /** * Removes a player from the queue * @param player The player to remove @@ -199,6 +146,16 @@ public interface QueueServer { */ ImmutableList getServerNames(); + /** + * Returns true if at least one server in the group is online + * @return true if the server is online + */ + default boolean isOnline() { + for (AdaptedServer server : getServers()) { + if(server.isOnline()) return true; + } + return false; + } /** * Returns if this server is a group @@ -232,12 +189,6 @@ public interface QueueServer { */ AdaptedServer getIdealServer(AdaptedPlayer player); - /** - * Gets the last server pings - * @return The last server pings for this server/group - */ - HashMap getLastPings(); - /** * Gets the protocol versions this queue supports. * A blank list means all protocols are supported. @@ -258,26 +209,6 @@ public interface QueueServer { */ Balancer getBalancer(); - /** - * Checks if the player can join this server even if its full - * @param player The player - * @return If the player can join this server if its full - */ - boolean canJoinFull(AdaptedPlayer player); - - /** - * Adds one to the player count for a server (temporarily until the next server ping) - */ - void addPlayer(AdaptedServer server); - - /** - * Sets if this server is online. - * Note that this is overrided by the pinger, so if you set - * this, it will most likely be temporary - * @param online whether the server is online or not - */ - void setOnline(boolean online); - /** * 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 494e6db..94c5f4f 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 @@ -2,8 +2,9 @@ package us.ajg0702.queue.api.server; import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.util.Handle; +import us.ajg0702.queue.api.util.QueueLogger; -import java.util.List; +import java.util.*; import java.util.concurrent.CompletableFuture; @SuppressWarnings("unused") @@ -25,7 +26,13 @@ public interface AdaptedServer extends Handle { * Pings the server and gets info back * @return A CompletableFuture with the ServerPing */ - CompletableFuture ping(); + default CompletableFuture ping() { + return ping(false, null); + } + + CompletableFuture ping(boolean debug, QueueLogger logger); + + Optional getLastPing(); /** * If the player can access the server @@ -38,4 +45,102 @@ public interface AdaptedServer extends Handle { boolean canAccess(AdaptedPlayer player); List getPlayers(); + + /** + * Gets the number of seconds this server has been offline + * @return The number of seconds this server has been offline + */ + int getOfflineTime(); + + boolean canJoinFull(AdaptedPlayer player); + + boolean justWentOnline(); + + default boolean isJoinable(AdaptedPlayer player) { + if(player != null) { + if (isWhitelisted() && !getWhitelistedPlayers().contains(player.getUniqueId())) { + return false; + } + if (isFull() && !canJoinFull(player)) { + return false; + } + } + return isOnline() && + canAccess(player); + } + + default boolean isFull() { + if(!getLastPing().isPresent()) return false; + return getLastPing().get().getPlayerCount() >= getLastPing().get().getMaxPlayers(); + } + + /** + * Gets if the last ping was successfull + * (which almost always means the server is online) + * @return If the server is determined to be online or not + */ + default boolean isOnline() { + return getLastPing().isPresent(); + } + + /** + * Gets the number of players currently online + * @return The number of players online + */ + default int getPlayerCount() { + if(!getLastPing().isPresent()) return 0; + + AdaptedServerPing ping = getLastPing().get(); + return ping.getPlayerCount(); + } + + /** + * Gets the maximum number of players that can join this server. + * @return The maximum number of players that can join this server + */ + default int getMaxPlayers() { + if(!getLastPing().isPresent()) return 0; + + AdaptedServerPing ping = getLastPing().get(); + return ping.getMaxPlayers(); + } + + /** + * Temporarly adds one player to the player count + */ + default void addPlayer() { + if(!getLastPing().isPresent()) return; + getLastPing().get().addPlayer(); + } + + /** + * Checks if the spigot-side reports that the server is whitelisted + * @return True if the server is whitelisted + */ + default boolean isWhitelisted() { + if(!getLastPing().isPresent()) return false; + return getLastPing().get().getPlainDescription().contains("ajQueue;whitelisted="); + } + + /** + * (if the server is whitelisted) returns the list of players that are whitelisted + * @return The list of players that are whitelisted + */ + default List getWhitelistedPlayers() { + if(!getLastPing().isPresent()) return Collections.emptyList(); + if(!isWhitelisted()) return Collections.emptyList(); + List uuids = new ArrayList<>(); + for(String uuid : getLastPing().get().getPlainDescription().substring(20).split(",")) { + if(uuid.isEmpty()) continue; + UUID parsedUUID; + try { + parsedUUID = UUID.fromString(uuid); + } catch(IllegalArgumentException ignored) { + continue; + } + uuids.add(parsedUUID); + } + return uuids; + } + } 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 4f5b9e8..733c35f 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 @@ -12,7 +12,7 @@ public interface AdaptedServerPing extends Handle { Component getDescriptionComponent(); /** - * Gets the description stripped of any color or styling + * Gets the description (aka MOTD) stripped of any color or styling * @return The description, but no colors */ String getPlainDescription(); @@ -33,4 +33,10 @@ public interface AdaptedServerPing extends Handle { * Temporarly adds one player to the player count */ void addPlayer(); + + /** + * Returns an epoch timestamp of when this ping was sent. + * @return A long of an epoch timestamp + */ + long getFetchedTime(); } 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 index 8c3da1d..be65360 100644 --- a/api/src/main/java/us/ajg0702/queue/api/util/QueueLogger.java +++ b/api/src/main/java/us/ajg0702/queue/api/util/QueueLogger.java @@ -8,4 +8,10 @@ public interface QueueLogger extends UtilsLogger { void info(String message); void error(String message); void severe(String message); + + void warn(String message, Throwable t); + void warning(String message, Throwable t); + void info(String message, Throwable t); + void error(String message, Throwable t); + void severe(String message, Throwable t); } diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/debug/Whitelist.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/debug/Whitelist.java index 3481b3c..4fd9840 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/debug/Whitelist.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/debug/Whitelist.java @@ -3,6 +3,7 @@ package us.ajg0702.queue.commands.commands.manage.debug; import com.google.common.collect.ImmutableList; import us.ajg0702.queue.api.commands.ICommandSender; 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; @@ -48,7 +49,7 @@ public class Whitelist extends SubCommand { sender.sendMessage(main.getMessages().toComponent("Not enough args!")); return; } - QueueServer server = main.getQueueManager().findServer(args[0]); + AdaptedServer server = main.getPlatformMethods().getServer(args[0]); if(server == null) { sender.sendMessage(main.getMessages().toComponent("Server not found")); return; 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 74494d5..d997c3e 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -37,7 +37,7 @@ public class QueueManagerImpl implements QueueManager { public List buildServers() { List result = new ArrayList<>(); - List servers = main.getPlatformMethods().getServers(); + List servers = main.getPlatformMethods().getServers(); for(AdaptedServer server : servers) { QueueServer previousServer = main.getQueueManager().findServer(server.getName()); @@ -49,9 +49,6 @@ public class QueueManagerImpl implements QueueManager { if(previousServer != null) { queueServer.setPaused(previousServer.isPaused()); queueServer.setLastSentTime(previousServer.getLastSentTime()); - queueServer.setOnline(previousServer.isOnline()); - queueServer.setWhitelisted(previousServer.isWhitelisted()); - queueServer.setWhitelistedPlayers(previousServer.getWhitelistedPlayers()); } result.add(queueServer); } @@ -162,12 +159,13 @@ public class QueueManagerImpl implements QueueManager { ImmutableList list = server.getQueue(); QueuePlayer queuePlayer; + AdaptedServer ideal = server.getIdealServer(player); if(main.isPremium()) { - queuePlayer = main.getLogic().priorityLogic(server, player); + queuePlayer = main.getLogic().priorityLogic(server, player, ideal); } else { int priority = player.hasPermission("ajqueue.priority") || player.hasPermission("ajqueue.serverpriority."+server.getName()) ? 1 : 0; - priority = Math.max(priority, Logic.getUnJoinablePriorities(server, player) > 0 ? 1 : 0); + priority = Math.max(priority, Logic.getUnJoinablePriorities(server, ideal, player) > 0 ? 1 : 0); int maxOfflineTime = player.hasPermission("ajqueue.stayqueued") ? 60 : 0; queuePlayer = new QueuePlayerImpl(player, server, priority, maxOfflineTime); if( @@ -327,7 +325,7 @@ public class QueueManagerImpl implements QueueManager { groupServers.add(found.getServers().get(0)); } - if(servers.size() == 0) { + if(groupServers.size() == 0) { main.getLogger().warning("Server group '"+groupName+"' has no servers! Ignoring it."); continue; } @@ -349,7 +347,6 @@ public class QueueManagerImpl implements QueueManager { if(!main.getConfig().getBoolean("send-actionbar")) return; for(QueueServer server : servers) { - String status = server.getStatusString(); for(QueuePlayer queuePlayer : server.getQueue()) { int pos = queuePlayer.getPosition(); @@ -361,6 +358,8 @@ public class QueueManagerImpl implements QueueManager { AdaptedPlayer player = queuePlayer.getPlayer(); if(player == null) continue; + String status = server.getStatusString(player); + QueueServer singleServer = getSingleServer(player); if(singleServer == null || !singleServer.equals(server)) continue; @@ -512,8 +511,8 @@ public class QueueManagerImpl implements QueueManager { +((ThreadPoolExecutor) pool).getActiveCount()+" threads"); } try { - for(QueueServer server : servers) { - pool.submit(server::updatePing); + for(AdaptedServer server : main.getPlatformMethods().getServers()) { + pool.submit(() -> server.ping(main.getConfig().getBoolean("pinger-debug"), main.getLogger())); } } catch(Exception e) { e.printStackTrace(); @@ -556,22 +555,25 @@ public class QueueManagerImpl implements QueueManager { server.removePlayer(queuePlayer); } } + if(!server.isOnline()) continue; if(server.getQueue().size() == 0) continue; - if(main.getConfig().getBoolean("send-all-when-back-online") && server.justWentOnline() && server.isOnline()) { + if(!server.isGroup() && main.getConfig().getBoolean("send-all-when-back-online") && server.getServers().get(0).justWentOnline()) { for(QueuePlayer p : server.getQueue()) { + AdaptedPlayer player = p.getPlayer(); if(player == null) continue; - if(server.isFull() && !server.canJoinFull(p.getPlayer())) continue; - AdaptedServer selected = server.getIdealServer(player); + if(selected == null) { - main.getLogger().severe("Could not find ideal server for server/group '"+server.getName()+"'!"); + main.getLogger().severe("Could not find ideal server for server '"+server.getName()+"'!"); continue; } + if(selected.isFull() && !selected.canJoinFull(p.getPlayer())) continue; + player.sendMessage(msgs.getComponent("status.sending-now", "SERVER:"+server.getAlias())); player.connect(selected); } @@ -606,11 +608,17 @@ public class QueueManagerImpl implements QueueManager { if(nextPlayer == null) continue; // None of the players in the queue are online - if(server.isWhitelisted() && !server.getWhitelistedPlayers().contains(nextPlayer.getUniqueId())) continue; + AdaptedServer selected = server.getIdealServer(nextPlayer); + if(selected == null) { + main.getLogger().severe("Could not find ideal server for server/group '"+server.getName()+"'"); + continue; + } + + if(selected.isWhitelisted() && !selected.getWhitelistedPlayers().contains(nextPlayer.getUniqueId())) continue; if(!server.canAccess(nextPlayer)) continue; - if(server.isFull() && !server.canJoinFull(nextPlayer)) continue; + if(selected.isFull() && !selected.canJoinFull(nextPlayer)) continue; if(main.getConfig().getBoolean("enable-bypasspaused-permission")) { if(server.isPaused() && !nextPlayer.hasPermission("ajqueue.bypasspaused")) continue; @@ -648,17 +656,11 @@ public class QueueManagerImpl implements QueueManager { 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; - } + server.setLastSentTime(System.currentTimeMillis()); nextPlayer.connect(selected); - server.addPlayer(selected); - if(main.getConfig().getBoolean("debug")) { - Debug.info(selected.getName()+" player count is now set to "+ server.getLastPings().get(selected).getPlayerCount()); - } + selected.addPlayer(); + Debug.info(selected.getName()+" player count is now set to "+ selected.getPlayerCount()); } } 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 bfa72b5..cbdfd53 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 @@ -22,6 +22,20 @@ public class QueueServerImpl implements QueueServer { private final String name; + private final QueueMain main; + + private final List servers; + + private final List queue = new ArrayList<>(); + + private List supportedProtocols = new ArrayList<>(); + + private Balancer balancer; + + private boolean paused; + + private long lastSentTime = 0; + public QueueServerImpl(String name, QueueMain main, AdaptedServer server, List previousPlayers) { this(name, main, Collections.singletonList(server), previousPlayers); } @@ -81,40 +95,6 @@ public class QueueServerImpl implements QueueServer { } } - private final QueueMain main; - - private final HashMap pings = new HashMap<>(); - - private final List servers; - - private final List queue = new ArrayList<>(); - - private List supportedProtocols = new ArrayList<>(); - - private Balancer balancer; - - - 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); @@ -123,12 +103,13 @@ public class QueueServerImpl implements QueueServer { @Override public String getStatusString(AdaptedPlayer p) { Messages msgs = main.getMessages(); + AdaptedServer server = getIdealServer(p); - if(getOfflineTime() > main.getConfig().getInt("offline-time")) { + if(server.getOfflineTime() > main.getConfig().getInt("offline-time")) { return msgs.getString("status.offline.offline"); } - if(!isOnline()) { + if(!server.isOnline()) { return msgs.getString("status.offline.restarting"); } @@ -136,11 +117,11 @@ public class QueueServerImpl implements QueueServer { return msgs.getString("status.offline.paused"); } - if(p != null && isWhitelisted() && !getWhitelistedPlayers().contains(p.getUniqueId())) { + if(p != null && server.isWhitelisted() && !server.getWhitelistedPlayers().contains(p.getUniqueId())) { return msgs.getString("status.offline.whitelisted"); } - if(isFull() && !canJoinFull(p)) { + if(server.isFull() && !server.canJoinFull(p)) { return msgs.getString("status.offline.full"); } @@ -159,11 +140,12 @@ public class QueueServerImpl implements QueueServer { @Override public String getStatus(AdaptedPlayer p) { - if(getOfflineTime() > main.getConfig().getInt("offline-time")) { + AdaptedServer server = getIdealServer(p); + if(server.getOfflineTime() > main.getConfig().getInt("offline-time")) { return "offline"; } - if(!isOnline()) { + if(!server.isOnline()) { return "restarting"; } @@ -171,11 +153,11 @@ public class QueueServerImpl implements QueueServer { return "paused"; } - if(p != null && isWhitelisted() && !getWhitelistedPlayers().contains(p.getUniqueId())) { + if(p != null && server.isWhitelisted() && !server.getWhitelistedPlayers().contains(p.getUniqueId())) { return "whitelisted"; } - if(isFull() && !canJoinFull(p)) { + if(server.isFull() && !server.canJoinFull(p)) { return "full"; } @@ -188,101 +170,7 @@ public class QueueServerImpl implements QueueServer { @Override public String getStatus() { - return null; - } - - @Override - public void updatePing() { - boolean pingerDebug = main.getConfig().getBoolean("pinger-debug"); - HashMap> pingsFutures = new HashMap<>(); - for(AdaptedServer server : servers) { - if(pingerDebug) { - 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 (Exception e) { - if(pingerDebug) { - main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] offline:"); - e.printStackTrace(); - } - } - if(ping != null && pingerDebug) { - main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] online. motd: "+ping.getPlainDescription()+" players: "+ping.getPlayerCount()+"/"+ping.getMaxPlayers()); - } else if(ping == null && pingerDebug) { - main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] offline (unknown)"); - } - - 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 || serverPing.getPlainDescription() == null) { - if(serverPing != null) { - pings.put(pingedServer, null); - } - continue; - } - if(serverPing.getPlainDescription().contains("ajQueue;whitelisted=")) { - if(servers.size() > 1) continue; - - setWhitelisted(true); - List uuids = new ArrayList<>(); - for(String uuid : serverPing.getPlainDescription().substring(20).split(",")) { - if(uuid.isEmpty()) continue; - UUID parsedUUID; - try { - parsedUUID = UUID.fromString(uuid); - } catch(IllegalArgumentException e) { - main.getLogger().warn("UUID '"+uuid+"' in whitelist of "+getName()+" is invalid! "+e.getMessage()); - continue; - } - uuids.add(parsedUUID); - } - setWhitelistedPlayers(uuids); - } else { - setWhitelisted(false); - } - 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; - } - } - } - - if(pingerDebug) { - main.getLogger().info("[pinger] ["+server.getServerInfo().getName()+"] Finished"); - } - } - } - - @Override - public int getOfflineTime() { - return offlineTime; + return getStatus(null); } @Override @@ -294,39 +182,11 @@ public class QueueServerImpl implements QueueServer { this.lastSentTime = lastSentTime; } - @Override - public boolean isWhitelisted() { - return whitelisted; - } - - @Override - public void setWhitelisted(boolean whitelisted) { - this.whitelisted = whitelisted; - } - - @Override - public ImmutableList getWhitelistedPlayers() { - return ImmutableList.copyOf(whitelistedUUIDs); - } - - @Override - public synchronized void setWhitelistedPlayers(List whitelistedPlayers) { - whitelistedUUIDs = whitelistedPlayers; - } - @Override public boolean isJoinable(AdaptedPlayer p) { - if(p != null) { - if (isWhitelisted() && !whitelistedUUIDs.contains(p.getUniqueId())) { - return false; - } - if (isFull() && !canJoinFull(p)) { - return false; - } - } - return isOnline() && - canAccess(p) && - !isPaused(); + AdaptedServer server = getIdealServer(p); + if(server == null) return false; + return server.isJoinable(p) && !isPaused(); } @Override @@ -339,28 +199,6 @@ public class QueueServerImpl implements QueueServer { return paused; } - @Override - public boolean isOnline() { - 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 System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && online; - } - - @Override - public boolean isFull() { - if(!isOnline()) return false; - return playerCount >= maxPlayers; - } - @Override public synchronized void removePlayer(QueuePlayer player) { main.getQueueManager().getSendingAttempts().remove(player); @@ -460,15 +298,9 @@ public class QueueServerImpl implements QueueServer { @Override public AdaptedServer getIdealServer(AdaptedPlayer player) { - Debug.info(getBalancer().toString()); return getBalancer().getIdealServer(player); } - @Override - public HashMap getLastPings() { - return new HashMap<>(pings); - } - @Override public List getSupportedProtocols() { return new ArrayList<>(supportedProtocols); @@ -484,26 +316,4 @@ public class QueueServerImpl implements QueueServer { return balancer; } - @Override - public boolean canJoinFull(AdaptedPlayer player) { - if(player == null) return true; - return - player.hasPermission("ajqueue.joinfull") || - player.hasPermission("ajqueue.joinfullserver."+name) || - player.hasPermission("ajqueue.joinfullandbypassserver."+name) || - player.hasPermission("ajqueue.joinfullandbypass") || - (main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, name)) - ; - } - - @Override - public void addPlayer(AdaptedServer server) { - if(!pings.containsKey(server)) throw new IllegalArgumentException("Server is not in this group!"); - pings.get(server).addPlayer(); - } - - @Override - public void setOnline(boolean online) { - this.online = online; - } } diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java index bc69203..c227b2a 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java @@ -6,9 +6,11 @@ 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.utils.Debug; import us.ajg0702.utils.common.GenUtils; import java.util.HashMap; +import java.util.List; public class DefaultBalancer implements Balancer { @@ -21,29 +23,28 @@ public class DefaultBalancer implements Balancer { @Override public AdaptedServer getIdealServer(AdaptedPlayer player) { - HashMap serverInfos = server.getLastPings(); + List servers = server.getServers(); AdaptedServer selected = null; int selectednum = 0; - if(serverInfos.keySet().size() == 1) { - selected = serverInfos.keySet().iterator().next(); + if(servers.size() == 1) { + selected = servers.get(0); } else { - for(AdaptedServer si : serverInfos.keySet()) { - AdaptedServerPing sp = serverInfos.get(si); - if(sp == null) continue; - int online = sp.getPlayerCount(); + for(AdaptedServer sv : servers) { + if(!sv.isOnline()) continue; + int online = sv.getPlayerCount(); if(selected == null) { - selected = si; + selected = sv; selectednum = online; continue; } - if(selectednum > online && main.getQueueManager().findServer(si.getName()).isJoinable(player)) { - selected = si; + if(selectednum > online && main.getQueueManager().findServer(sv.getName()).isJoinable(player)) { + selected = sv; selectednum = online; } } } - if(selected == null && serverInfos.size() > 0) { - selected = serverInfos.keySet().iterator().next(); + if(selected == null && servers.size() > 0) { + selected = servers.get(0); } if(selected == null) { main.getLogger().warning("Unable to find ideal server, using random server from group."); diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java index 12cf2cc..6d571c1 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java @@ -20,34 +20,23 @@ public class MinigameBalancer implements Balancer { @Override public AdaptedServer getIdealServer(AdaptedPlayer player) { - HashMap serverInfos = server.getLastPings(); - if(serverInfos.keySet().size() == 1) { - return serverInfos.keySet().iterator().next(); + List servers = server.getServers(); + if(servers.size() == 1) { + return servers.get(0); } else { - List> servers = new ArrayList<>(serverInfos.entrySet()); - servers.sort(Comparator.comparingInt(o -> { - @SuppressWarnings("unchecked") - Map.Entry e = (Map.Entry) o; - AdaptedServerPing value = e.getValue(); - if(value == null) return -1; - return value.getPlayerCount(); - }).reversed()); - LinkedHashMap sortedServers = new LinkedHashMap<>(); - for(Map.Entry entry : servers) { - sortedServers.put(entry.getKey(), entry.getValue()); - } + List svs = new ArrayList<>(servers); + svs.sort(Comparator.comparingInt(o -> ((AdaptedServer)o).getPlayerCount()).reversed()); - for(AdaptedServer si : sortedServers.keySet()) { - AdaptedServerPing sp = sortedServers.get(si); - if(sp == null) continue; - int online = sp.getPlayerCount(); - int max = sp.getMaxPlayers(); + for(AdaptedServer si : svs) { + if(!si.isOnline()) continue; + int online = si.getPlayerCount(); + int max = si.getMaxPlayers(); if(online < max) { return si; } } - return new ArrayList(sortedServers.keySet().size()).get(sortedServers.keySet().size()-1); + return svs.get(svs.size()-1); } } } 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 bde5ab3..4a94030 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java @@ -5,6 +5,7 @@ import us.ajg0702.queue.api.players.AdaptedPlayer; import us.ajg0702.queue.api.players.QueuePlayer; import us.ajg0702.queue.api.premium.PermissionGetter; import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.api.server.AdaptedServer; public class FreeLogic implements Logic { @Override @@ -13,7 +14,7 @@ public class FreeLogic implements Logic { } @Override - public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) { + public QueuePlayer priorityLogic(QueueServer queueServer, AdaptedPlayer player, AdaptedServer server) { return null; } 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 index 51dc44b..780c6a8 100644 --- 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 @@ -2,6 +2,7 @@ package us.ajg0702.queue.platforms.bungeecord; import us.ajg0702.queue.api.util.QueueLogger; +import java.util.logging.Level; import java.util.logging.Logger; public class BungeeLogger implements QueueLogger { @@ -36,4 +37,29 @@ public class BungeeLogger implements QueueLogger { public void severe(String message) { logger.severe(message); } + + @Override + public void warn(String message, Throwable t) { + logger.log(Level.WARNING, message, t); + } + + @Override + public void warning(String message, Throwable t) { + logger.log(Level.WARNING, message, t); + } + + @Override + public void info(String message, Throwable t) { + logger.log(Level.INFO, message, t); + } + + @Override + public void error(String message, Throwable t) { + logger.log(Level.SEVERE, message, t); + } + + @Override + public void severe(String message, Throwable t) { + logger.log(Level.SEVERE, message, t); + } } 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 347b20d..af877fc 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 @@ -113,18 +113,44 @@ public class BungeeMethods implements PlatformMethods { @Override public AdaptedServer getServer(String name) { - ServerInfo server = proxyServer.getServerInfo(name); - if(server == null) return null; - return new BungeeServer(server); + List servers = getServers(); + for (AdaptedServer server : servers) { + if(server.getName().equals(name)) return server; + } + return null; } + List serverList = new ArrayList<>(); + @Override - public List getServers() { - List result = new ArrayList<>(); + public List getServers() { + for (ServerInfo serverInfo : proxyServer.getServers().values()) { + boolean found = false; + for(BungeeServer sv : new ArrayList<>(serverList)) { + if(sv.getHandle().equals(serverInfo)) { + found = true; + break; + } + } + if(found) continue; - proxyServer.getServers().forEach((s, serverInfo) -> result.add(new BungeeServer(serverInfo))); + serverList.add(new BungeeServer(serverInfo, plugin.getMain())); + } - return result; + for(BungeeServer sv : new ArrayList<>(serverList)) { + boolean found = false; + for (ServerInfo serverInfo : proxyServer.getServers().values()) { + if(sv.getHandle().equals(serverInfo)) { + found = true; + break; + } + } + if(found) continue; + + serverList.remove(sv); + } + + return serverList; } @Override 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 40f1a79..af7366a 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 @@ -145,7 +145,7 @@ public class BungeeQueue extends Plugin implements Listener, Implementation { Component reason = BungeeComponentSerializer.get().deserialize(e.getKickReasonComponent()); main.getEventHandler().onServerKick( new BungeePlayer(e.getPlayer()), - new BungeeServer(e.getKickedFrom()), + new BungeeServer(e.getKickedFrom(), main), reason, false ); @@ -167,4 +167,8 @@ public class BungeeQueue extends Plugin implements Listener, Implementation { getProxy().getPluginManager() .registerCommand(this, bungeeCommand); } + + public QueueMain getMain() { + return main; + } } 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 index 5a17dd8..a1c882a 100644 --- 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 @@ -6,20 +6,33 @@ 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.api.util.QueueLogger; +import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.bungeecord.players.BungeePlayer; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class BungeeServer implements AdaptedServer { - final ServerInfo handle; - final BungeeServerInfo serverInfo; + private final ServerInfo handle; + private final BungeeServerInfo serverInfo; - public BungeeServer(ServerInfo handle) { + private AdaptedServerPing lastPing = null; + private AdaptedServerPing lastSuccessfullPing = null; + private long lastOffline; + + private int offlineTime = 0; + + private final QueueMain main; + + public BungeeServer(ServerInfo handle, QueueMain main) { this.handle = handle; serverInfo = new BungeeServerInfo(handle); + this.main = main; } @Override @@ -33,19 +46,48 @@ public class BungeeServer implements AdaptedServer { } @Override - public CompletableFuture ping() { + public CompletableFuture ping(boolean debug, QueueLogger logger) { CompletableFuture future = new CompletableFuture<>(); + + long sent = System.currentTimeMillis(); + + if(debug) logger.info("[pinger] [" + getName() + "] sending ping"); + handle.ping((pp, error) -> { if(error != null) { + + long lastOnline = lastSuccessfullPing == null ? 0 : lastSuccessfullPing.getFetchedTime(); + offlineTime = (int) Math.min(sent - lastOnline, Integer.MAX_VALUE); + + lastOffline = sent; + future.completeExceptionally(error); + lastPing = null; + if(debug) logger.info("[pinger] [" + getName() + "] offline:", error); return; } - future.complete(new BungeeServerPing(pp)); + offlineTime = 0; + + BungeeServerPing ping = new BungeeServerPing(pp, sent); + lastSuccessfullPing = ping; + + if(debug) logger.info( + "[pinger] [" + getName() + "] online. motd: "+ping.getPlainDescription()+" " + + " players: "+ping.getPlayerCount()+"/"+ping.getMaxPlayers() + ); + + future.complete(ping); + lastPing = ping; }); return future; } + @Override + public Optional getLastPing() { + return Optional.ofNullable(lastPing); + } + @Override public boolean canAccess(AdaptedPlayer player) { return handle.canAccess((ProxiedPlayer) player.getHandle()); @@ -58,8 +100,43 @@ public class BungeeServer implements AdaptedServer { return players; } + @Override + public int getOfflineTime() { + return offlineTime; + } + + @Override + public boolean canJoinFull(AdaptedPlayer player) { + if(player == null) return true; + return + player.hasPermission("ajqueue.joinfull") || + player.hasPermission("ajqueue.joinfullserver."+getName()) || + player.hasPermission("ajqueue.joinfullandbypassserver."+getName()) || + player.hasPermission("ajqueue.joinfullandbypass") || + (main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName())) + ; + } + + @Override + public boolean justWentOnline() { + return System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && isOnline(); + } + @Override public ServerInfo getHandle() { return handle; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof BungeeServer)) return false; + BungeeServer that = (BungeeServer) o; + return getHandle().equals(that.getHandle()); + } + + @Override + public int hashCode() { + return Objects.hash(getHandle()); + } } 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 index 381937a..cc1ff7e 100644 --- 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 @@ -9,9 +9,11 @@ import us.ajg0702.queue.api.server.AdaptedServerPing; public class BungeeServerPing implements AdaptedServerPing { final ServerPing handle; + private final long sent; - public BungeeServerPing(ServerPing handle) { + public BungeeServerPing(ServerPing handle, long sent) { this.handle = handle; + this.sent = sent; } @Override @@ -45,6 +47,11 @@ public class BungeeServerPing implements AdaptedServerPing { add++; } + @Override + public long getFetchedTime() { + return sent; + } + @Override public ServerPing getHandle() { return handle; 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 index ce3706d..bcf540a 100644 --- 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 @@ -36,4 +36,29 @@ public class VelocityLogger implements QueueLogger { public void severe(String message) { logger.error(message); } + + @Override + public void warn(String message, Throwable t) { + logger.warn(message, t); + } + + @Override + public void warning(String message, Throwable t) { + logger.warn(message, t); + } + + @Override + public void info(String message, Throwable t) { + logger.info(message, t); + } + + @Override + public void error(String message, Throwable t) { + logger.error(message, t); + } + + @Override + public void severe(String message, Throwable t) { + logger.error(message, t); + } } 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 f0b99ad..af1b100 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 @@ -17,6 +17,7 @@ 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.common.utils.Debug; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; import us.ajg0702.queue.platforms.velocity.server.VelocityServer; @@ -134,19 +135,48 @@ public class VelocityMethods implements PlatformMethods { @Override public AdaptedServer getServer(String name) { - Optional server = proxyServer.getServer(name); - if(!server.isPresent()) return null; - return new VelocityServer(server.get()); + List servers = getServers(); + for (AdaptedServer server : servers) { + if(server.getName().equals(name)) return server; + } + return null; } + List serverList = new ArrayList<>(); + @Override - public List getServers() { - List result = new ArrayList<>(); + public List getServers() { - proxyServer.getAllServers().forEach(registeredServer -> result.add(new VelocityServer(registeredServer))); + for (RegisteredServer registeredServer : proxyServer.getAllServers()) { + boolean found = false; + for(VelocityServer sv : new ArrayList<>(serverList)) { + if(sv.getHandle().equals(registeredServer)) { + found = true; + break; + } + } + if(found) continue; - return result; + Debug.info("Added "+registeredServer.getServerInfo().getName()); + serverList.add(new VelocityServer(registeredServer, plugin.getMain())); + } + + for(VelocityServer sv : new ArrayList<>(serverList)) { + boolean found = false; + for (RegisteredServer registeredServer : proxyServer.getAllServers()) { + if(sv.getHandle().equals(registeredServer)) { + found = true; + break; + } + } + if(found) continue; + + Debug.info("Removed "+sv.getName()); + serverList.remove(sv); + } + + return serverList; } @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 55717c6..8e61b95 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 @@ -144,7 +144,7 @@ public class VelocityQueue implements Implementation { Optional reasonOptional = e.getServerKickReason(); main.getEventHandler().onServerKick( new VelocityPlayer(e.getPlayer()), - new VelocityServer(e.getServer()), + new VelocityServer(e.getServer(), main), 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() @@ -165,4 +165,8 @@ public class VelocityQueue implements Implementation { new VelocityCommand(main, (BaseCommand) command) ); } + + public QueueMain getMain() { + return main; + } } 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 dd316a0..a4cafda 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 @@ -7,17 +7,31 @@ 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.api.util.QueueLogger; +import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; import java.util.ArrayList; import java.util.List; +import java.util.Objects; +import java.util.Optional; import java.util.concurrent.CompletableFuture; public class VelocityServer implements AdaptedServer { private final RegisteredServer handle; - public VelocityServer(RegisteredServer handle) { + + private AdaptedServerPing lastPing = null; + private AdaptedServerPing lastSuccessfullPing = null; + private long lastOffline = 0; + + private int offlineTime = 0; + + private final QueueMain main; + + public VelocityServer(RegisteredServer handle, QueueMain main) { this.handle = handle; + this.main = main; } @Override @@ -31,22 +45,51 @@ public class VelocityServer implements AdaptedServer { } @Override - public CompletableFuture ping() { + public CompletableFuture ping(boolean debug, QueueLogger logger) { CompletableFuture future = new CompletableFuture<>(); + + long sent = System.currentTimeMillis(); + CompletableFuture serverPing = handle.ping(); + + if(debug) logger.info("[pinger] [" + getName() + "] sending ping"); + serverPing.thenRunAsync(() -> { - AdaptedServerPing aPing; + VelocityServerPing ping; try { - aPing = new VelocityServerPing(serverPing.get()); + ping = new VelocityServerPing(serverPing.get(), sent); } catch (Throwable e) { + + long lastOnline = lastSuccessfullPing == null ? 0 : lastSuccessfullPing.getFetchedTime(); + offlineTime = (int) Math.min(sent - lastOnline, Integer.MAX_VALUE); + + lastOffline = sent; + future.completeExceptionally(e); + lastPing = null; + if(debug) logger.info("[pinger] [" + getName() + "] offline:", e); return; } - future.complete(aPing); + + offlineTime = 0; + lastSuccessfullPing = ping; + + if(debug) logger.info( + "[pinger] [" + getName() + "] online. motd: "+ping.getPlainDescription()+" " + + " players: "+ping.getPlayerCount()+"/"+ping.getMaxPlayers() + ); + + future.complete(ping); + lastPing = ping; }); return future; } + @Override + public Optional getLastPing() { + return Optional.ofNullable(lastPing); + } + @Override public boolean canAccess(AdaptedPlayer player) { return true; @@ -61,8 +104,43 @@ public class VelocityServer implements AdaptedServer { return players; } + @Override + public int getOfflineTime() { + return offlineTime; + } + + @Override + public boolean canJoinFull(AdaptedPlayer player) { + if(player == null) return true; + return + player.hasPermission("ajqueue.joinfull") || + player.hasPermission("ajqueue.joinfullserver."+getName()) || + player.hasPermission("ajqueue.joinfullandbypassserver."+getName()) || + player.hasPermission("ajqueue.joinfullandbypass") || + (main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName())) + ; + } + + @Override + public boolean justWentOnline() { + return System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && isOnline(); + } + @Override public RegisteredServer getHandle() { return handle; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof VelocityServer)) return false; + VelocityServer that = (VelocityServer) o; + return getHandle().equals(that.getHandle()); + } + + @Override + public int hashCode() { + return Objects.hash(getHandle()); + } } 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 ae5b6be..b6505a7 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 @@ -8,8 +8,10 @@ import us.ajg0702.queue.api.server.AdaptedServerPing; public class VelocityServerPing implements AdaptedServerPing { private final ServerPing handle; - public VelocityServerPing(ServerPing handle) { + private final long sent; + public VelocityServerPing(ServerPing handle, long sent) { this.handle = handle; + this.sent = sent; } @Override @@ -39,6 +41,11 @@ public class VelocityServerPing implements AdaptedServerPing { add++; } + @Override + public long getFetchedTime() { + return sent; + } + @Override public ServerPing getHandle() { return handle; 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 d85d6ce..f7c5e83 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java @@ -5,6 +5,7 @@ import us.ajg0702.queue.api.premium.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.server.AdaptedServer; import us.ajg0702.queue.api.util.QueueLogger; import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.common.players.QueuePlayerImpl; @@ -28,7 +29,7 @@ public class PremiumLogic implements Logic { } @Override - public QueuePlayer priorityLogic(QueueServer server, AdaptedPlayer player) { + public QueuePlayer priorityLogic(QueueServer queueServer, AdaptedPlayer player, AdaptedServer server) { int maxOfflineTime = permissionGetter.getMaxOfflineTime(player); QueueMain main = QueueMain.getInstance(); @@ -38,32 +39,32 @@ public class PremiumLogic implements Logic { if( player.hasPermission("ajqueue.bypass") || - player.hasPermission("ajqueue.serverbypass."+server.getName()) || - player.hasPermission("ajqueue.joinfullandbypassserver."+server.getName()) || + player.hasPermission("ajqueue.serverbypass."+ queueServer.getName()) || + player.hasPermission("ajqueue.joinfullandbypassserver."+ queueServer.getName()) || player.hasPermission("ajqueue.joinfullandbypass") || - permissionGetter.hasContextBypass(player, server.getName()) || - (main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, server.getName())) + permissionGetter.hasContextBypass(player, queueServer.getName()) || + (main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, queueServer.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); + QueuePlayer queuePlayer = new QueuePlayerImpl(player, queueServer, Integer.MAX_VALUE, maxOfflineTime); + queueServer.addPlayer(queuePlayer, 0); + main.getQueueManager().sendPlayers(queueServer); return queuePlayer; } int priority = permissionGetter.getPriority(player); - int serverPriority = permissionGetter.getServerPriotity(server.getName(), player); + int serverPriority = permissionGetter.getServerPriotity(queueServer.getName(), player); if(debug) { logger.info("[priority] Using "+permissionGetter.getSelected().getName()+" for permissions"); } int highestPriority = Math.max(priority, serverPriority); - highestPriority = Math.max(highestPriority, Logic.getUnJoinablePriorities(server, player)); + highestPriority = Math.max(highestPriority, Logic.getUnJoinablePriorities(queueServer, server, player)); - QueuePlayer queuePlayer = new QueuePlayerImpl(player, server, highestPriority, maxOfflineTime); + QueuePlayer queuePlayer = new QueuePlayerImpl(player, queueServer, highestPriority, maxOfflineTime); if(debug) { logger.info("[priority] "+player.getName()+" highestPriority: "+highestPriority); @@ -75,11 +76,11 @@ public class PremiumLogic implements Logic { if(debug) { logger.info("[priority] "+player.getName()+" No priority" ); } - server.addPlayer(queuePlayer); + queueServer.addPlayer(queuePlayer); return queuePlayer; } - ImmutableList list = server.getQueue(); + ImmutableList list = queueServer.getQueue(); for(int i = 0; i < list.size(); i++) { QueuePlayer pl = list.get(i); @@ -87,7 +88,7 @@ public class PremiumLogic implements Logic { if (debug) { logger.info("[priority] " + player.getName() + " Adding to: " + i); } - server.addPlayer(queuePlayer, i); + queueServer.addPlayer(queuePlayer, i); return queuePlayer; } } @@ -96,7 +97,7 @@ public class PremiumLogic implements Logic { if(debug) { logger.info("[priority] "+player.getName()+" Cant go infront of anyone" ); } - server.addPlayer(queuePlayer); + queueServer.addPlayer(queuePlayer); return queuePlayer; } From 76796b02f94e29fef8de1de328865c4a9220f59e Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 15 Aug 2022 13:49:55 -0700 Subject: [PATCH 06/21] Fixed colors codes not working in status placeholder in listqueues command --- .../ajg0702/queue/commands/commands/listqueues/ListCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 53132e3..2e9ff6c 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 @@ -71,7 +71,7 @@ public class ListCommand extends BaseCommand { "COLOR:" + Messages.color(color), "NAME:" + s.getAlias(), "COUNT:" + s.getQueue().size(), - "STATUS:" + main.getMessages().getRawString("placeholders.status."+s.getStatus(spp)) + "STATUS:" + Messages.color(main.getMessages().getRawString("placeholders.status."+s.getStatus(spp))) )); } sender.sendMessage(m); From 4f7a137ea87f499ed1e0ab43eb778808908d89e1 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Mon, 15 Aug 2022 16:56:07 -0700 Subject: [PATCH 07/21] Fixed an error that could happen when checking if a server is full --- .../queue/platforms/bungeecord/BungeeMethods.java | 2 +- .../queue/platforms/bungeecord/BungeeQueue.java | 2 +- .../platforms/bungeecord/server/BungeeServer.java | 11 ++++------- .../queue/platforms/velocity/VelocityMethods.java | 2 +- .../queue/platforms/velocity/VelocityQueue.java | 2 +- .../platforms/velocity/server/VelocityServer.java | 13 ++++++------- 6 files changed, 14 insertions(+), 18 deletions(-) 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 af877fc..f8551ff 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 @@ -134,7 +134,7 @@ public class BungeeMethods implements PlatformMethods { } if(found) continue; - serverList.add(new BungeeServer(serverInfo, plugin.getMain())); + serverList.add(new BungeeServer(serverInfo)); } for(BungeeServer sv : new ArrayList<>(serverList)) { 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 af7366a..32fb6a6 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 @@ -145,7 +145,7 @@ public class BungeeQueue extends Plugin implements Listener, Implementation { Component reason = BungeeComponentSerializer.get().deserialize(e.getKickReasonComponent()); main.getEventHandler().onServerKick( new BungeePlayer(e.getPlayer()), - new BungeeServer(e.getKickedFrom(), main), + new BungeeServer(e.getKickedFrom()), reason, false ); 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 index a1c882a..085faff 100644 --- 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 @@ -2,12 +2,12 @@ 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.AjQueueAPI; 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.api.util.QueueLogger; -import us.ajg0702.queue.common.QueueMain; import us.ajg0702.queue.platforms.bungeecord.players.BungeePlayer; import java.util.ArrayList; @@ -27,12 +27,9 @@ public class BungeeServer implements AdaptedServer { private int offlineTime = 0; - private final QueueMain main; - - public BungeeServer(ServerInfo handle, QueueMain main) { + public BungeeServer(ServerInfo handle) { this.handle = handle; serverInfo = new BungeeServerInfo(handle); - this.main = main; } @Override @@ -113,13 +110,13 @@ public class BungeeServer implements AdaptedServer { player.hasPermission("ajqueue.joinfullserver."+getName()) || player.hasPermission("ajqueue.joinfullandbypassserver."+getName()) || player.hasPermission("ajqueue.joinfullandbypass") || - (main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName())) + (AjQueueAPI.getInstance().isPremium() && AjQueueAPI.getInstance().getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName())) ; } @Override public boolean justWentOnline() { - return System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && isOnline(); + return System.currentTimeMillis()-lastOffline <= (AjQueueAPI.getInstance().getConfig().getDouble("wait-time")) && isOnline(); } @Override 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 af1b100..a7e5f05 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 @@ -159,7 +159,7 @@ public class VelocityMethods implements PlatformMethods { if(found) continue; Debug.info("Added "+registeredServer.getServerInfo().getName()); - serverList.add(new VelocityServer(registeredServer, plugin.getMain())); + serverList.add(new VelocityServer(registeredServer)); } for(VelocityServer sv : new ArrayList<>(serverList)) { 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 8e61b95..3f40036 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 @@ -144,7 +144,7 @@ public class VelocityQueue implements Implementation { Optional reasonOptional = e.getServerKickReason(); main.getEventHandler().onServerKick( new VelocityPlayer(e.getPlayer()), - new VelocityServer(e.getServer(), main), + 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/server/VelocityServer.java b/platforms/velocity/src/main/java/us/ajg0702/queue/platforms/velocity/server/VelocityServer.java index a4cafda..0b81b97 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 @@ -3,12 +3,13 @@ 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.AjQueueAPI; 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.api.util.QueueLogger; -import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.queue.common.utils.Debug; import us.ajg0702.queue.platforms.velocity.players.VelocityPlayer; import java.util.ArrayList; @@ -27,11 +28,8 @@ public class VelocityServer implements AdaptedServer { private int offlineTime = 0; - private final QueueMain main; - - public VelocityServer(RegisteredServer handle, QueueMain main) { + public VelocityServer(RegisteredServer handle) { this.handle = handle; - this.main = main; } @Override @@ -112,18 +110,19 @@ public class VelocityServer implements AdaptedServer { @Override public boolean canJoinFull(AdaptedPlayer player) { if(player == null) return true; + Debug.info("on "+getName()); return player.hasPermission("ajqueue.joinfull") || player.hasPermission("ajqueue.joinfullserver."+getName()) || player.hasPermission("ajqueue.joinfullandbypassserver."+getName()) || player.hasPermission("ajqueue.joinfullandbypass") || - (main.isPremium() && main.getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName())) + (AjQueueAPI.getInstance().isPremium() && AjQueueAPI.getInstance().getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName())) ; } @Override public boolean justWentOnline() { - return System.currentTimeMillis()-lastOffline <= (main.getConfig().getDouble("wait-time")) && isOnline(); + return System.currentTimeMillis()-lastOffline <= (AjQueueAPI.getInstance().getConfig().getDouble("wait-time")) && isOnline(); } @Override From fb1e8cd475ae5bacf73f9431eb70375430f88984 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 19 Aug 2022 17:23:56 -0700 Subject: [PATCH 08/21] Wont check joinfrom permission unless the player actually executed the command (/ajq send bypasses joinfrom now) --- .../ajg0702/queue/commands/commands/queue/QueueCommand.java | 4 ++++ .../main/java/us/ajg0702/queue/common/QueueManagerImpl.java | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) 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 baf1071..0677fb4 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 @@ -63,6 +63,10 @@ public class QueueCommand extends BaseCommand { sender.sendMessage(getMessages().getComponent("noperm")); return; } + if(main.getConfig().getBoolean("joinfrom-server-permission") && !player.hasPermission("ajqueue.joinfrom."+player.getServerName())) { + player.sendMessage(getMessages().getComponent("errors.deny-joining-from-server")); + return; + } main.getQueueManager().addToQueue(player, args[0]); } else { sender.sendMessage(getMessages().getComponent("commands.joinqueue.usage")); 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 d997c3e..2857c26 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -103,11 +103,6 @@ public class QueueManagerImpl implements QueueManager { Debug.info("addToQueue method called for "+player.getName()+" to "+server.getName()); - if(main.getConfig().getBoolean("joinfrom-server-permission") && !player.hasPermission("ajqueue.joinfrom."+player.getServerName())) { - player.sendMessage(msgs.getComponent("errors.deny-joining-from-server")); - return false; - } - int playerVersion = player.getProtocolVersion(); List supportedProtocols = server.getSupportedProtocols(); if(!supportedProtocols.contains(playerVersion) && supportedProtocols.size() > 0) { From 38536ad4c9dcb467741b11c92de107ebd2e91990 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sat, 27 Aug 2022 17:41:10 -0700 Subject: [PATCH 09/21] [nolist] fix maven repo URL --- api/build.gradle.kts | 2 +- build.gradle.kts | 2 +- common/build.gradle.kts | 2 +- free/build.gradle.kts | 2 +- platforms/bungeecord/build.gradle.kts | 2 +- platforms/velocity/build.gradle.kts | 2 +- premium/build.gradle.kts | 2 +- spigot/build.gradle.kts | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/api/build.gradle.kts b/api/build.gradle.kts index c4cf23b..432dcef 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -8,7 +8,7 @@ group = "us.ajg0702.queue.api" repositories { //mavenLocal() - maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://repo.ajg0702.us/releases/") } mavenCentral() } diff --git a/build.gradle.kts b/build.gradle.kts index 4cd58f0..73cc94a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } repositories { - maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://repo.ajg0702.us/releases/") } maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } mavenCentral() diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 0d606cf..6b85863 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -7,7 +7,7 @@ group = "us.ajg0702.queue.common" repositories { //mavenLocal() - maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://repo.ajg0702.us/releases/") } mavenCentral() } diff --git a/free/build.gradle.kts b/free/build.gradle.kts index b856e4a..cea97ae 100644 --- a/free/build.gradle.kts +++ b/free/build.gradle.kts @@ -8,7 +8,7 @@ group = "us.ajg0702.queue" repositories { //mavenLocal() - maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://repo.ajg0702.us/releases/") } maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } mavenCentral() } diff --git a/platforms/bungeecord/build.gradle.kts b/platforms/bungeecord/build.gradle.kts index 106cca4..6af3501 100644 --- a/platforms/bungeecord/build.gradle.kts +++ b/platforms/bungeecord/build.gradle.kts @@ -7,7 +7,7 @@ group = "us.ajg0702.queue.platforms.bungeecord" repositories { //mavenLocal() - maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://repo.ajg0702.us/releases/") } maven { url = uri("https://nexus.velocitypowered.com/repository/maven-public/") } maven { url = uri("https://repo.viaversion.com/") } mavenCentral() diff --git a/platforms/velocity/build.gradle.kts b/platforms/velocity/build.gradle.kts index a57dc43..9ee5692 100644 --- a/platforms/velocity/build.gradle.kts +++ b/platforms/velocity/build.gradle.kts @@ -7,7 +7,7 @@ group = "us.ajg0702.queue.platforms.velocity" repositories { //mavenLocal() - maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://repo.ajg0702.us/releases/") } maven { url = uri("https://repo.papermc.io/repository/maven-public/") } maven { url = uri("https://repo.viaversion.com/") } mavenCentral() diff --git a/premium/build.gradle.kts b/premium/build.gradle.kts index 0e751ff..e12c799 100644 --- a/premium/build.gradle.kts +++ b/premium/build.gradle.kts @@ -8,7 +8,7 @@ group = "us.ajg0702.queue" repositories { //mavenLocal() - maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://repo.ajg0702.us/releases/") } maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } mavenCentral() } diff --git a/spigot/build.gradle.kts b/spigot/build.gradle.kts index 260a421..c9d3508 100644 --- a/spigot/build.gradle.kts +++ b/spigot/build.gradle.kts @@ -13,7 +13,7 @@ repositories { maven { url = uri("https://repo.codemc.io/repository/nms/") } - maven { url = uri("https://repo.ajg0702.us") } + maven { url = uri("https://repo.ajg0702.us/releases/") } mavenCentral() } From 131d556acd666eb587bc784614a2f629b97d4ec0 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 15 Sep 2022 10:30:28 -0700 Subject: [PATCH 10/21] Fix unnecessary server look up in default balancer --- .../ajg0702/queue/common/queues/balancers/DefaultBalancer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java index c227b2a..119e6ad 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/DefaultBalancer.java @@ -37,7 +37,7 @@ public class DefaultBalancer implements Balancer { selectednum = online; continue; } - if(selectednum > online && main.getQueueManager().findServer(sv.getName()).isJoinable(player)) { + if(selectednum > online && sv.isJoinable(player)) { selected = sv; selectednum = online; } From 2b669182026d0cbd08534477f733a4fa4945bacb Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 15 Sep 2022 10:30:48 -0700 Subject: [PATCH 11/21] Fix minigame balancer not checking if server is joinable --- .../ajg0702/queue/common/queues/balancers/MinigameBalancer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java index 6d571c1..941b82e 100644 --- a/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java +++ b/common/src/main/java/us/ajg0702/queue/common/queues/balancers/MinigameBalancer.java @@ -32,7 +32,7 @@ public class MinigameBalancer implements Balancer { if(!si.isOnline()) continue; int online = si.getPlayerCount(); int max = si.getMaxPlayers(); - if(online < max) { + if(online < max && si.isJoinable(player)) { return si; } } From 44c96e48047c10773028b7ba538c599d3896fb9e Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 7 Oct 2022 14:01:54 -0700 Subject: [PATCH 12/21] Fixed send-instantly not bypassing check-last-player-sent-time --- .../main/java/us/ajg0702/queue/common/QueueManagerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 2857c26..7b15d26 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -187,11 +187,11 @@ 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(player); + boolean sendInstant = server.isJoinable(player); boolean sendInstantp = list.size() <= 1 && server.isJoinable(player); boolean timeGood = !main.getConfig().getBoolean("check-last-player-sent-time") || server.getLastSentTime() > Math.floor(main.getTimeBetweenPlayers() * 1000); - if((sendInstant && (sendInstantp && timeGood))) { + if(main.getConfig().getStringList("send-instantly").contains(server.getName()) || (sendInstant && (sendInstantp && timeGood))) { sendPlayers(server); if(!msgs.isEmpty("status.now-in-empty-queue")) { player.sendMessage(msgs.getComponent("status.now-in-empty-queue", From 404785a5a2fe5129f6526f09fc558051682c058b Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 7 Oct 2022 15:50:33 -0700 Subject: [PATCH 13/21] [nolist] change some "bungeecord" to just "proxy" in the config --- common/src/main/resources/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 07dd3f7..42d98c1 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -89,7 +89,7 @@ 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 +# This will show players a different name than the actual proxy 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 @@ -147,7 +147,7 @@ tab-complete-queues: true send-instantly: - "lobbys" -# Should we log to the bungeecord console when a player fails to get sent to a server from the queue? +# Should we log to the proxy 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 @@ -173,7 +173,7 @@ check-last-player-sent-time: true 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. +# You will still need to use another plugin to make sure the player doesnt get kicked from the proxy completly. # Default: false auto-add-to-queue-on-kick: false # The delay for the above option. From 11dcda49fd200a02ad4de930988b9ac57fda3d81 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Fri, 7 Oct 2022 16:41:54 -0700 Subject: [PATCH 14/21] Fixed supported-protocols not working with groups --- .../queue/common/QueueManagerImpl.java | 112 ++++++++++-------- 1 file changed, 60 insertions(+), 52 deletions(-) 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 7b15d26..aef47cc 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -40,7 +40,7 @@ public class QueueManagerImpl implements QueueManager { List servers = main.getPlatformMethods().getServers(); for(AdaptedServer server : servers) { - QueueServer previousServer = main.getQueueManager().findServer(server.getName()); + QueueServer previousServer = 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()); @@ -53,6 +53,54 @@ public class QueueManagerImpl implements QueueManager { result.add(queueServer); } + 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; + } + + if(!groupRaw.contains(":")) { + main.getLogger().warning("Incorrect formatting! Each server group needs to have a name and a list of servers seperated by a colon (:)."); + continue; + } + + String groupName = groupRaw.split(":")[0]; + String[] serversraw = groupRaw.split(":")[1].split(","); + + if(findServer(groupName, result) != 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) { + QueueServer found = findServer(serverraw, result); + if(found == null) { + main.getLogger().warning("Could not find server named '"+serverraw+"' in servergroup '"+groupName+"'!"); + continue; + } + if(found.isGroup()) continue; + + groupServers.add(found.getServers().get(0)); + } + + if(groupServers.size() == 0) { + main.getLogger().warning("Server group '"+groupName+"' has no servers! Ignoring it."); + continue; + } + + + QueueServer previousServer = main.getQueueManager().findServer(groupName); + List previousPlayers = previousServer == null ? new ArrayList<>() : previousServer.getQueue(); + if(previousPlayers.size() > 0) { + main.getLogger().info("Adding "+previousPlayers.size()+" players back to the queue for "+groupName); + } + + result.add(new QueueServerImpl(groupName, main, groupServers, previousPlayers)); + } + List supportedProtocolsRaw = main.getConfig().getStringList("supported-protocols"); for(String supportedProtocolsString : supportedProtocolsRaw) { String[] parts = supportedProtocolsString.split(":"); @@ -73,13 +121,20 @@ public class QueueManagerImpl implements QueueManager { } for(String serverName : serversRaw.split(",")) { + boolean found = false; for(QueueServer server : result) { if(serverName.equalsIgnoreCase(server.getName())) { server.setSupportedProtocols(protocols); + found = true; + Debug.info("Applied " + protocols + " to " + server.getName() + "(" + serverName + ")"); break; } } + if(!found) { + Debug.info("Found no server named " + serverName); + } } + } return result; @@ -283,58 +338,7 @@ public class QueueManagerImpl implements QueueManager { main.getLogger().severe("[MAN] Config is null"); } - List oldServers = ImmutableList.copyOf(servers); - servers = new CopyOnWriteArrayList<>(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; - } - - if(!groupRaw.contains(":")) { - main.getLogger().warning("Incorrect formatting! Each server group needs to have a name and a list of servers seperated by a colon (:)."); - 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; - } - - List groupServers = new ArrayList<>(); - - for(String serverraw : serversraw) { - QueueServer found = findServer(serverraw); - if(found == null) { - main.getLogger().warning("Could not find server named '"+serverraw+"' in servergroup '"+groupName+"'!"); - continue; - } - if(found.isGroup()) continue; - - groupServers.add(found.getServers().get(0)); - } - - if(groupServers.size() == 0) { - main.getLogger().warning("Server group '"+groupName+"' has no servers! Ignoring it."); - continue; - } - - - 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)); - } } @Override @@ -516,6 +520,10 @@ public class QueueManagerImpl implements QueueManager { @Override public QueueServer findServer(String name) { + return findServer(name, servers); + } + + public QueueServer findServer(String name, List servers) { for(QueueServer server : servers) { if(server == null) continue; if(server.getName().equalsIgnoreCase(name)) { From d78c795288f1b29d7cd5f7a1f577bc28690cdb42 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 20 Oct 2022 13:48:31 -0700 Subject: [PATCH 15/21] Fixed offline servers sometimes not being marked as offline on velocity --- .../java/us/ajg0702/queue/api/AjQueueAPI.java | 4 +++ .../us/ajg0702/queue/common/QueueMain.java | 6 +++++ .../bungeecord/server/BungeeServer.java | 22 ++++++++-------- .../velocity/server/VelocityServer.java | 25 ++++++++++++------- 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java b/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java index ce7fc5f..2f54b52 100644 --- a/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java +++ b/api/src/main/java/us/ajg0702/queue/api/AjQueueAPI.java @@ -6,6 +6,8 @@ import us.ajg0702.queue.api.util.QueueLogger; import us.ajg0702.utils.common.Config; import us.ajg0702.utils.common.Messages; +import java.util.concurrent.ExecutorService; + public abstract class AjQueueAPI { public static AjQueueAPI INSTANCE; @@ -106,4 +108,6 @@ public abstract class AjQueueAPI { * Tells ajQueue to shut down. */ public abstract void shutdown(); + + public abstract ExecutorService getServersUpdateExecutor(); } 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 2b52877..0973e5a 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -13,6 +13,7 @@ import us.ajg0702.utils.common.Updater; import java.io.File; import java.util.LinkedHashMap; +import java.util.concurrent.ExecutorService; import java.util.regex.Pattern; public class QueueMain extends AjQueueAPI { @@ -123,6 +124,11 @@ public class QueueMain extends AjQueueAPI { updater.shutdown(); } + @Override + public ExecutorService getServersUpdateExecutor() { + return taskManager.getServersUpdateExecutor(); + } + private final File dataFolder; 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 index 085faff..a76567a 100644 --- 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 @@ -52,16 +52,7 @@ public class BungeeServer implements AdaptedServer { handle.ping((pp, error) -> { if(error != null) { - - long lastOnline = lastSuccessfullPing == null ? 0 : lastSuccessfullPing.getFetchedTime(); - offlineTime = (int) Math.min(sent - lastOnline, Integer.MAX_VALUE); - - lastOffline = sent; - - future.completeExceptionally(error); - lastPing = null; - if(debug) logger.info("[pinger] [" + getName() + "] offline:", error); - return; + markOffline(debug, logger, future, sent, error); } offlineTime = 0; @@ -80,6 +71,17 @@ public class BungeeServer implements AdaptedServer { return future; } + private void markOffline(boolean debug, QueueLogger logger, CompletableFuture future, long sent, Throwable e) { + long lastOnline = lastSuccessfullPing == null ? 0 : lastSuccessfullPing.getFetchedTime(); + offlineTime = (int) Math.min(sent - lastOnline, Integer.MAX_VALUE); + + lastOffline = sent; + + future.completeExceptionally(e); + lastPing = null; + if(debug) logger.info("[pinger] [" + getName() + "] offline:", e); + } + @Override public Optional getLastPing() { return Optional.ofNullable(lastPing); 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 0b81b97..54f9985 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 @@ -53,19 +53,12 @@ public class VelocityServer implements AdaptedServer { if(debug) logger.info("[pinger] [" + getName() + "] sending ping"); serverPing.thenRunAsync(() -> { + System.out.println("thenRunAsync " + getName()); VelocityServerPing ping; try { ping = new VelocityServerPing(serverPing.get(), sent); } catch (Throwable e) { - - long lastOnline = lastSuccessfullPing == null ? 0 : lastSuccessfullPing.getFetchedTime(); - offlineTime = (int) Math.min(sent - lastOnline, Integer.MAX_VALUE); - - lastOffline = sent; - - future.completeExceptionally(e); - lastPing = null; - if(debug) logger.info("[pinger] [" + getName() + "] offline:", e); + markOffline(debug, logger, future, sent, e); return; } @@ -79,10 +72,24 @@ public class VelocityServer implements AdaptedServer { future.complete(ping); lastPing = ping; + }).exceptionally(e -> { + markOffline(debug, logger, future, sent, e); + return null; }); return future; } + private void markOffline(boolean debug, QueueLogger logger, CompletableFuture future, long sent, Throwable e) { + long lastOnline = lastSuccessfullPing == null ? 0 : lastSuccessfullPing.getFetchedTime(); + offlineTime = (int) Math.min(sent - lastOnline, Integer.MAX_VALUE); + + lastOffline = sent; + + future.completeExceptionally(e); + lastPing = null; + if(debug) logger.info("[pinger] [" + getName() + "] offline:", e); + } + @Override public Optional getLastPing() { return Optional.ofNullable(lastPing); From a21307c68fafcd420485cf5f0b60c77b3e081d33 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 20 Oct 2022 13:50:01 -0700 Subject: [PATCH 16/21] [nolist] whoops --- .../ajg0702/queue/platforms/velocity/server/VelocityServer.java | 1 - 1 file changed, 1 deletion(-) 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 54f9985..13741b8 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 @@ -53,7 +53,6 @@ public class VelocityServer implements AdaptedServer { if(debug) logger.info("[pinger] [" + getName() + "] sending ping"); serverPing.thenRunAsync(() -> { - System.out.println("thenRunAsync " + getName()); VelocityServerPing ping; try { ping = new VelocityServerPing(serverPing.get(), sent); From 00ffb3e29c8790c2a1279eb398b0b4bfcb1f8218 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Thu, 20 Oct 2022 14:08:38 -0700 Subject: [PATCH 17/21] Fixed send-all-when-back-online not working 99% of the time --- .../src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java | 1 + .../ajg0702/queue/platforms/bungeecord/server/BungeeServer.java | 2 +- .../queue/platforms/velocity/players/VelocityPlayer.java | 2 +- .../ajg0702/queue/platforms/velocity/server/VelocityServer.java | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) 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 aef47cc..ca5395c 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -562,6 +562,7 @@ public class QueueManagerImpl implements QueueManager { if(!server.isOnline()) continue; if(server.getQueue().size() == 0) continue; + Debug.info("should send instantly: " + !server.isGroup() + " && " + main.getConfig().getBoolean("send-all-when-back-online") + " && " + server.getServers().get(0).justWentOnline()); if(!server.isGroup() && main.getConfig().getBoolean("send-all-when-back-online") && server.getServers().get(0).justWentOnline()) { for(QueuePlayer p : server.getQueue()) { 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 index a76567a..777a12f 100644 --- 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 @@ -118,7 +118,7 @@ public class BungeeServer implements AdaptedServer { @Override public boolean justWentOnline() { - return System.currentTimeMillis()-lastOffline <= (AjQueueAPI.getInstance().getConfig().getDouble("wait-time")) && isOnline(); + return System.currentTimeMillis()-lastOffline <= (AjQueueAPI.getInstance().getConfig().getDouble("wait-time") * 2 * 1000) && isOnline(); } @Override 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 8ba4cdb..a362b61 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 @@ -99,7 +99,7 @@ public class VelocityPlayer implements AdaptedPlayer, Audience { @Override public void sendMessage(String message) { - sendMessage(Component.text().content(message)); + sendMessage(Component.text(message)); } @Override 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 13741b8..7fd35df 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 @@ -128,7 +128,7 @@ public class VelocityServer implements AdaptedServer { @Override public boolean justWentOnline() { - return System.currentTimeMillis()-lastOffline <= (AjQueueAPI.getInstance().getConfig().getDouble("wait-time")) && isOnline(); + return System.currentTimeMillis()-lastOffline <= (AjQueueAPI.getInstance().getConfig().getDouble("wait-time") * 2 * 1000) && isOnline(); } @Override From 741395ea543926681cf1219363aace2b6ddaa087 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Wed, 26 Oct 2022 12:41:47 -0700 Subject: [PATCH 18/21] fix error with placeholders that could happen when player disconnects --- .../src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java | 1 + 1 file changed, 1 insertion(+) 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 20ac404..fdc0319 100644 --- a/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/EventHandlerImpl.java @@ -120,6 +120,7 @@ public class EventHandlerImpl implements EventHandler { String srv = in.readUTF(); QueueServer server = main.getQueueManager().findServer(srv); if(server == null) return; + if(!recievingPlayer.isConnected() || recievingPlayer.getServerName() == null) return; main.getPlatformMethods().sendPluginMessage( recievingPlayer, "status", From 68ab35192823a9fe8f4b5dcf874804866ca708b3 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Tue, 3 Jan 2023 11:39:56 -0700 Subject: [PATCH 19/21] Deploy to modrinth --- .github/workflows/prerelease.yml | 6 ++++-- .github/workflows/release.yml | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index ab8c93c..bf0c4f1 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -1,4 +1,4 @@ -name: Deploy Pre-Release to Polymart +name: Deploy Pre-Release to Polymart/Modrinth on: push: @@ -42,10 +42,12 @@ jobs: # The desired behavior if no files are found using the provided path. if-no-files-found: error retention-days: 2 - - name: Deploy to Polymart + - name: Deploy to Polymart/Modrinth env: POLYMART_TOKEN: ${{ secrets.POLYMART_TOKEN }} + MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} run: | export VERSION=`cat build.gradle.kts | grep "version " | awk -F'"' '{print $2}'` + curl --no-progress-meter -A "AJUPDATER/1.0" -H "Authorization: $MODRINTH_TOKEN" -F data="{\"project_id\": \"dzacATni\", \"version_number\": \"$VERSION\", \"name\": \"Pre-release v$VERSION\", \"changelog\": \"Note: This is a (most likely) un-tested build. It is not guarenteed to work.

Change since previous build:
${{ github.event.head_commit.message }}\", \"file_parts\": [\"file\"], \"version_type\": \"beta\", \"loaders\": [\"bungeecord\", \"velocity\"], \"featured\": false, \"game_versions\": $(curl https://ajg0702.us/pl/updater/mc-versions.php), \"dependencies\": [], \"primary_file\": \"file\"}" -F "file=@build/libs/ajLeaderboards-$VERSION.jar" "https://api.modrinth.com/v2/version" curl -F "file=@free/build/libs/ajQueue-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2535" -F version="$VERSION" -F title="Pre-release v$VERSION" -F beta=1 -F message=$'Note: This is a (most likely) un-tested build. It is not guarenteed to work!\n\nChange since previous build:\n[url=${{ github.event.compare }}"]${{ github.event.head_commit.message }}[/url]' "https://api.polymart.org/v1/postUpdate" curl -F "file=@premium/build/libs/ajQueuePlus-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2714" -F version="$VERSION" -F title="Pre-release v$VERSION" -F beta=1 -F message=$'Note: This is a (most likely) un-tested build. It is not guarenteed to work!\n\nChange since previous build:\n[url=${{ github.event.compare }}"]${{ github.event.head_commit.message }}[/url]' "https://api.polymart.org/v1/postUpdate" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8ec3367..e7d84ed 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Deploy Release to Polymart +name: Deploy Release to Polymart/Modrinth on: push: @@ -34,11 +34,16 @@ jobs: retention-days: 2 - name: Download changelogs run: | - curl "https://ajg0702.us/pl/updater/changelogs.php?project=${{ github.repository }}" > changelogs.bb - - name: Deploy to Polymart + curl "https://ajg0702.us/pl/updater/changelogs.php?project=${{ github.repository }}" > changelogs.bb + curl "https://ajg0702.us/pl/updater/changelogs.php?project=${{ github.repository }}&format=html" > changelogs.html + - name: Deploy to Polymart/Modrinth env: POLYMART_TOKEN: ${{ secrets.POLYMART_TOKEN }} + MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} + DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} run: | export VERSION=`cat build.gradle.kts | grep "version " | awk -F'"' '{print $2}'` + curl --no-progress-meter -A "AJUPDATER/1.0" -H "Authorization: $MODRINTH_TOKEN" -F data="{\"project_id\": \"dzacATni\", \"version_number\": \"$VERSION\", \"name\": \"v$VERSION\", \"changelog\": \"$(cat changelogs.html)\", \"file_parts\": [\"file\"], \"version_type\": \"release\", \"loaders\": [\"bungeecord\", \"velocity\"], \"featured\": true, \"game_versions\": $(curl https://ajg0702.us/pl/updater/mc-versions.php), \"dependencies\": [], \"primary_file\": \"file\"}" -F "file=@free/build/libs/ajQueue-$VERSION.jar" "https://api.modrinth.com/v2/version" curl -F "file=@free/build/libs/ajQueue-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2535" -F version="$VERSION" -F title="v$VERSION" -F message="$(cat changelogs.bb)" "https://api.polymart.org/v1/postUpdate" curl -F "file=@premium/build/libs/ajQueuePlus-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2714" -F version="$VERSION" -F title="v$VERSION" -F message="$(cat changelogs.bb)" "https://api.polymart.org/v1/postUpdate" + curl -v --no-progress-meter -H "Content-Type: application/json" --request POST -d "{\"content\": \"<@&861713403080999003>\", \"embeds\": [{\"title\": \"${{ github.event.repository.name }} v$VERSION\", \"description\": \"Changelogs\n\n$(curl "https://ajg0702.us/pl/updater/changelogs.php?project=${{ github.repository }}&format=markdown")\n\n[Modrinth (free)](https://modrinth.com/plugin/ajQueue/version/$VERSION)\n[Polymart (free)](https://polymart.org/resource/2535/updates)\n[Polymart (plus)](https://polymart.org/resource/2714/updates)\", \"color\": 14845503, \"thumbnail\": {\"url\": \"https://ajg0702.us/pl/icons/${{ github.event.repository.name }}.png\"}}]}" "$DISCORD_WEBHOOK" From e56c2d67fdf18bf3bfc709cc677132476aae3409 Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Tue, 3 Jan 2023 11:47:08 -0700 Subject: [PATCH 20/21] whoops --- .github/workflows/prerelease.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index bf0c4f1..344c30c 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -48,6 +48,6 @@ jobs: MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }} run: | export VERSION=`cat build.gradle.kts | grep "version " | awk -F'"' '{print $2}'` - curl --no-progress-meter -A "AJUPDATER/1.0" -H "Authorization: $MODRINTH_TOKEN" -F data="{\"project_id\": \"dzacATni\", \"version_number\": \"$VERSION\", \"name\": \"Pre-release v$VERSION\", \"changelog\": \"Note: This is a (most likely) un-tested build. It is not guarenteed to work.

Change since previous build:
${{ github.event.head_commit.message }}\", \"file_parts\": [\"file\"], \"version_type\": \"beta\", \"loaders\": [\"bungeecord\", \"velocity\"], \"featured\": false, \"game_versions\": $(curl https://ajg0702.us/pl/updater/mc-versions.php), \"dependencies\": [], \"primary_file\": \"file\"}" -F "file=@build/libs/ajLeaderboards-$VERSION.jar" "https://api.modrinth.com/v2/version" + curl --no-progress-meter -A "AJUPDATER/1.0" -H "Authorization: $MODRINTH_TOKEN" -F data="{\"project_id\": \"dzacATni\", \"version_number\": \"$VERSION\", \"name\": \"Pre-release v$VERSION\", \"changelog\": \"Note: This is a (most likely) un-tested build. It is not guarenteed to work.

Change since previous build:
${{ github.event.head_commit.message }}\", \"file_parts\": [\"file\"], \"version_type\": \"beta\", \"loaders\": [\"bungeecord\", \"velocity\"], \"featured\": false, \"game_versions\": $(curl https://ajg0702.us/pl/updater/mc-versions.php), \"dependencies\": [], \"primary_file\": \"file\"}" -F "file=@free/build/libs/ajQueue-$VERSION.jar" "https://api.modrinth.com/v2/version" curl -F "file=@free/build/libs/ajQueue-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2535" -F version="$VERSION" -F title="Pre-release v$VERSION" -F beta=1 -F message=$'Note: This is a (most likely) un-tested build. It is not guarenteed to work!\n\nChange since previous build:\n[url=${{ github.event.compare }}"]${{ github.event.head_commit.message }}[/url]' "https://api.polymart.org/v1/postUpdate" curl -F "file=@premium/build/libs/ajQueuePlus-$VERSION.jar" -F api_key=$POLYMART_TOKEN -F resource_id="2714" -F version="$VERSION" -F title="Pre-release v$VERSION" -F beta=1 -F message=$'Note: This is a (most likely) un-tested build. It is not guarenteed to work!\n\nChange since previous build:\n[url=${{ github.event.compare }}"]${{ github.event.head_commit.message }}[/url]' "https://api.polymart.org/v1/postUpdate" From 2de83c7383556670b0938b4b86b874bf846171ab Mon Sep 17 00:00:00 2001 From: ajgeiss0702 Date: Sun, 8 Jan 2023 11:02:01 -0700 Subject: [PATCH 21/21] [nolist] 2.3.0 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 73cc94a..8c96ca6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ repositories { } allprojects { - version = "2.2.9" + version = "2.3.0" group = "us.ajg0702" plugins.apply("java")