Add paginated commands, Closes #203, Add folder suggestions when your import fails

This commit is contained in:
Eric Stokes 2011-11-26 17:24:17 -07:00
parent 792d2ce5e6
commit 939a2e8b1f
4 changed files with 231 additions and 100 deletions

View File

@ -18,8 +18,7 @@ import org.bukkit.permissions.PermissionDefault;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class HelpCommand extends MultiverseCommand { public class HelpCommand extends PaginatedCommand<Command> {
private static final int CMDS_PER_PAGE = 7;
public HelpCommand(MultiverseCore plugin) { public HelpCommand(MultiverseCore plugin) {
super(plugin); super(plugin);
@ -34,69 +33,14 @@ public class HelpCommand extends MultiverseCommand {
this.addKey("mv search"); this.addKey("mv search");
this.addCommandExample("/mv help ?"); this.addCommandExample("/mv help ?");
this.setPermission("multiverse.help", "Displays a nice help menu.", PermissionDefault.TRUE); this.setPermission("multiverse.help", "Displays a nice help menu.", PermissionDefault.TRUE);
this.setItemsPerPage(7);
} }
@Override @Override
public void runCommand(CommandSender sender, List<String> args) { protected List<Command> getFilteredItems(List<Command> availableItems, String filter) {
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<Command> availableCommands = new ArrayList<Command>(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<Command> getFilteredCommands(List<Command> availableCommands, String filter) {
List<Command> filtered = new ArrayList<Command>(); List<Command> filtered = new ArrayList<Command>();
for (Command c : availableCommands) { for (Command c : availableItems) {
if (stitchThisString(c.getKeyStrings()).matches("(?i).*" + filter + ".*")) { if (stitchThisString(c.getKeyStrings()).matches("(?i).*" + filter + ".*")) {
filtered.add(c); filtered.add(c);
} else if (c.getCommandName().matches("(?i).*" + filter + ".*")) { } else if (c.getCommandName().matches("(?i).*" + filter + ".*")) {
@ -110,25 +54,43 @@ public class HelpCommand extends MultiverseCommand {
return filtered; return filtered;
} }
private String stitchThisString(List<String> list) { @Override
String returnstr = ""; protected String getItemText(Command item) {
for (String s : list) { return ChatColor.AQUA + item.getCommandUsage();
returnstr += s + " ";
}
return returnstr;
} }
private void showPage(int page, CommandSender sender, List<Command> cmds) { @Override
int start = (page - 1) * CMDS_PER_PAGE; public void runCommand(CommandSender sender, List<String> args) {
int end = start + CMDS_PER_PAGE; sender.sendMessage(ChatColor.AQUA + "====[ Multiverse Help ]====");
for (int i = start; i < end; i++) {
// For consistancy, print some extra lines if it's a player: FilterObject filterObject = this.getPageAndFilter(args);
if (i < cmds.size()) {
sender.sendMessage(ChatColor.AQUA + cmds.get(i).getCommandUsage()); List<Command> availableCommands = new ArrayList<Command>(this.plugin.getCommandHandler().getCommands(sender));
} else if (sender instanceof Player) { if (filterObject.getFilter().length() > 0) {
sender.sendMessage(" "); 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);
}
} }

View File

@ -9,6 +9,7 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MVWorldManager; import com.onarandombox.MultiverseCore.api.MVWorldManager;
import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.World.Environment; import org.bukkit.World.Environment;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -17,6 +18,8 @@ import org.bukkit.permissions.PermissionDefault;
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
public class ImportCommand extends MultiverseCommand { public class ImportCommand extends MultiverseCommand {
@ -63,9 +66,17 @@ public class ImportCommand extends MultiverseCommand {
File worldFolder = this.plugin.getServer().getWorldContainer(); File worldFolder = this.plugin.getServer().getWorldContainer();
File[] files = worldFolder.listFiles(); File[] files = worldFolder.listFiles();
String worldList = ""; String worldList = "";
Collection<MultiverseWorld> worlds = this.worldManager.getMVWorlds();
List<String> worldStrings = new ArrayList<String>();
for (MultiverseWorld world : worlds) {
worldStrings.add(world.getName());
}
for (String world : this.worldManager.getUnloadedWorlds()) {
worldStrings.add(world);
}
ChatColor currColor = ChatColor.WHITE; ChatColor currColor = ChatColor.WHITE;
for (File file : files) { for (File file : files) {
if (file.isDirectory() && checkIfIsWorld(file)) { if (file.isDirectory() && checkIfIsWorld(file) && !worldStrings.contains(file.getName())) {
worldList += currColor + file.getName() + " "; worldList += currColor + file.getName() + " ";
if (currColor == ChatColor.WHITE) { if (currColor == ChatColor.WHITE) {
currColor = ChatColor.YELLOW; currColor = ChatColor.YELLOW;
@ -83,6 +94,7 @@ public class ImportCommand extends MultiverseCommand {
if (worldName.toLowerCase().equals("--list") || worldName.toLowerCase().equals("-l")) { if (worldName.toLowerCase().equals("--list") || worldName.toLowerCase().equals("-l")) {
String worldList = this.getPotentialWorlds(); String worldList = this.getPotentialWorlds();
sender.sendMessage(ChatColor.AQUA + "====[ These look like worlds ]====");
sender.sendMessage(worldList); sender.sendMessage(worldList);
return; return;
} }
@ -116,11 +128,13 @@ public class ImportCommand extends MultiverseCommand {
Command.broadcastCommandMessage(sender, "Complete!"); Command.broadcastCommandMessage(sender, "Complete!");
} else if (env == null) { } else if (env == null) {
sender.sendMessage(ChatColor.RED + "FAILED."); sender.sendMessage(ChatColor.RED + "FAILED.");
sender.sendMessage("That world type did not exist."); sender.sendMessage("That world environment did not exist.");
sender.sendMessage("For a list of available world types, type: /mvenv"); sender.sendMessage("For a list of available world types, type: " + ChatColor.AQUA + "/mvenv");
} else { } else {
sender.sendMessage(ChatColor.RED + "FAILED."); 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);
} }
} }
} }

View File

@ -9,35 +9,32 @@ package com.onarandombox.MultiverseCore.commands;
import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.MultiverseCore;
import com.onarandombox.MultiverseCore.api.MultiverseWorld; import com.onarandombox.MultiverseCore.api.MultiverseWorld;
import com.pneumaticraft.commandhandler.Command;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.World.Environment; import org.bukkit.World.Environment;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionDefault; import org.bukkit.permissions.PermissionDefault;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class ListCommand extends MultiverseCommand { public class ListCommand extends PaginatedCommand<String> {
public ListCommand(MultiverseCore plugin) { public ListCommand(MultiverseCore plugin) {
super(plugin); super(plugin);
this.setName("World Listing"); this.setName("World Listing");
this.setCommandUsage("/mv list"); this.setCommandUsage("/mv list");
this.setArgRange(0, 0); this.setArgRange(0, 2);
this.addKey("mvlist"); this.addKey("mvlist");
this.addKey("mvl"); this.addKey("mvl");
this.addKey("mv list"); this.addKey("mv list");
this.setPermission("multiverse.core.list.worlds", "Displays a listing of all worlds that you can enter.", PermissionDefault.OP); this.setPermission("multiverse.core.list.worlds", "Displays a listing of all worlds that you can enter.", PermissionDefault.OP);
this.setItemsPerPage(8);
} }
@Override private List<String> getFancyWorldList(Player p) {
public void runCommand(CommandSender sender, List<String> args) { List<String> worldList = new ArrayList<String>();
Player p = null;
if (sender instanceof Player) {
p = (Player) sender;
}
String output = ChatColor.LIGHT_PURPLE + "Worlds which you can view:\n";
for (MultiverseWorld world : this.plugin.getMVWorldManager().getMVWorlds()) { for (MultiverseWorld world : this.plugin.getMVWorldManager().getMVWorlds()) {
if (p != null && (!this.plugin.getMVPerms().canEnterWorld(p, world))) { if (p != null && (!this.plugin.getMVPerms().canEnterWorld(p, world))) {
@ -53,26 +50,76 @@ public class ListCommand extends MultiverseCommand {
} else if (env == Environment.THE_END) { } else if (env == Environment.THE_END) {
color = ChatColor.AQUA; 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()) { if (world.isHidden()) {
// TODO: Add an actual permission for this. if (p == null || p.hasPermission("multiverse.core.modify")) {
if (p == null || p.isOp()) {
// Prefix hidden worlds with an "[H]" // Prefix hidden worlds with an "[H]"
outputCache = ChatColor.GRAY + "[H]" + outputCache; worldList.add(ChatColor.GRAY + "[H]" + outputCache);
output += outputCache;
} }
} else { } else {
output += outputCache; worldList.add(outputCache);
} }
} }
for (String name : this.plugin.getMVWorldManager().getUnloadedWorlds()) { for (String name : this.plugin.getMVWorldManager().getUnloadedWorlds()) {
if (p == null || this.plugin.getMVPerms().hasPermission(p, "multiverse.access." + name, true)) { 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"); return worldList;
for (String msg : response) {
sender.sendMessage(msg);
} }
@Override
protected List<String> getFilteredItems(List<String> availableItems, String filter) {
List<String> filtered = new ArrayList<String>();
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<String> 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<String> availableWorlds = new ArrayList<String>(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);
} }
} }

View File

@ -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<T> 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<T> getFilteredItems(List<T> availableItems, String filter);
protected String stitchThisString(List<String> list) {
String returnstr = "";
for (String s : list) {
returnstr += s + " ";
}
return returnstr;
}
protected void showPage(int page, CommandSender sender, List<T> 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<String> 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;
}
}
}