diff --git a/src/de/steamwar/bungeecore/commands/DevCommand.java b/src/de/steamwar/bungeecore/commands/DevCommand.java index 753fdc4..56a6bbf 100644 --- a/src/de/steamwar/bungeecore/commands/DevCommand.java +++ b/src/de/steamwar/bungeecore/commands/DevCommand.java @@ -21,6 +21,7 @@ package de.steamwar.bungeecore.commands; import de.steamwar.bungeecore.sql.Punishment; import de.steamwar.bungeecore.sql.SteamwarUser; +import de.steamwar.command.*; import de.steamwar.messages.ChatSender; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; @@ -34,76 +35,87 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; -public class DevCommand extends BasicCommand { +public class DevCommand extends SWCommand { private final File devServerDir = new File("/configs/DevServer"); private final Map devServers = new HashMap<>(); public DevCommand() { - super("dev", ""); + super("dev"); } - @Override - public void execute(CommandSender s, String[] args) { - if (!(s instanceof ProxiedPlayer)) - return; - ProxiedPlayer player = (ProxiedPlayer) s; - - ChatSender sender = ChatSender.of(player); - if (sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoDevServer)) { - return; - } - + @Register + public void simpleCommand(@Guard ProxiedPlayer player) { updateDevServers(); - if(devServers.isEmpty()) { + ChatSender sender = ChatSender.of(player); + if (devServers.isEmpty()) { sender.system("DEV_NO_SERVER"); + return; } else if (devServers.size() == 1) { player.connect(devServers.values().stream().findAny().get()); - } else if (args.length == 0) { - ServerInfo info = devServers.get(player.getName().toLowerCase()); - if (info == null) { - sender.system("DEV_UNKNOWN_SERVER"); - return; - } - - player.connect(info); - } else { - ServerInfo info = devServers.get(args[0].toLowerCase()); - if (info == null) { - sender.system("DEV_NO_SERVER"); - return; - } - - player.connect(info); + return; } + + ServerInfo info = devServers.get(player.getName().toLowerCase()); + if (info == null) { + sender.system("DEV_UNKNOWN_SERVER"); + return; + } + + player.connect(info); } - @Override - public Iterable onTabComplete(CommandSender sender, String[] args) { - if (!(sender instanceof ProxiedPlayer) || args.length > 1) { - return Collections.emptyList(); + @Register + public void selectedCommand(@Guard ProxiedPlayer player, @Mapper("dev") String name) { + updateDevServers(); + ChatSender sender = ChatSender.of(player); + ServerInfo info = devServers.get(name.toLowerCase()); + if (info == null) { + sender.system("DEV_NO_SERVER"); + return; } - updateDevServers(); - return devServers.keySet().stream().filter(s -> { - if (args.length == 0) return true; - return s.startsWith(args[0].toLowerCase()); - }).collect(Collectors.toList()); + player.connect(info); + } + + @ClassGuard(value = GuardChecker.class, local = true) + public GuardChecker punishmentGuardChecker() { + return (commandSender, guardCheckType, previousArguments, s) -> { + ChatSender sender = ChatSender.of(commandSender); + if (guardCheckType == GuardCheckType.COMMAND) { + if (sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoDevServer)) { + return GuardResult.DENIED; + } + } else { + if (sender.user().isPunished(Punishment.PunishmentType.NoDevServer)) { + return GuardResult.DENIED; + } + } + return GuardResult.ALLOWED; + }; + } + + @Mapper(value = "dev", local = true) + public TypeMapper devServers() { + return SWCommandUtils.createMapper(s -> s, s -> { + updateDevServers(); + return devServers.keySet(); + }); } private void updateDevServers() { String[] serverFiles = devServerDir.list(); Map devServerFiles = new HashMap<>(); - if(serverFiles != null) { - for(String serverFile : serverFiles) { + if (serverFiles != null) { + for (String serverFile : serverFiles) { String[] server = serverFile.split("\\."); devServerFiles.put(server[0], Integer.parseInt(server[1])); } } devServers.entrySet().removeIf(entry -> { - if(!devServerFiles.containsKey(entry.getKey())) { + if (!devServerFiles.containsKey(entry.getKey())) { ProxyServer.getInstance().getServers().remove(entry.getValue().getName()); return true; }