001    package org.bukkit.command.defaults;
002    
003    import com.google.common.collect.ImmutableList;
004    import org.apache.commons.lang.Validate;
005    import org.bukkit.Bukkit;
006    import org.bukkit.ChatColor;
007    import org.bukkit.Material;
008    import org.bukkit.command.Command;
009    import org.bukkit.command.CommandSender;
010    import org.bukkit.entity.Player;
011    import org.bukkit.util.StringUtil;
012    
013    import java.util.ArrayList;
014    import java.util.Collections;
015    import java.util.List;
016    
017    public class ClearCommand extends VanillaCommand {
018        private static List<String> materials;
019        static {
020            ArrayList<String> materialList = new ArrayList<String>();
021            for (Material material : Material.values()) {
022                materialList.add(material.name());
023            }
024            Collections.sort(materialList);
025            materials = ImmutableList.copyOf(materialList);
026        }
027    
028        public ClearCommand() {
029            super("clear");
030            this.description = "Clears the player's inventory. Can specify item and data filters too.";
031            this.usageMessage = "/clear <player> [item] [data]";
032            this.setPermission("bukkit.command.clear");
033        }
034    
035        @Override
036        public boolean execute(CommandSender sender, String currentAlias, String[] args) {
037            if (!testPermission(sender)) return true;
038    
039            Player player = null;
040            if (args.length > 0) {
041                player = Bukkit.getPlayer(args[0]);
042            } else if (sender instanceof Player) {
043                player = (Player) sender;
044            }
045    
046            if (player != null) {
047                int id;
048    
049                if (args.length > 1 && !(args[1].equals("-1"))) {
050                    Material material = Material.matchMaterial(args[1]);
051                    if (material == null) {
052                        sender.sendMessage(ChatColor.RED + "There's no item called " + args[1]);
053                        return false;
054                    }
055    
056                    id = material.getId();
057                } else {
058                    id = -1;
059                }
060    
061                int data = args.length >= 3 ? getInteger(sender, args[2], 0) : -1;
062                int count = player.getInventory().clear(id, data);
063    
064                Command.broadcastCommandMessage(sender, "Cleared the inventory of " + player.getDisplayName() + ", removing " + count + " items");
065            } else if (args.length == 0) {
066                sender.sendMessage(ChatColor.RED + "Please provide a player!");
067            } else {
068                sender.sendMessage(ChatColor.RED + "Can't find player " + args[0]);
069            }
070    
071            return true;
072        }
073    
074        @Override
075        public List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException {
076            Validate.notNull(sender, "Sender cannot be null");
077            Validate.notNull(args, "Arguments cannot be null");
078            Validate.notNull(alias, "Alias cannot be null");
079    
080            if (args.length == 1) {
081                return super.tabComplete(sender, alias, args);
082            }
083            if (args.length == 2) {
084                final String arg = args[1];
085                final List<String> materials = ClearCommand.materials;
086                List<String> completion = null;
087    
088                final int size = materials.size();
089                int i = Collections.binarySearch(materials, arg, String.CASE_INSENSITIVE_ORDER);
090    
091                if (i < 0) {
092                    // Insertion (start) index
093                    i = -1 - i;
094                }
095    
096                for ( ; i < size; i++) {
097                    String material = materials.get(i);
098                    if (StringUtil.startsWithIgnoreCase(material, arg)) {
099                        if (completion == null) {
100                            completion = new ArrayList<String>();
101                        }
102                        completion.add(material);
103                    } else {
104                        break;
105                    }
106                }
107    
108                if (completion != null) {
109                    return completion;
110                }
111            }
112            return ImmutableList.of();
113        }
114    }