package openmods.config.properties; import static openmods.utils.CommandUtils.error; import static openmods.utils.CommandUtils.filterPrefixes; import static openmods.utils.CommandUtils.respond; import com.google.common.collect.ImmutableSet; import java.util.Arrays; import java.util.List; import java.util.Set; import net.minecraft.command.ICommandSender; import openmods.Log; import openmods.config.properties.ConfigProcessing.ModConfig; import openmods.utils.SidedCommand; import openmods.utils.io.StringConversionException; import org.apache.commons.lang3.ArrayUtils; public class CommandConfig extends SidedCommand { private static final String COMMAND_REMOVE = "remove"; private static final String COMMAND_APPEND = "append"; private static final String COMMAND_SET = "set"; private static final String COMMAND_CLEAR = "clear"; private static final String COMMAND_GET = "get"; private static final String COMMAND_HELP = "help"; private static final String COMMAND_SAVE = "save"; private static final String COMMAND_DEFAULT = "default"; private static final Set<String> SUBCOMMANDS = ImmutableSet.of( COMMAND_SAVE, COMMAND_HELP, COMMAND_GET, COMMAND_CLEAR, COMMAND_SET, COMMAND_APPEND, COMMAND_REMOVE, COMMAND_DEFAULT); public CommandConfig(String name, boolean restricted) { super(name, restricted); } @Override public String getCommandUsage(ICommandSender icommandsender) { return name + " save <modid> OR\n" + name + " help <modid> <category> <name> OR\n" + name + " get <modid> <category> <name> OR\n" + name + " clear <modid> <category> <name> OR\n" + name + " set <modid> <category> <name> <value>... OR\n" + name + " append <modid> <category> <name> <value>... OR\n" + name + " remove <modid> <category> <name> <value>... OR\n" + name + " default <modid> <category> <name> <value>... OR\n"; } private static void printValue(ICommandSender sender, final ModConfig config, ConfigPropertyMeta property) { respond(sender, "%s.%s.%s = %s (%s)", config.modId, property.category, property.name, property.valueDescription(), property.type.toString()); } @Override public void processCommand(ICommandSender sender, String[] args) { if (args.length < 2) throw error("openmodslib.command.no_enough_args"); final String command = args[0]; if (!SUBCOMMANDS.contains(command)) throw error("openmodslib.command.invalid_command", command); final String modId = args[1]; final ModConfig config = ConfigProcessing.getConfig(modId); if (config == null) throw error("openmodslib.command.unknown_modid"); if (COMMAND_SAVE.equals(command)) { config.save(); respond(sender, "openmodslib.command.saved", config.getConfigFile().getAbsolutePath()); return; } if (args.length < 4) throw error("openmodslib.command.no_enough_args"); final String category = args[2]; final String name = args[3]; ConfigPropertyMeta property = config.getValue(category, name); if (property == null) throw error("openmodslib.command.unknown_value"); if (COMMAND_HELP.equals(command)) { respond(sender, "%s.%s.%s: %s (%s)", config.modId, property.category, property.name, property.comment, property.type.toString()); return; } else if (COMMAND_GET.equals(command)) { printValue(sender, config, property); return; } else if (COMMAND_CLEAR.equals(command)) { if (property.acceptsMultipleValues()) changeValue(config, sender, property); else throw error("openmodslib.command.not_multiple"); return; } else if (COMMAND_DEFAULT.equals(command)) { changeValue(config, sender, property, property.getDefaultValues()); return; } if (args.length < 5) throw error("openmodslib.command.no_enough_args"); String[] values = Arrays.copyOfRange(args, 4, args.length); if (COMMAND_SET.equals(command)) { changeValue(config, sender, property, values); return; } if (!property.acceptsMultipleValues()) throw error("openmodslib.command.not_multiple"); String[] current = property.getPropertyValue(); if (COMMAND_APPEND.equals(command)) { changeValue(config, sender, property, ArrayUtils.addAll(current, values)); return; } else if (COMMAND_REMOVE.equals(command)) { changeValue(config, sender, property, ArrayUtils.removeElements(current, values)); return; } throw error("openmodslib.command.no_enough_args"); } protected void changeValue(ModConfig config, ICommandSender sender, ConfigPropertyMeta property, String... values) { try { ConfigPropertyMeta.Result changeResult = property.tryChangeValue(values); switch (changeResult) { case ONLINE: respond(sender, "openmodslib.command.online_change"); break; case OFFLINE: respond(sender, "openmodslib.command.offline_change"); break; default: respond(sender, "openmodslib.command.cancelled"); break; } printValue(sender, config, property); } catch (StringConversionException e) { throw error("openmodslib.command.invalid_type", Arrays.toString(values), property.type); } catch (Exception e) { Log.warn(e, "Error during command change"); throw error("openmodslib.command.unknown_error", e.getMessage()); } } @Override @SuppressWarnings("rawtypes") public List addTabCompletionOptions(ICommandSender sender, String[] args) { String command = args[0]; if (args.length == 1) return filterPrefixes(command, SUBCOMMANDS); String modId = args[1]; if (args.length == 2) return filterPrefixes(modId, ConfigProcessing.getConfigsIds()); if (COMMAND_SAVE.equals(command)) return null; final ModConfig config = ConfigProcessing.getConfig(modId); if (config == null) return null; String category = args[2]; if (args.length == 3) return filterPrefixes(category, config.getCategories()); String name = args[3]; if (args.length == 4) return filterPrefixes(name, config.getValues(category)); return null; } @Override public boolean isUsernameIndex(String[] astring, int i) { return false; } }