001    package org.bukkit.command.defaults;
002    
003    import java.util.ArrayList;
004    import java.util.Arrays;
005    import java.util.List;
006    
007    import org.apache.commons.lang.Validate;
008    import org.bukkit.Bukkit;
009    import org.bukkit.ChatColor;
010    import org.bukkit.command.CommandSender;
011    import org.bukkit.plugin.Plugin;
012    import org.bukkit.plugin.PluginDescriptionFile;
013    import org.bukkit.util.StringUtil;
014    
015    import com.google.common.collect.ImmutableList;
016    
017    public class VersionCommand extends BukkitCommand {
018        public VersionCommand(String name) {
019            super(name);
020    
021            this.description = "Gets the version of this server including any plugins in use";
022            this.usageMessage = "/version [plugin name]";
023            this.setPermission("bukkit.command.version");
024            this.setAliases(Arrays.asList("ver", "about"));
025        }
026    
027        @Override
028        public boolean execute(CommandSender sender, String currentAlias, String[] args) {
029            if (!testPermission(sender)) return true;
030    
031            if (args.length == 0) {
032                sender.sendMessage("This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")");
033            } else {
034                StringBuilder name = new StringBuilder();
035    
036                for (String arg : args) {
037                    if (name.length() > 0) {
038                        name.append(' ');
039                    }
040    
041                    name.append(arg);
042                }
043    
044                String pluginName = name.toString();
045                Plugin exactPlugin = Bukkit.getPluginManager().getPlugin(pluginName);
046                if (exactPlugin != null) {
047                    describeToSender(exactPlugin, sender);
048                    return true;
049                }
050    
051                boolean found = false;
052                pluginName = pluginName.toLowerCase();
053                for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
054                    if (plugin.getName().toLowerCase().contains(pluginName)) {
055                        describeToSender(plugin, sender);
056                        found = true;
057                    }
058                }
059    
060                if (!found) {
061                    sender.sendMessage("This server is not running any plugin by that name.");
062                    sender.sendMessage("Use /plugins to get a list of plugins.");
063                }
064            }
065            return true;
066        }
067    
068        private void describeToSender(Plugin plugin, CommandSender sender) {
069            PluginDescriptionFile desc = plugin.getDescription();
070            sender.sendMessage(ChatColor.GREEN + desc.getName() + ChatColor.WHITE + " version " + ChatColor.GREEN + desc.getVersion());
071    
072            if (desc.getDescription() != null) {
073                sender.sendMessage(desc.getDescription());
074            }
075    
076            if (desc.getWebsite() != null) {
077                sender.sendMessage("Website: " + ChatColor.GREEN + desc.getWebsite());
078            }
079    
080            if (!desc.getAuthors().isEmpty()) {
081                if (desc.getAuthors().size() == 1) {
082                    sender.sendMessage("Author: " + getAuthors(desc));
083                } else {
084                    sender.sendMessage("Authors: " + getAuthors(desc));
085                }
086            }
087        }
088    
089        private String getAuthors(final PluginDescriptionFile desc) {
090            StringBuilder result = new StringBuilder();
091            List<String> authors = desc.getAuthors();
092    
093            for (int i = 0; i < authors.size(); i++) {
094                if (result.length() > 0) {
095                    result.append(ChatColor.WHITE);
096    
097                    if (i < authors.size() - 1) {
098                        result.append(", ");
099                    } else {
100                        result.append(" and ");
101                    }
102                }
103    
104                result.append(ChatColor.GREEN);
105                result.append(authors.get(i));
106            }
107    
108            return result.toString();
109        }
110    
111        @Override
112        public List<String> tabComplete(CommandSender sender, String alias, String[] args) {
113            Validate.notNull(sender, "Sender cannot be null");
114            Validate.notNull(args, "Arguments cannot be null");
115            Validate.notNull(alias, "Alias cannot be null");
116    
117            if (args.length == 1) {
118                List<String> completions = new ArrayList<String>();
119                String toComplete = args[0].toLowerCase();
120                for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
121                    if (StringUtil.startsWithIgnoreCase(plugin.getName(), toComplete)) {
122                        completions.add(plugin.getName());
123                    }
124                }
125                return completions;
126            }
127            return ImmutableList.of();
128        }
129    }