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 }