001 package org.bukkit.command.defaults;
002
003 import java.util.ArrayList;
004 import java.util.List;
005
006 import org.apache.commons.lang.Validate;
007 import org.bukkit.Bukkit;
008 import org.bukkit.ChatColor;
009 import org.bukkit.OfflinePlayer;
010 import org.bukkit.command.Command;
011 import org.bukkit.command.CommandSender;
012 import org.bukkit.util.StringUtil;
013
014 import com.google.common.collect.ImmutableList;
015
016 public class WhitelistCommand extends VanillaCommand {
017 private static final List<String> WHITELIST_SUBCOMMANDS = ImmutableList.of("add", "remove", "on", "off", "list", "reload");
018
019 public WhitelistCommand() {
020 super("whitelist");
021 this.description = "Manages the list of players allowed to use this server";
022 this.usageMessage = "/whitelist (add|remove) <player>\n/whitelist (on|off|list|reload)";
023 this.setPermission("bukkit.command.whitelist.reload;bukkit.command.whitelist.enable;bukkit.command.whitelist.disable;bukkit.command.whitelist.list;bukkit.command.whitelist.add;bukkit.command.whitelist.remove");
024 }
025
026 @Override
027 public boolean execute(CommandSender sender, String currentAlias, String[] args) {
028 if (!testPermission(sender)) return true;
029
030 if (args.length == 1) {
031 if (args[0].equalsIgnoreCase("reload")) {
032 if (badPerm(sender, "reload")) return true;
033
034 Bukkit.reloadWhitelist();
035 Command.broadcastCommandMessage(sender, "Reloaded white-list from file");
036 return true;
037 } else if (args[0].equalsIgnoreCase("on")) {
038 if (badPerm(sender, "enable")) return true;
039
040 Bukkit.setWhitelist(true);
041 Command.broadcastCommandMessage(sender, "Turned on white-listing");
042 return true;
043 } else if (args[0].equalsIgnoreCase("off")) {
044 if (badPerm(sender, "disable")) return true;
045
046 Bukkit.setWhitelist(false);
047 Command.broadcastCommandMessage(sender, "Turned off white-listing");
048 return true;
049 } else if (args[0].equalsIgnoreCase("list")) {
050 if (badPerm(sender, "list")) return true;
051
052 StringBuilder result = new StringBuilder();
053
054 for (OfflinePlayer player : Bukkit.getWhitelistedPlayers()) {
055 if (result.length() > 0) {
056 result.append(", ");
057 }
058
059 result.append(player.getName());
060 }
061
062 sender.sendMessage("White-listed players: " + result.toString());
063 return true;
064 }
065 } else if (args.length == 2) {
066 if (args[0].equalsIgnoreCase("add")) {
067 if (badPerm(sender, "add")) return true;
068
069 Bukkit.getOfflinePlayer(args[1]).setWhitelisted(true);
070
071 Command.broadcastCommandMessage(sender, "Added " + args[1] + " to white-list");
072 return true;
073 } else if (args[0].equalsIgnoreCase("remove")) {
074 if (badPerm(sender, "remove")) return true;
075
076 Bukkit.getOfflinePlayer(args[1]).setWhitelisted(false);
077
078 Command.broadcastCommandMessage(sender, "Removed " + args[1] + " from white-list");
079 return true;
080 }
081 }
082
083 sender.sendMessage(ChatColor.RED + "Correct command usage:\n" + usageMessage);
084 return false;
085 }
086
087 private boolean badPerm(CommandSender sender, String perm) {
088 if (!sender.hasPermission("bukkit.command.whitelist." + perm)) {
089 sender.sendMessage(ChatColor.RED + "You do not have permission to perform this action.");
090 return true;
091 }
092
093 return false;
094 }
095
096 @Override
097 public List<String> tabComplete(CommandSender sender, String alias, String[] args) {
098 Validate.notNull(sender, "Sender cannot be null");
099 Validate.notNull(args, "Arguments cannot be null");
100 Validate.notNull(alias, "Alias cannot be null");
101
102 if (args.length == 1) {
103 return StringUtil.copyPartialMatches(args[0], WHITELIST_SUBCOMMANDS, new ArrayList<String>(WHITELIST_SUBCOMMANDS.size()));
104 } else if (args.length == 2) {
105 if (args[0].equalsIgnoreCase("add")) {
106 List<String> completions = new ArrayList<String>();
107 for (OfflinePlayer player : Bukkit.getOfflinePlayers()) {
108 String name = player.getName();
109 if (StringUtil.startsWithIgnoreCase(name, args[1]) && !player.isWhitelisted()) {
110 completions.add(name);
111 }
112 }
113 return completions;
114 } else if (args[0].equalsIgnoreCase("remove")) {
115 List<String> completions = new ArrayList<String>();
116 for (OfflinePlayer player : Bukkit.getWhitelistedPlayers()) {
117 String name = player.getName();
118 if (StringUtil.startsWithIgnoreCase(name, args[1])) {
119 completions.add(name);
120 }
121 }
122 return completions;
123 }
124 }
125 return ImmutableList.of();
126 }
127 }