001    import java.util.LinkedHashMap;
002    import java.util.logging.Logger;
003    
004    public class ServerConsoleCommands {
005        private static final Logger log = Logger.getLogger("Minecraft");
006        private static ServerConsoleCommands instance;
007        private final LinkedHashMap<String, BaseCommand> commands = new LinkedHashMap<String, BaseCommand>();
008        
009        private ServerConsoleCommands() {
010            add("reload",        reload);
011            add("listplugins",   listplugins);
012            add("enableplugin",  enableplugin);
013            add("reloadplugin",  reloadplugin);
014            add("disableplugin", disableplugin);
015            add("modify",        modify);
016            add("mp",            modify);       
017            add("reservelist",   reservelist);
018            add("whitelist",     whitelist);
019            add("version",       version);
020        }
021        
022        /**
023         * Add a command to the server list.
024         * @param name
025         * @param cmd 
026         */
027        public void add(String name, BaseCommand cmd) {
028            if (name != null && cmd != null) {
029                commands.put(name, cmd);
030            }
031        }
032        
033        /**
034         * Remove a command from the server list.
035         * @param name
036         */
037        public void remove(String name) {
038            if (name != null) {
039                etc.getInstance().removeCommand(name);
040                commands.remove(name);
041            }
042        }
043        
044        /**
045         * Performs a lookup for a command of the given name and executes it if found. Returns false if command not found.
046         * @param command
047         * @param player
048         * @param parameters
049         * @return
050         */
051        public static boolean parseServerConsoleCommand(MessageReceiver caller, String command, String[] args) {
052            if (instance == null) {
053                instance = new ServerConsoleCommands();
054            }
055            
056            BaseCommand cmd = instance.getCommand(command);
057            if (cmd != null) {
058                cmd.parseCommand(caller, args);
059                // Inform caller a matching command was found.
060                return true; 
061            }
062            return false;
063        }
064        
065        public BaseCommand getCommand(String command) {
066            return commands.get(command);
067        }
068        
069        public static final BaseCommand reload = new BaseCommand("- Reloads hMod") {
070            @Override
071            void execute(MessageReceiver caller, String[] parameters) {
072                etc.getInstance().load();
073                etc.getInstance().loadData();
074                for (Player p : etc.getServer().getPlayerList()) {
075                    p.getUser().reloadPlayer();
076                }
077                log.info("hMod reloaded by " + caller.getName());
078                caller.notify("Successfully reloaded config");
079            }
080        };
081        
082        public static final BaseCommand modify = new BaseCommand("[player] [key] [value] - Type /modify for more info", "Overriden onBadSyntax", 3) {      
083            
084            @Override
085            void execute(MessageReceiver caller, String[] parameters) {
086                if (parameters.length > 2 && parameters[2].contains(":")) {
087                    for (int i = 3; i < parameters.length; i++) {
088                        if (!parameters[i].contains(":")) {
089                            onBadSyntax(caller, null);
090                            return;
091                        }
092                    }
093    
094                    Player player = etc.getServer().matchPlayer(parameters[1]);
095    
096                    if (player == null) {
097                        caller.notify("Player does not exist.");
098                        return;
099                    }
100    
101                    for (int i = 2; i < parameters.length; i++) {
102                        if (parameters[i].split(":").length != 2) {
103                            caller.notify("This key:value pair is deformed... " + parameters[i]);
104                            return;
105                        }
106                        String key = parameters[i].split(":")[0];
107                        String value = parameters[i].split(":")[1];
108                        boolean newUser = false;
109    
110                        if (!etc.getDataSource().doesPlayerExist(player.getName())) {
111                            if (!key.equalsIgnoreCase("groups") && !key.equalsIgnoreCase("g")) {
112                                caller.notify("When adding a new user, set their group(s) first.");
113                                return;
114                            }
115                            caller.notify("Adding new user.");
116                            newUser = true;
117                            player.setCanModifyWorld(true);
118                        }
119    
120                        updatePlayerValues(player, key, value);
121                        saveChanges(player, newUser);
122    
123                        log.info("Modifed user " + parameters[1] + ". " + key + " => " + value + " by " + caller.getName());
124                    }
125                    caller.notify("Modified user.");
126                } else {
127                    if (parameters.length < 4) {
128                        onBadSyntax(caller, null);
129                        return;
130                    }
131    
132                    Player player = etc.getServer().matchPlayer(parameters[1]);
133    
134                    if (player == null) {
135                        caller.notify("Player does not exist.");
136                        return;
137                    }
138    
139                    String key = parameters[2];
140                    String value = parameters[3];
141                    boolean newUser = false;
142    
143                    if (!etc.getDataSource().doesPlayerExist(player.getName())) {
144                        if (!key.equalsIgnoreCase("groups") && !key.equalsIgnoreCase("g")) {
145                            caller.notify("When adding a new user, set their group(s) first.");
146                            return;
147                        }
148                        caller.notify("Adding new user.");
149                        newUser = true;
150                    }
151    
152                    updatePlayerValues(player, key, value);
153                    saveChanges(player, newUser);
154                    
155                    caller.notify("Modified user.");
156                    // Send to server log too, regardless of caller.
157                    log.info("Modifed user " + parameters[1] + ". " + key + " => " + value + " by " + caller.getName());
158                }
159            }
160    
161            private void saveChanges(Player player, boolean newUser) {
162                if (newUser) {
163                    etc.getDataSource().addPlayer(player);
164                } else {
165                    etc.getDataSource().modifyPlayer(player);
166                }
167            }
168    
169            private void updatePlayerValues(Player player, String key, String value) {
170                if (key.equalsIgnoreCase("prefix") || key.equalsIgnoreCase("p")) {
171                    player.setPrefix(value);
172                } else if (key.equalsIgnoreCase("commands") || key.equalsIgnoreCase("c")) {
173                    player.setCommands(value.split(","));
174                } else if (key.equalsIgnoreCase("groups") || key.equalsIgnoreCase("g")) {
175                    player.setGroups(value.split(","));
176                } else if (key.equalsIgnoreCase("ignoresrestrictions") || key.equalsIgnoreCase("ir")) {
177                    player.setIgnoreRestrictions(value.equalsIgnoreCase("true") || value.equals("1"));
178                } else if (key.equalsIgnoreCase("admin") || key.equalsIgnoreCase("a")) {
179                    player.setAdmin(value.equalsIgnoreCase("true") || value.equals("1"));
180                } else if (key.equalsIgnoreCase("modworld") || key.equalsIgnoreCase("mw")) {
181                    player.setCanModifyWorld(value.equalsIgnoreCase("true") || value.equals("1"));
182                }
183            }
184    
185            @Override
186            public void onBadSyntax(MessageReceiver caller, String[] params) {
187                caller.notify("Usage is: /modify [player] [key] [value]");
188                caller.notify("Keys:");
189                caller.notify("prefix: only the letter the color represents");
190                caller.notify("commands: list seperated by comma");
191                caller.notify("groups: list seperated by comma");
192                caller.notify("ignoresrestrictions: true or false");
193                caller.notify("admin: true or false");
194                caller.notify("modworld: true or false");
195            }
196        };
197        
198        public final static BaseCommand whitelist = new BaseCommand("[operation (add or remove)] [player]", "whitelist [operation (toggle, add or remove)] <player>", 2) {
199            @Override
200            void execute(MessageReceiver caller, String[] parameters) {    
201                if (parameters[1].equalsIgnoreCase("toggle")) {
202                    caller.notify((etc.getInstance().toggleWhitelist() ? "Whitelist enabled" : "Whitelist disabled"));
203                } else if (parameters.length == 3) {
204                    if (parameters[1].equalsIgnoreCase("add")) {
205                        etc.getDataSource().addToWhitelist(parameters[2]);
206                        caller.notify(parameters[2] + " added to whitelist");
207                    } else if (parameters[1].equalsIgnoreCase("remove")) {
208                        etc.getDataSource().removeFromWhitelist(parameters[2]);
209                        caller.notify(parameters[2] + " removed from whitelist");
210                    } else {
211                        caller.notify("Invalid operation.");
212                    }
213                } else {
214                    caller.notify("Invalid operation.");
215                }
216            }
217        };
218        
219        public final static BaseCommand reservelist = new BaseCommand("[operation (add or remove)] [player]","reservelist [operation (add or remove)] [player]",3,3) {
220            @Override
221            void execute(MessageReceiver caller, String[] parameters) {
222                if (parameters[1].equalsIgnoreCase("add")) {
223                    etc.getDataSource().addToReserveList(parameters[2]);
224                    caller.notify(parameters[2] + " added to reservelist");
225                } else if (parameters[1].equalsIgnoreCase("remove")) {
226                    etc.getDataSource().removeFromReserveList(parameters[2]);
227                    caller.notify(parameters[2] + " removed from reservelist");
228                } else {
229                    caller.notify("Invalid operation.");
230                }
231            }
232        };
233        
234        public final static BaseCommand listplugins = new BaseCommand("- Lists all plugins") {
235            @Override        
236            void execute(MessageReceiver caller, String[] parameters) {
237                caller.notify("Plugins" + Colors.White + ": " + etc.getLoader().getPluginList());
238            }
239        };
240        
241        public final static BaseCommand reloadplugin = new BaseCommand("[plugin] - Reloads plugin", "Correct usage is: /reloadplugin [plugin]", 2) {
242            @Override        
243            void execute(MessageReceiver caller, String[] parameters) {  
244                if (etc.getLoader().reloadPlugin(parameters[1])) {
245                    caller.notify("Plugin reloaded.");
246                } else {
247                    caller.notify("Unable to reload plugin. Check capitalization and/or server logfile.");
248                }
249            }
250        };
251        
252        public final static BaseCommand enableplugin = new BaseCommand("[plugin] - Enables plugin", "Correct usage is: /enableplugin [plugin]", 2) {
253            @Override        
254            void execute(MessageReceiver caller, String[] parameters) {
255                if (etc.getLoader().enablePlugin(parameters[1])) {
256                    caller.notify("Plugin enabled.");
257                } else {
258                    caller.notify("Unable to enable plugin. Check capitalization and/or server logfile.");
259                }
260            }
261        };
262        
263        public final static BaseCommand disableplugin = new BaseCommand("[plugin] - Disables plugin", "Correct usage is: /disableplugin [plugin]", 2) {
264            @Override        
265            void execute(MessageReceiver caller, String[] parameters) {
266                etc.getLoader().disablePlugin(parameters[1]);
267                caller.notify("Plugin disabled.");
268            }
269        };
270        
271        public final static BaseCommand version = new BaseCommand("- Displays the server version") {
272            @Override        
273            void execute(MessageReceiver caller, String[] parameters) {
274                if (!etc.getInstance().getTainted())
275                    caller.notify(Colors.Gold + "Hey0 Server Mod Build " + etc.getInstance().getVersion());
276                else {
277                    caller.notify(Colors.Gold + "Unofficial hMod Build " + etc.getInstance().getVersionStr());
278                }
279            }
280        };
281    }