Merge branch 'dev' into 'master'

2.1.0

See merge request ajg0702/ajqueue!31
This commit is contained in:
ajgeiss0702
2021-10-10 01:25:20 +00:00
15 changed files with 253 additions and 46 deletions
@@ -3,6 +3,7 @@ package us.ajg0702.queue.api.commands;
import net.kyori.adventure.audience.Audience;
import us.ajg0702.queue.api.util.Handle;
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public interface ICommandSender extends Handle, Audience {
boolean hasPermission(String permission);
boolean isPlayer();
@@ -0,0 +1,8 @@
package us.ajg0702.queue.api.queues;
import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.server.AdaptedServer;
public interface Balancer {
AdaptedServer getIdealServer(AdaptedPlayer player);
}
@@ -13,7 +13,7 @@ import java.util.UUID;
/**
* Represents a server or a group that can be queued for
*/
@SuppressWarnings("unused")
@SuppressWarnings({"unused", "BooleanMethodIsAlwaysInverted"})
public interface QueueServer {
/**
@@ -232,6 +232,19 @@ public interface QueueServer {
*/
void setSupportedProtocols(List<Integer> list);
/**
* Gets the balancer this server is using
* @return The balancer this server is using
*/
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);
/**
* elliot is bad
+1 -1
View File
@@ -12,7 +12,7 @@ repositories {
}
allprojects {
version = "2.0.10"
version = "2.1.0"
group = "us.ajg0702"
plugins.apply("java")
@@ -54,6 +54,7 @@ public class BaseCommand implements IBaseCommand {
sender.sendMessage(Component.text("Unimplemented command"));
}
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean checkPermission(ICommandSender sender) {
if(getPermission() != null && !sender.hasPermission(getPermission())) {
sender.sendMessage(getMessages().getComponent("noperm"));
@@ -33,6 +33,10 @@ public class EventHandlerImpl implements EventHandler {
try {
String subchannel = in.readUTF();
if(subchannel.equals("ack")) {
main.getPlatformMethods().sendPluginMessage(recievingPlayer, "ack", "yes, im here");
}
if(subchannel.equals("queue")) {
String rawData = in.readUTF();
String[] args = new String[1];
@@ -116,7 +116,9 @@ public class QueueManagerImpl implements QueueManager {
return false;
}
if(player.getServerName().equals(server.getName())) {
List<AdaptedServer> notInServers = new ArrayList<>(server.getServers());
notInServers.removeIf(adaptedServer -> !adaptedServer.getName().equals(player.getServerName()));
if(notInServers.size() > 0) {
player.sendMessage(msgs.getComponent("errors.already-connected", "SERVER:"+server.getAlias()));
return false;
}
@@ -528,11 +530,7 @@ public class QueueManagerImpl implements QueueManager {
AdaptedPlayer player = p.getPlayer();
if(player == null) continue;
boolean bypassFull =
p.getPlayer().hasPermission("ajqueue.joinfull") ||
p.getPlayer().hasPermission("ajqueue.joinfullserver."+server.getName());
if(server.isFull() && !bypassFull) continue;
if(server.isFull() && !server.canJoinFull(p.getPlayer())) continue;
AdaptedServer selected = server.getIdealServer(player);
if(selected == null) {
@@ -578,7 +576,7 @@ public class QueueManagerImpl implements QueueManager {
if(!server.canAccess(nextPlayer)) continue;
if(server.isFull() && !nextPlayer.hasPermission("ajqueue.joinfull")) continue;
if(server.isFull() && !server.canJoinFull(nextPlayer)) continue;
if(main.getConfig().getBoolean("enable-bypasspaused-permission")) {
if(server.isPaused() && !nextPlayer.hasPermission("ajqueue.bypasspaused")) continue;
@@ -1,13 +1,18 @@
package us.ajg0702.queue.common.queues;
import com.google.common.collect.ImmutableList;
import jdk.nashorn.internal.runtime.Debug;
import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.players.QueuePlayer;
import us.ajg0702.queue.api.queues.Balancer;
import us.ajg0702.queue.api.queues.QueueServer;
import us.ajg0702.queue.api.server.AdaptedServer;
import us.ajg0702.queue.api.server.AdaptedServerPing;
import us.ajg0702.queue.common.QueueMain;
import us.ajg0702.queue.common.players.QueuePlayerImpl;
import us.ajg0702.queue.common.queues.balancers.DefaultBalancer;
import us.ajg0702.queue.common.queues.balancers.MinigameBalancer;
import us.ajg0702.queue.common.utils.Debugger;
import us.ajg0702.utils.common.GenUtils;
import us.ajg0702.utils.common.Messages;
@@ -30,6 +35,32 @@ public class QueueServerImpl implements QueueServer {
this.servers = servers;
this.main = main;
List<String> types = main.getConfig().getStringList("balancer-types");
for(String type : types) {
int colon = type.indexOf(":");
if(colon == -1) continue;
String groupName = type.substring(0, colon);
String balancerType = type.substring(colon+1);
if(groupName.equals(name)) {
boolean valid = true;
switch(balancerType.toLowerCase(Locale.ROOT)) {
case "minigame":
balancer = new MinigameBalancer(this, main);
break;
default:
balancerType = "default";
balancer = new DefaultBalancer(this, main);
}
Debugger.debug("Using "+balancerType.toLowerCase(Locale.ROOT)+" balancer for "+name);
break;
}
}
if(balancer == null) {
balancer = new DefaultBalancer(this, main);
Debugger.debug("Using default balancer for "+name);
}
for(QueuePlayer queuePlayer : previousPlayers) {
if(queuePlayer.getPlayer() == null) {
addPlayer(
@@ -64,6 +95,8 @@ public class QueueServerImpl implements QueueServer {
private List<Integer> supportedProtocols = new ArrayList<>();
private Balancer balancer;
private int playerCount;
private int maxPlayers;
@@ -111,7 +144,7 @@ public class QueueServerImpl implements QueueServer {
return msgs.getString("status.offline.whitelisted");
}
if(isFull()) {
if(isFull() && !canJoinFull(p)) {
return msgs.getString("status.offline.full");
}
@@ -253,12 +286,16 @@ public class QueueServerImpl implements QueueServer {
@Override
public boolean isJoinable(AdaptedPlayer p) {
if(p != null && isWhitelisted() && !whitelistedUUIDs.contains(p.getUniqueId())) {
return false;
if(p != null) {
if (isWhitelisted() && !whitelistedUUIDs.contains(p.getUniqueId())) {
return false;
}
if (isFull() && !canJoinFull(p)) {
return false;
}
}
return isOnline() &&
canAccess(p) &&
!isFull() &&
!isPaused();
}
@@ -290,6 +327,7 @@ public class QueueServerImpl implements QueueServer {
@Override
public boolean isFull() {
if(!isOnline()) return false;
return playerCount >= maxPlayers;
}
@@ -382,36 +420,8 @@ public class QueueServerImpl implements QueueServer {
@Override
public AdaptedServer getIdealServer(AdaptedPlayer player) {
HashMap<AdaptedServer, AdaptedServerPing> serverInfos = pings;
AdaptedServer selected = null;
int selectednum = 0;
if(serverInfos.keySet().size() == 1) {
selected = serverInfos.keySet().iterator().next();
} else {
for(AdaptedServer si : serverInfos.keySet()) {
AdaptedServerPing sp = serverInfos.get(si);
if(sp == null) continue;
int online = sp.getPlayerCount();
if(selected == null) {
selected = si;
selectednum = online;
continue;
}
if(selectednum > online && main.getQueueManager().findServer(si.getName()).isJoinable(player)) {
selected = si;
selectednum = online;
}
}
}
if(selected == null && serverInfos.size() > 0) {
selected = serverInfos.keySet().iterator().next();
}
if(selected == null) {
main.getLogger().warning("Unable to find ideal server, using random server from group.");
int r = GenUtils.randomInt(0, getServers().size()-1);
selected = getServers().get(r);
}
return selected;
Debugger.debug(getBalancer().toString());
return getBalancer().getIdealServer(player);
}
@Override
@@ -428,4 +438,19 @@ public class QueueServerImpl implements QueueServer {
public void setSupportedProtocols(List<Integer> list) {
supportedProtocols = new ArrayList<>(list);
}
@Override
public Balancer getBalancer() {
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");
}
}
@@ -0,0 +1,55 @@
package us.ajg0702.queue.common.queues.balancers;
import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.queues.Balancer;
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.utils.common.GenUtils;
import java.util.HashMap;
public class DefaultBalancer implements Balancer {
private final QueueServer server;
private final QueueMain main;
public DefaultBalancer(QueueServer server, QueueMain main) {
this.server = server;
this.main = main;
}
@Override
public AdaptedServer getIdealServer(AdaptedPlayer player) {
HashMap<AdaptedServer, AdaptedServerPing> serverInfos = server.getLastPings();
AdaptedServer selected = null;
int selectednum = 0;
if(serverInfos.keySet().size() == 1) {
selected = serverInfos.keySet().iterator().next();
} else {
for(AdaptedServer si : serverInfos.keySet()) {
AdaptedServerPing sp = serverInfos.get(si);
if(sp == null) continue;
int online = sp.getPlayerCount();
if(selected == null) {
selected = si;
selectednum = online;
continue;
}
if(selectednum > online && main.getQueueManager().findServer(si.getName()).isJoinable(player)) {
selected = si;
selectednum = online;
}
}
}
if(selected == null && serverInfos.size() > 0) {
selected = serverInfos.keySet().iterator().next();
}
if(selected == null) {
main.getLogger().warning("Unable to find ideal server, using random server from group.");
int r = GenUtils.randomInt(0, server.getServers().size()-1);
selected = server.getServers().get(r);
}
return selected;
}
}
@@ -0,0 +1,53 @@
package us.ajg0702.queue.common.queues.balancers;
import us.ajg0702.queue.api.players.AdaptedPlayer;
import us.ajg0702.queue.api.queues.Balancer;
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 java.util.*;
public class MinigameBalancer implements Balancer {
private final QueueServer server;
private final QueueMain main;
public MinigameBalancer(QueueServer server, QueueMain main) {
this.server = server;
this.main = main;
}
@Override
public AdaptedServer getIdealServer(AdaptedPlayer player) {
HashMap<AdaptedServer, AdaptedServerPing> serverInfos = server.getLastPings();
if(serverInfos.keySet().size() == 1) {
return serverInfos.keySet().iterator().next();
} else {
List<Map.Entry<AdaptedServer, AdaptedServerPing>> servers = new ArrayList<>(serverInfos.entrySet());
servers.sort(Comparator.comparingInt(o -> {
@SuppressWarnings("unchecked")
Map.Entry<AdaptedServer, AdaptedServerPing> e = (Map.Entry<AdaptedServer, AdaptedServerPing>) o;
AdaptedServerPing value = e.getValue();
if(value == null) return -1;
return value.getPlayerCount();
}).reversed());
LinkedHashMap<AdaptedServer, AdaptedServerPing> sortedServers = new LinkedHashMap<>();
for(Map.Entry<AdaptedServer, AdaptedServerPing> entry : servers) {
sortedServers.put(entry.getKey(), entry.getValue());
}
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) {
return si;
}
}
return new ArrayList<AdaptedServer>(sortedServers.keySet().size()).get(sortedServers.keySet().size()-1);
}
}
}
@@ -0,0 +1,11 @@
package us.ajg0702.queue.common.utils;
import us.ajg0702.queue.api.AjQueueAPI;
public class Debugger {
public static void debug(String message) {
AjQueueAPI api = AjQueueAPI.getInstance();
if(!api.getConfig().getBoolean("debug")) return;
api.getLogger().info("[debug] "+message);
}
}
+14 -1
View File
@@ -1,5 +1,5 @@
# Dont touch this number please
config-version: 29
config-version: 30
# This is the main config for ajQueue.
@@ -268,3 +268,16 @@ enable-updater: true
# then they will be put in the queue for survival
# This works for both servers and groups
slash-servers: []
# What balancer should we use?
# If a group is not specified here, then the default one is used
# Example entry: - "bedwars:minigame"
# Balancers:
# default - Will send the player to the server in the group with the least number of players
# minigame - Will send the player to the server with the most players, until that server is full, which it will then send to the next server
balancer-types:
- "bedwars:minigame"
# Should we print some extra stuff to the console that might help diagnose some issues?
debug: false
@@ -39,6 +39,8 @@ 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.joinfullandbypass") ||
permissionGetter.hasContextBypass(player, server.getName())
) {
if(debug) {
@@ -17,6 +17,10 @@ public class Commands implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if(!pl.hasProxy()) {
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;
}
Player player = null;
if(sender instanceof Player) {
player = (Player) sender;
@@ -9,6 +9,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.server.ServerListPingEvent;
import org.bukkit.plugin.java.JavaPlugin;
@@ -27,6 +28,8 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List
ConfigFile config;
boolean hasProxy = false;
@SuppressWarnings("ConstantConditions")
public void onEnable() {
getServer().getMessenger().registerIncomingPluginChannel(this, "ajqueue:tospigot", this);
@@ -75,6 +78,10 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List
getLogger().info("Spigot side enabled! v"+getDescription().getVersion());
}
public boolean hasProxy() {
return hasProxy;
}
final HashMap<Player, String> queuebatch = new HashMap<>();
@Override
@@ -85,6 +92,10 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List
String subchannel = in.readUTF();
if(subchannel.equals("ack")) {
hasProxy = true;
}
if(subchannel.equals("inqueueevent")) {
String playername = in.readUTF();
Player p = Bukkit.getPlayer(playername);
@@ -180,6 +191,14 @@ public class SpigotMain extends JavaPlugin implements PluginMessageListener,List
placeholders.cleanCache();
}
@EventHandler
public void onJoin(PlayerJoinEvent e) {
if(hasProxy) return;
Bukkit.getScheduler().runTask(this, () -> {
sendMessage(e.getPlayer(), "ack", "");
});
}
@EventHandler(priority = EventPriority.HIGH)
public void onServerPing(ServerListPingEvent e) {
if(!config.getBoolean("take-over-motd-for-whitelist")) return;