package me.desht.scrollingmenusign.commands;
import me.desht.dhutils.ItemNames;
import me.desht.dhutils.MessagePager;
import me.desht.dhutils.MiscUtil;
import me.desht.dhutils.PermissionUtils;
import me.desht.scrollingmenusign.SMSException;
import me.desht.scrollingmenusign.SMSMenu;
import me.desht.scrollingmenusign.SMSMenuItem;
import me.desht.scrollingmenusign.ScrollingMenuSign;
import me.desht.scrollingmenusign.util.SMSUtil;
import me.desht.scrollingmenusign.views.ActiveItem;
import me.desht.scrollingmenusign.views.SMSView;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import java.util.List;
public class MenuCommand extends SMSAbstractCommand {
public MenuCommand() {
super("sms menu", 0, 3);
setPermissionNode("scrollingmenusign.commands.menu");
setUsage(new String[]{
"/sms menu <menu-name> [<attribute>] [<value>]",
});
setQuotedArgs(true);
}
@Override
public boolean execute(Plugin plugin, CommandSender sender, String[] args) {
SMSMenu menu;
SMSView view = null;
if (args.length > 0 && !args[0].equals(".")) {
menu = ((ScrollingMenuSign) plugin).getMenuManager().getMenu(args[0]);
} else {
notFromConsole(sender);
Player player = (Player) sender;
if (ActiveItem.isActiveItem(player.getItemInHand())) {
menu = new ActiveItem(player.getItemInHand()).getActiveMenu();
} else {
view = ScrollingMenuSign.getInstance().getViewManager().getTargetedView(player, true);
menu = view.getActiveMenu(player);
}
}
String attr;
switch (args.length) {
case 0:
case 1:
showMenuDetails(plugin, sender, menu, view);
break;
case 2:
attr = args[1];
MiscUtil.statusMessage(sender, String.format("&e%s.%s&- = &e%s&-", menu.getName(), attr, menu.getAttributes().get(attr).toString()));
break;
case 3:
attr = args[1];
String newVal = args[2];
menu.ensureAllowedToModify(sender);
if (attr.equals(SMSMenu.OWNER) && !PermissionUtils.isAllowedTo(sender, "scrollingmenusign.edit.any")) {
throw new SMSException("You may not change the owner of a menu.");
}
menu.getAttributes().set(attr, newVal);
MiscUtil.statusMessage(sender, String.format("&e%s.%s&- = &e%s&-", menu.getName(), attr, menu.getAttributes().get(attr).toString()));
break;
}
return true;
}
private void showMenuDetails(Plugin plugin, CommandSender sender, SMSMenu menu, SMSView view) {
MessagePager pager = MessagePager.getPager(sender).clear().setParseColours(true);
pager.add("&fMenu: &6" + menu.getName());
pager.add("&fOwner ID: &6" + menu.getOwnerId());
if (view != null) {
pager.add(String.format("(View: &6%s&f)", view.getName()));
}
for (String k : menu.getAttributes().listAttributeKeys(true)) {
pager.add(String.format(MessagePager.BULLET + "&e%s&f = &e%s", k, menu.getAttributes().get(k).toString()));
}
if (!menu.formatUses(sender).isEmpty()) {
pager.add("Uses: &e" + menu.formatUses(sender));
}
String defIconName = plugin.getConfig().getString("sms.inv_view.default_icon", "STONE");
ItemStack defIcon = SMSUtil.parseMaterialSpec(defIconName);
List<SMSMenuItem> items = menu.getItems();
String s = items.size() == 1 ? "" : "s";
int n = 1;
pager.add("&f" + items.size() + " menu item" + s + ":");
for (SMSMenuItem item : items) {
String message = item.getMessage();
String command = item.getCommand().replace(" && ", " &&&& ");
String altCommand = item.getAltCommand().replace(" && ", " &&&& ");
String uses = item.formatUses(sender);
String perm = item.getPermissionNode();
pager.add(String.format("&e%2d) &f%s &7[%s]", n++, item.getLabel(), command));
if (!altCommand.isEmpty()) {
pager.add(" &9Alt Command: &e" + altCommand);
}
if (!message.isEmpty()) {
pager.add(" &9Feedback: &e" + message);
}
if (!uses.isEmpty()) {
pager.add(" &9Uses: &e" + uses);
}
if (!perm.isEmpty()) {
pager.add(" &9Permission node: &e" + perm);
}
if (item.hasIcon()) {
ItemStack icon = item.getIcon();
if (!icon.equals(defIcon)) {
String amt = icon.getAmount() > 1 ? icon.getAmount() + " x " : "";
pager.add(" &9Icon: &e" + amt + ItemNames.lookup(icon) + " &7(" + icon.getData().toString() + ")");
}
}
String[] lore = item.getLore();
for (int i = 0; i < lore.length; i++) {
pager.add((i == 0 ? " &9Lore: &e" : " &e") + lore[i]);
}
}
pager.showPage();
}
@Override
public List<String> onTabComplete(Plugin plugin, CommandSender sender, String[] args) {
SMSMenu menu;
switch (args.length) {
case 1:
return getMenuCompletions(plugin, sender, args[0]);
case 2:
menu = getMenu(sender, args[0]);
return filterPrefix(sender, menu.getAttributes().listAttributeKeys(false), args[1]);
case 3:
menu = getMenu(sender, args[0]);
Object o = menu.getAttributes().get(args[1]);
String desc = menu.getAttributes().getDescription(args[1]);
if (!desc.isEmpty())
desc = ChatColor.GRAY.toString() + ChatColor.ITALIC + " [" + desc + "]";
return getConfigValueCompletions(sender, args[1], o, desc, args[2]);
default:
return noCompletions(sender);
}
}
}