diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml
index 2c525da..344c30c 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:
@@ -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
@@ -39,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}'`
- file free/build/libs/ajQueue-$VERSION.jar
+ 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"
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index ee2c511..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:
@@ -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
@@ -33,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}'`
- file free/build/libs/ajQueue-$VERSION.jar
+ 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"
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/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/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 extends AdaptedServer> 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/build.gradle.kts b/build.gradle.kts
index 4cd58f0..8c96ca6 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -5,14 +5,14 @@ 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()
}
allprojects {
- version = "2.2.9"
+ version = "2.3.0"
group = "us.ajg0702"
plugins.apply("java")
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/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);
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/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/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",
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/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java
index 2da51d1..ca5395c 100644
--- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java
+++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java
@@ -37,10 +37,10 @@ public class QueueManagerImpl implements QueueManager {
public List buildServers() {
List result = new ArrayList<>();
- List servers = main.getPlatformMethods().getServers();
+ List extends AdaptedServer> 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());
@@ -49,13 +49,58 @@ 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);
}
+ 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(":");
@@ -76,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;
@@ -99,13 +151,13 @@ public class QueueManagerImpl implements QueueManager {
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())) {
- player.sendMessage(msgs.getComponent("errors.deny-joining-from-server"));
+ 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());
+
int playerVersion = player.getProtocolVersion();
List supportedProtocols = server.getSupportedProtocols();
if(!supportedProtocols.contains(playerVersion) && supportedProtocols.size() > 0) {
@@ -157,12 +209,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(
@@ -189,11 +242,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",
@@ -285,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(servers.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
@@ -344,7 +346,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();
@@ -356,6 +357,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;
@@ -507,8 +510,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();
@@ -517,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)) {
@@ -551,22 +558,26 @@ 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()) {
+ 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()) {
+
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);
}
@@ -601,11 +612,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;
@@ -643,17 +660,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..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
@@ -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 && sv.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..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
@@ -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();
- if(online < max) {
+ for(AdaptedServer si : svs) {
+ if(!si.isOnline()) continue;
+ int online = si.getPlayerCount();
+ int max = si.getMaxPlayers();
+ if(online < max && si.isJoinable(player)) {
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/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.
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/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..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
@@ -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 extends AdaptedServer> 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 extends AdaptedServer> 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));
+ }
- 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..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
@@ -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..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
@@ -2,20 +2,30 @@ 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.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;
+
+ private AdaptedServerPing lastPing = null;
+ private AdaptedServerPing lastSuccessfullPing = null;
+ private long lastOffline;
+
+ private int offlineTime = 0;
public BungeeServer(ServerInfo handle) {
this.handle = handle;
@@ -33,19 +43,50 @@ 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) {
- future.completeExceptionally(error);
- return;
+ markOffline(debug, logger, future, sent, error);
}
- 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;
}
+ 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);
+ }
+
@Override
public boolean canAccess(AdaptedPlayer player) {
return handle.canAccess((ProxiedPlayer) player.getHandle());
@@ -58,8 +99,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") ||
+ (AjQueueAPI.getInstance().isPremium() && AjQueueAPI.getInstance().getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName()))
+ ;
+ }
+
+ @Override
+ public boolean justWentOnline() {
+ return System.currentTimeMillis()-lastOffline <= (AjQueueAPI.getInstance().getConfig().getDouble("wait-time") * 2 * 1000) && 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/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/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..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
@@ -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 extends AdaptedServer> 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 extends AdaptedServer> 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));
+ }
+
+ 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..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
@@ -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/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 dd316a0..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
@@ -3,19 +3,31 @@ 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.utils.Debug;
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;
+
+ private AdaptedServerPing lastPing = null;
+ private AdaptedServerPing lastSuccessfullPing = null;
+ private long lastOffline = 0;
+
+ private int offlineTime = 0;
+
public VelocityServer(RegisteredServer handle) {
this.handle = handle;
}
@@ -31,22 +43,57 @@ 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) {
- future.completeExceptionally(e);
+ markOffline(debug, logger, future, sent, 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;
+ }).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);
+ }
+
@Override
public boolean canAccess(AdaptedPlayer player) {
return true;
@@ -61,8 +108,44 @@ public class VelocityServer implements AdaptedServer {
return players;
}
+ @Override
+ public int getOfflineTime() {
+ return offlineTime;
+ }
+
+ @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") ||
+ (AjQueueAPI.getInstance().isPremium() && AjQueueAPI.getInstance().getLogic().getPermissionGetter().hasUniqueFullBypass(player, getName()))
+ ;
+ }
+
+ @Override
+ public boolean justWentOnline() {
+ return System.currentTimeMillis()-lastOffline <= (AjQueueAPI.getInstance().getConfig().getDouble("wait-time") * 2 * 1000) && 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/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/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;
}
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()
}
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;
+ }
}