diff --git a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java index 9044e7e..c4fbc9a 100644 --- a/api/src/main/java/us/ajg0702/queue/api/QueueManager.java +++ b/api/src/main/java/us/ajg0702/queue/api/QueueManager.java @@ -117,6 +117,13 @@ public interface QueueManager { */ ImmutableList findPlayerInQueues(AdaptedPlayer p); + /** + * Finds QueuePlayers that have this username + * @param name The username to look up + * @return A list of QueuePlayers that have this username + */ + ImmutableList findPlayerInQueuesByName(String name); + /** * Gets all of the queues the player is currently queued for * @param p The player 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 c17b1d8..d80eb89 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 @@ -192,6 +192,12 @@ public interface QueueServer { */ boolean isGroup(); + /** + * Finds the player in this queue and returns the representative QueuePlayer + * @return The QueuePlayer representing the player, null if not found + */ + QueuePlayer findPlayer(String player); + /** * Finds the player in this queue and returns the representative QueuePlayer * @return The QueuePlayer representing the player, null if not found diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Kick.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Kick.java new file mode 100644 index 0000000..ceec116 --- /dev/null +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/Kick.java @@ -0,0 +1,95 @@ +package us.ajg0702.queue.commands.commands.manage; + +import com.google.common.collect.ImmutableList; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.spongepowered.configurate.ConfigurateException; +import us.ajg0702.queue.api.commands.ICommandSender; +import us.ajg0702.queue.api.players.QueuePlayer; +import us.ajg0702.queue.api.queues.QueueServer; +import us.ajg0702.queue.commands.SubCommand; +import us.ajg0702.queue.common.QueueMain; +import us.ajg0702.utils.common.Messages; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Kick extends SubCommand { + + final QueueMain main; + public Kick(QueueMain main) { + this.main = main; + } + + @Override + public String getName() { + return "kick"; + } + + @Override + public ImmutableList getAliases() { + return ImmutableList.of(); + } + + @Override + public String getPermission() { + return "ajqueue.manage.kick"; + } + + @Override + public Messages getMessages() { + return main.getMessages(); + } + + @Override + public void execute(ICommandSender sender, String[] args) { + if(!checkPermission(sender)) return; + + if(args.length < 1) { + sender.sendMessage(getMessages().getComponent("commands.kick.usage")); + return; + } + + List kickPlayers; + + if(args.length == 1) { + kickPlayers = main.getQueueManager().findPlayerInQueuesByName(args[0]); + } else { + QueueServer queue = main.getQueueManager().findServer(args[1]); + if(queue == null) { + sender.sendMessage(getMessages().getComponent("commands.kick.unknown-server", "QUEUE:"+args[1])); + return; + } + kickPlayers = Collections.singletonList(queue.findPlayer(args[0])); + } + + if(kickPlayers.size() == 0) { + sender.sendMessage(getMessages().getComponent("commands.kick.no-player", "PLAYER:"+args[0])); + return; + } + + for(QueuePlayer player : kickPlayers) { + player.getQueueServer().removePlayer(player); + } + + sender.sendMessage(getMessages().getComponent( + "commands.kick.success", + "PLAYER:"+args[0], + "NUM:"+kickPlayers.size(), + "s:"+ (kickPlayers.size() == 1 ? "" : "s") + )); + } + + @Override + public List autoComplete(ICommandSender sender, String[] args) { + if(args.length == 1) { + return main.getPlatformMethods().getPlayerNames(false); + } + if(args.length == 2) { + return main.getQueueManager().getServerNames(); + } + return new ArrayList<>(); + } +} + diff --git a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java index 0432b97..632c000 100644 --- a/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java +++ b/common/src/main/java/us/ajg0702/queue/commands/commands/manage/ManageCommand.java @@ -31,6 +31,7 @@ public class ManageCommand extends BaseCommand { addSubCommand(new PermissionList(main)); addSubCommand(new Whitelist(main)); addSubCommand(new Update(main)); + addSubCommand(new Kick(main)); } 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 d73b691..9837fc9 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -210,6 +210,10 @@ public class QueueMain extends AjQueueAPI { d.put("commands.leave-queue", "&aYou left the queue for {SERVER}!"); d.put("commands.reload", "&aConfig and messages reloaded successfully!"); d.put("commands.joinqueue.usage", "&cUsage: /joinqueue "); + d.put("commands.kick.usage", "Usage: /ajqueue kick [queue]"); + d.put("commands.kick.no-player", "&cCould not find {PLAYER}! Make sure they are in a queue!"); + d.put("commands.kick.unknown-server", "&cCould not find queue {QUEUE}. Make sure you spelled it correctly!"); + d.put("commands.kick.success", "Kicked {PLAYER} from {NUM} queue{s}!"); d.put("noperm", "&cYou do not have permission to do this!"); 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 e892b37..12881d4 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -523,7 +523,6 @@ public class QueueManagerImpl implements QueueManager { } for(QueueServer server : sendingServers) { - Debugger.debug("Sending players for "+server.getName()); for(QueuePlayer queuePlayer : server.getQueue()) { if(queuePlayer.getPlayer() != null) continue; if(main.getLogic().playerDisconnectedTooLong(queuePlayer)) { @@ -635,6 +634,18 @@ public class QueueManagerImpl implements QueueManager { return ImmutableList.copyOf(srs); } + @Override + public ImmutableList findPlayerInQueuesByName(String name) { + List srs = new ArrayList<>(); + for(QueueServer s : servers) { + QueuePlayer player = s.findPlayer(name); + if(player != null) { + srs.add(player); + } + } + return ImmutableList.copyOf(srs); + } + @Override public ImmutableList getPlayerQueues(AdaptedPlayer p) { List srs = new ArrayList<>(); 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 337a3c2..08f8a36 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 @@ -404,6 +404,15 @@ public class QueueServerImpl implements QueueServer { return servers.size() > 1; } + @Override + public QueuePlayer findPlayer(String player) { + for(QueuePlayer queuePlayer : queue) { + if(queuePlayer.getName().equalsIgnoreCase(player)) { + return queuePlayer; + } + } + return null; + } @Override public QueuePlayer findPlayer(AdaptedPlayer player) { return findPlayer(player.getUniqueId());