diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java index cfa9c6c9..66a67f49 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java @@ -18,8 +18,7 @@ import org.bukkit.permissions.PermissionDefault; import java.util.ArrayList; import java.util.List; -public class HelpCommand extends MultiverseCommand { - private static final int CMDS_PER_PAGE = 7; +public class HelpCommand extends PaginatedCommand { public HelpCommand(MultiverseCore plugin) { super(plugin); @@ -34,69 +33,14 @@ public class HelpCommand extends MultiverseCommand { this.addKey("mv search"); this.addCommandExample("/mv help ?"); this.setPermission("multiverse.help", "Displays a nice help menu.", PermissionDefault.TRUE); + this.setItemsPerPage(7); } @Override - public void runCommand(CommandSender sender, List args) { - sender.sendMessage(ChatColor.AQUA + "====[ Multiverse Help ]===="); - - int page = 1; - - String filter = ""; - - if (args.size() == 0) { - filter = ""; - page = 1; - } else if (args.size() == 1) { - try { - page = Integer.parseInt(args.get(0)); - } catch (NumberFormatException ex) { - filter = args.get(0); - page = 1; - } - } else if (args.size() == 2) { - filter = args.get(0); - try { - page = Integer.parseInt(args.get(1)); - } catch (NumberFormatException ex) { - page = 1; - } - } - - List availableCommands = new ArrayList(this.plugin.getCommandHandler().getCommands(sender)); - if (filter.length() > 0) { - availableCommands = this.getFilteredCommands(availableCommands, filter); - if (availableCommands.size() == 0) { - sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE + "No commands matched your filter: " + ChatColor.AQUA + filter); - return; - } - } - - if (!(sender instanceof Player)) { - sender.sendMessage(ChatColor.AQUA + " Add a '" + ChatColor.DARK_PURPLE + "?" + ChatColor.AQUA + "' after a command to see more about it."); - for (Command c : availableCommands) { - sender.sendMessage(ChatColor.AQUA + c.getCommandUsage()); - } - return; - } - - int totalPages = (int) Math.ceil(availableCommands.size() / (CMDS_PER_PAGE + 0.0)); - - if (page > totalPages) { - page = totalPages; - } - - sender.sendMessage(ChatColor.AQUA + " Page " + page + " of " + totalPages); - sender.sendMessage(ChatColor.AQUA + " Add a '" + ChatColor.DARK_PURPLE + "?" + ChatColor.AQUA + "' after a command to see more about it."); - - this.showPage(page, sender, availableCommands); - - } - - private List getFilteredCommands(List availableCommands, String filter) { + protected List getFilteredItems(List availableItems, String filter) { List filtered = new ArrayList(); - for (Command c : availableCommands) { + for (Command c : availableItems) { if (stitchThisString(c.getKeyStrings()).matches("(?i).*" + filter + ".*")) { filtered.add(c); } else if (c.getCommandName().matches("(?i).*" + filter + ".*")) { @@ -110,25 +54,43 @@ public class HelpCommand extends MultiverseCommand { return filtered; } - private String stitchThisString(List list) { - String returnstr = ""; - for (String s : list) { - returnstr += s + " "; - } - return returnstr; + @Override + protected String getItemText(Command item) { + return ChatColor.AQUA + item.getCommandUsage(); } - private void showPage(int page, CommandSender sender, List cmds) { - int start = (page - 1) * CMDS_PER_PAGE; - int end = start + CMDS_PER_PAGE; - for (int i = start; i < end; i++) { - // For consistancy, print some extra lines if it's a player: - if (i < cmds.size()) { - sender.sendMessage(ChatColor.AQUA + cmds.get(i).getCommandUsage()); - } else if (sender instanceof Player) { - sender.sendMessage(" "); + @Override + public void runCommand(CommandSender sender, List args) { + sender.sendMessage(ChatColor.AQUA + "====[ Multiverse Help ]===="); + + FilterObject filterObject = this.getPageAndFilter(args); + + List availableCommands = new ArrayList(this.plugin.getCommandHandler().getCommands(sender)); + if (filterObject.getFilter().length() > 0) { + availableCommands = this.getFilteredItems(availableCommands, filterObject.getFilter()); + if (availableCommands.size() == 0) { + sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE + "No commands matched your filter: " + ChatColor.AQUA + filterObject.getFilter()); + return; } } - } + if (!(sender instanceof Player)) { + sender.sendMessage(ChatColor.AQUA + " Add a '" + ChatColor.DARK_PURPLE + "?" + ChatColor.AQUA + "' after a command to see more about it."); + for (Command c : availableCommands) { + sender.sendMessage(ChatColor.AQUA + c.getCommandUsage()); + } + return; + } + + int totalPages = (int) Math.ceil(availableCommands.size() / (this.ITEMS_PER_PAGE + 0.0)); + + if (filterObject.getPage() > totalPages) { + filterObject.setPage(totalPages); + } + + sender.sendMessage(ChatColor.AQUA + " Page " + filterObject.getPage() + " of " + totalPages); + sender.sendMessage(ChatColor.AQUA + " Add a '" + ChatColor.DARK_PURPLE + "?" + ChatColor.AQUA + "' after a command to see more about it."); + + this.showPage(filterObject.getPage(), sender, availableCommands); + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ImportCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ImportCommand.java index af7fbd68..9ebde5eb 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ImportCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ImportCommand.java @@ -9,6 +9,7 @@ package com.onarandombox.MultiverseCore.commands; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MVWorldManager; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; import org.bukkit.ChatColor; import org.bukkit.World.Environment; import org.bukkit.command.Command; @@ -17,6 +18,8 @@ import org.bukkit.permissions.PermissionDefault; import java.io.File; import java.io.FilenameFilter; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; public class ImportCommand extends MultiverseCommand { @@ -63,9 +66,17 @@ public class ImportCommand extends MultiverseCommand { File worldFolder = this.plugin.getServer().getWorldContainer(); File[] files = worldFolder.listFiles(); String worldList = ""; + Collection worlds = this.worldManager.getMVWorlds(); + List worldStrings = new ArrayList(); + for (MultiverseWorld world : worlds) { + worldStrings.add(world.getName()); + } + for (String world : this.worldManager.getUnloadedWorlds()) { + worldStrings.add(world); + } ChatColor currColor = ChatColor.WHITE; for (File file : files) { - if (file.isDirectory() && checkIfIsWorld(file)) { + if (file.isDirectory() && checkIfIsWorld(file) && !worldStrings.contains(file.getName())) { worldList += currColor + file.getName() + " "; if (currColor == ChatColor.WHITE) { currColor = ChatColor.YELLOW; @@ -83,6 +94,7 @@ public class ImportCommand extends MultiverseCommand { if (worldName.toLowerCase().equals("--list") || worldName.toLowerCase().equals("-l")) { String worldList = this.getPotentialWorlds(); + sender.sendMessage(ChatColor.AQUA + "====[ These look like worlds ]===="); sender.sendMessage(worldList); return; } @@ -116,11 +128,13 @@ public class ImportCommand extends MultiverseCommand { Command.broadcastCommandMessage(sender, "Complete!"); } else if (env == null) { sender.sendMessage(ChatColor.RED + "FAILED."); - sender.sendMessage("That world type did not exist."); - sender.sendMessage("For a list of available world types, type: /mvenv"); + sender.sendMessage("That world environment did not exist."); + sender.sendMessage("For a list of available world types, type: " + ChatColor.AQUA + "/mvenv"); } else { sender.sendMessage(ChatColor.RED + "FAILED."); - sender.sendMessage("That world folder does not exist..."); + String worldList = this.getPotentialWorlds(); + sender.sendMessage("That world folder does not exist. These look like worlds to me:"); + sender.sendMessage(worldList); } } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java index 39837910..9456bfb7 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/ListCommand.java @@ -9,35 +9,32 @@ package com.onarandombox.MultiverseCore.commands; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.pneumaticraft.commandhandler.Command; import org.bukkit.ChatColor; import org.bukkit.World.Environment; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionDefault; +import java.util.ArrayList; import java.util.List; -public class ListCommand extends MultiverseCommand { +public class ListCommand extends PaginatedCommand { public ListCommand(MultiverseCore plugin) { super(plugin); this.setName("World Listing"); this.setCommandUsage("/mv list"); - this.setArgRange(0, 0); + this.setArgRange(0, 2); this.addKey("mvlist"); this.addKey("mvl"); this.addKey("mv list"); this.setPermission("multiverse.core.list.worlds", "Displays a listing of all worlds that you can enter.", PermissionDefault.OP); + this.setItemsPerPage(8); } - @Override - public void runCommand(CommandSender sender, List args) { - Player p = null; - if (sender instanceof Player) { - p = (Player) sender; - } - - String output = ChatColor.LIGHT_PURPLE + "Worlds which you can view:\n"; + private List getFancyWorldList(Player p) { + List worldList = new ArrayList(); for (MultiverseWorld world : this.plugin.getMVWorldManager().getMVWorlds()) { if (p != null && (!this.plugin.getMVPerms().canEnterWorld(p, world))) { @@ -53,26 +50,76 @@ public class ListCommand extends MultiverseCommand { } else if (env == Environment.THE_END) { color = ChatColor.AQUA; } - String outputCache = world.getColoredWorldString() + ChatColor.WHITE + " - " + color + world.getEnvironment() + " \n"; + String outputCache = world.getColoredWorldString() + ChatColor.WHITE + " - " + color + world.getEnvironment(); if (world.isHidden()) { - // TODO: Add an actual permission for this. - if (p == null || p.isOp()) { + if (p == null || p.hasPermission("multiverse.core.modify")) { // Prefix hidden worlds with an "[H]" - outputCache = ChatColor.GRAY + "[H]" + outputCache; - output += outputCache; + worldList.add(ChatColor.GRAY + "[H]" + outputCache); } } else { - output += outputCache; + worldList.add(outputCache); } } for (String name : this.plugin.getMVWorldManager().getUnloadedWorlds()) { if (p == null || this.plugin.getMVPerms().hasPermission(p, "multiverse.access." + name, true)) { - output += ChatColor.GRAY + name + " - UNLOADED\n"; + worldList.add(ChatColor.GRAY + name + " - UNLOADED"); } } - String[] response = output.split("\n"); - for (String msg : response) { - sender.sendMessage(msg); + return worldList; + } + + @Override + protected List getFilteredItems(List availableItems, String filter) { + List filtered = new ArrayList(); + + for (String s : availableItems) { + if (s.matches("(?i).*" + filter + ".*")) { + filtered.add(s); + } } + return filtered; + } + + @Override + protected String getItemText(String item) { + return item; + } + + @Override + public void runCommand(CommandSender sender, List args) { + sender.sendMessage(ChatColor.LIGHT_PURPLE + "====[ Multiverse World List ]===="); + Player p = null; + if (sender instanceof Player) { + p = (Player) sender; + } + + + FilterObject filterObject = this.getPageAndFilter(args); + + List availableWorlds = new ArrayList(this.getFancyWorldList(p)); + if (filterObject.getFilter().length() > 0) { + availableWorlds = this.getFilteredItems(availableWorlds, filterObject.getFilter()); + if (availableWorlds.size() == 0) { + sender.sendMessage(ChatColor.RED + "Sorry... " + ChatColor.WHITE + "No worlds matched your filter: " + ChatColor.AQUA + filterObject.getFilter()); + return; + } + } + + if (!(sender instanceof Player)) { + for (String c : availableWorlds) { + sender.sendMessage(c); + } + return; + } + + int totalPages = (int) Math.ceil(availableWorlds.size() / (this.ITEMS_PER_PAGE + 0.0)); + + if (filterObject.getPage() > totalPages) { + filterObject.setPage(totalPages); + } + + sender.sendMessage(ChatColor.AQUA + " Page " + filterObject.getPage() + " of " + totalPages); + + this.showPage(filterObject.getPage(), sender, availableWorlds); } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java new file mode 100644 index 00000000..92863889 --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java @@ -0,0 +1,108 @@ +/****************************************************************************** + * Multiverse 2 Copyright (c) the Multiverse Team 2011. * + * Multiverse 2 is licensed under the BSD License. * + * For more information please check the README.md file included * + * with this project. * + ******************************************************************************/ + +package com.onarandombox.MultiverseCore.commands; + +import com.onarandombox.MultiverseCore.MultiverseCore; +import com.pneumaticraft.commandhandler.Command; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +/** + * Multiverse 2 + * + * @author fernferret + */ +public abstract class PaginatedCommand extends MultiverseCommand { + protected int ITEMS_PER_PAGE = 9; + + + public PaginatedCommand(MultiverseCore plugin) { + super(plugin); + } + + protected void setItemsPerPage(int items) { + ITEMS_PER_PAGE = items; + } + + protected abstract List getFilteredItems(List availableItems, String filter); + + protected String stitchThisString(List list) { + String returnstr = ""; + for (String s : list) { + returnstr += s + " "; + } + return returnstr; + } + + protected void showPage(int page, CommandSender sender, List cmds) { + int start = (page - 1) * ITEMS_PER_PAGE; + int end = start + ITEMS_PER_PAGE; + for (int i = start; i < end; i++) { + // For consistancy, print some extra lines if it's a player: + if (i < cmds.size()) { + sender.sendMessage(this.getItemText(cmds.get(i))); + } else if (sender instanceof Player) { + sender.sendMessage(" "); + } + } + } + + protected abstract String getItemText(T item); + + protected FilterObject getPageAndFilter(List args) { + int page = 1; + + String filter = ""; + + if (args.size() == 0) { + filter = ""; + page = 1; + } else if (args.size() == 1) { + try { + page = Integer.parseInt(args.get(0)); + } catch (NumberFormatException ex) { + filter = args.get(0); + page = 1; + } + } else if (args.size() == 2) { + filter = args.get(0); + try { + page = Integer.parseInt(args.get(1)); + } catch (NumberFormatException ex) { + page = 1; + } + } + return new FilterObject(page, filter); + } + + protected class FilterObject { + private Integer page; + private String filter; + + public FilterObject(Integer page, String filter) { + this.page = page; + this.filter = filter; + } + + public Integer getPage() { + return this.page; + } + + public void setPage(int page) { + this.page = page; + } + + public String getFilter() { + return this.filter; + } + } +}