package openmods.calc.command; import com.google.common.base.Joiner; import com.google.common.base.Strings; import com.google.common.collect.Lists; import java.util.Arrays; import java.util.List; import net.minecraft.command.CommandException; import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IChatComponent; import openmods.Log; public class CommandCalc implements ICommand { protected final String name; private final ICommandComponent commandComponent; private final List<String> aliases; public CommandCalc(ICommandComponent parentCommandComponent, String name, String... aliases) { this.name = "=" + name; this.aliases = Arrays.asList(aliases); this.commandComponent = parentCommandComponent.partialyExecute(WhitespaceSplitters.fromSplitArray(name)); } @Override public int compareTo(Object o) { return name.compareTo(((ICommand)o).getCommandName()); } @Override public String getCommandName() { return name; } @Override public List<?> getCommandAliases() { return aliases; } @Override public boolean canCommandSenderUseCommand(ICommandSender sender) { return true; } @Override public boolean isUsernameIndex(String[] args, int index) { return false; } @Override public String getCommandUsage(ICommandSender sender) { final HelpPrinter printer = new HelpPrinter(); printer.push(name); commandComponent.help(printer); return printer.generate(); } @Override public List<?> addTabCompletionOptions(ICommandSender sender, String[] args) { return commandComponent.getTabCompletions(WhitespaceSplitters.fromSplitArray(args)); } @Override public void processCommand(ICommandSender sender, String[] args) { final IWhitespaceSplitter splitArgs = WhitespaceSplitters.fromSplitArray(args); try { commandComponent.execute(sender, splitArgs); } catch (NestedCommandException e) { e.pushCommandName(name); final IChatComponent message = e.getChatComponent(); message.getChatStyle().setColor(EnumChatFormatting.RED); sender.addChatMessage(message); } catch (Exception e) { Log.info(e, "Failed to execute command"); final List<String> causes = Lists.newArrayList(); Throwable current = e; while (current != null) { causes.add(Strings.nullToEmpty(current.getMessage())); current = current.getCause(); } throw new CommandException("openmodslib.command.calc_error", Joiner.on("', caused by '").join(causes)); } if (!splitArgs.isFinished()) throw new CommandException("openmodslib.command.calc_extra_args", splitArgs.getTail()); } }