package openeye.notes; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.io.File; import java.util.Collection; import java.util.List; import java.util.Map; import net.minecraft.command.CommandException; import net.minecraft.command.ICommand; import net.minecraft.command.ICommandSender; import net.minecraft.command.SyntaxErrorException; import net.minecraft.server.MinecraftServer; import net.minecraft.util.math.BlockPos; import openeye.logic.GsonUtils; import openeye.notes.entries.NoteEntry; import openeye.storage.GsonSimpleStorage; import openeye.storage.IAppendableStorage; public class CommandNotes implements ICommand { private static final String COMMAND_NAME = "eye_notes"; interface INoteSink { public void dump(Collection<NoteEntry> notes, ICommandSender sender) throws CommandException; } private final Map<String, INoteSink> sinks = Maps.newHashMap(); public CommandNotes(File reportDir) { final IAppendableStorage<Object> notesDump = new GsonSimpleStorage<Object>(reportDir, "notes", "json", Object.class, GsonUtils.PRETTY_GSON); sinks.put("console", new ConsoleNoteSink()); sinks.put("json", new JsonNoteSink(notesDump)); } @Override public int compareTo(ICommand o) { return COMMAND_NAME.compareTo(o.getCommandName()); } @Override public String getCommandName() { return COMMAND_NAME; } @Override public String getCommandUsage(ICommandSender sender) { StringBuilder builder = new StringBuilder(COMMAND_NAME).append(" <"); Joiner.on('|').appendTo(builder, sinks.keySet()); builder.append(">"); return builder.toString(); } @Override public List<String> getCommandAliases() { return Lists.newArrayList(); } @Override public void execute(MinecraftServer server, ICommandSender sender, String[] command) throws CommandException { if (command.length != 1) throw new SyntaxErrorException(); String sinkType = command[0]; INoteSink sink = sinks.get(sinkType); if (sink == null) throw new SyntaxErrorException(); sink.dump(NoteCollector.INSTANCE.getNotes(), sender); } @Override public boolean checkPermission(MinecraftServer server, ICommandSender sender) { return sender.canCommandSenderUseCommand(4, COMMAND_NAME); } @Override public List<String> getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] command, BlockPos pos) { List<String> result = Lists.newArrayList(); if (command.length == 1) { String prefix = command[0]; for (String name : sinks.keySet()) if (name.startsWith(prefix)) result.add(name); } return result; } @Override public boolean isUsernameIndex(String[] command, int index) { return false; } }