package me.desht.scrollingmenusign.commands; import me.desht.dhutils.MessagePager; import me.desht.dhutils.MiscUtil; import me.desht.dhutils.PermissionUtils; import me.desht.scrollingmenusign.RedstoneControlSign; import me.desht.scrollingmenusign.SMSException; import me.desht.scrollingmenusign.SMSValidate; import me.desht.scrollingmenusign.ScrollingMenuSign; import me.desht.scrollingmenusign.views.PoppableView; import me.desht.scrollingmenusign.views.SMSGlobalScrollableView; import me.desht.scrollingmenusign.views.SMSView; import me.desht.scrollingmenusign.views.action.RepaintAction; import me.desht.scrollingmenusign.views.redout.Switch; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import java.util.List; public class ViewCommand extends SMSAbstractCommand { public ViewCommand() { super("sms view", 0, 3); setPermissionNode("scrollingmenusign.commands.view"); setUsage(new String[]{ "/sms view [-l]", "/sms view <view-name> <attribute-name>|<$var> [<new-value>]", "/sms view <view-name> -d [<$var>]", "/sms view <view-name> -popup", }); setQuotedArgs(true); setOptions("popup", "popup-for:s", "d:s", "l"); } @Override public boolean execute(Plugin plugin, CommandSender sender, String[] args) { SMSView view; if (getBooleanOption("l")) { listAllViews(sender, plugin); return true; } if (args.length > 0) { view = getView(sender, args[0]); } else { notFromConsole(sender); Player player = (Player) sender; view = getViewManager(plugin).getTargetedView(player); } if (view == null) { // maybe the player's looking at an output switch if (lookingAtSwitch((ScrollingMenuSign) plugin, sender)) { return true; } else { MiscUtil.errorMessage(sender, "No suitable view found."); return true; } } if (getBooleanOption("popup")) { notFromConsole(sender); view.ensureAllowedToUse(sender); SMSValidate.isTrue(view instanceof PoppableView, "This view type can't be popped up."); ((PoppableView) view).toggleGUI((Player) sender); } else if (hasOption("popup-for")) { PermissionUtils.requirePerms(sender, "scrollingmenusign.popup.other"); String otherName = getStringOption("popup-for"); @SuppressWarnings("deprecation") Player other = Bukkit.getPlayer(otherName); SMSValidate.notNull(other, "Player " + otherName + " is not online."); SMSValidate.isTrue(view instanceof PoppableView, "This view type can't be popped up."); ((PoppableView) view).toggleGUI(other); } else if (hasOption("d")) { view.ensureAllowedToModify(sender); String varName = getStringOption("d"); if (varName.startsWith("$")) { varName = varName.substring(1); view.setVariable(varName, null); view.autosave(); view.update(null, new RepaintAction()); MiscUtil.statusMessage(sender, "Deleted view variable: &a" + varName + "&-."); } } else if (args.length <= 1) { showViewDetails(sender, view); } else { String attr = args[1]; if (attr.startsWith("$")) { String varName = attr.substring(1); // user-defined view variable if (args.length == 3) { view.ensureAllowedToModify(sender); view.setVariable(varName, args[2]); view.autosave(); view.update(null, new RepaintAction()); } MiscUtil.statusMessage(sender, String.format("&a%s.$%s&- = &a%s&-", view.getName(), varName, view.getVariable(varName))); } else { // predefined view attribute if (args.length == 3) { view.ensureAllowedToModify(sender); if (attr.equals(SMSView.OWNER) && !PermissionUtils.isAllowedTo(sender, "scrollingmenusign.edit.any")) { throw new SMSException("You may not change the owner of a view."); } view.setAttribute(attr, args[2]); view.autosave(); } MiscUtil.statusMessage(sender, String.format("&e%s.%s&- = &e%s&-", view.getName(), attr, view.getAttributeAsString(attr))); } } return true; } private void listAllViews(CommandSender sender, Plugin plugin) { MessagePager pager = MessagePager.getPager(sender).clear().setParseColours(true); for (SMSView view : MiscUtil.asSortedList(getViewManager(plugin).listViews())) { pager.add(MessagePager.BULLET + " " + view.getName() + ": &e" + view.toString()); } pager.showPage(); } private void showViewDetails(CommandSender sender, SMSView view) { MessagePager pager = MessagePager.getPager(sender).clear().setParseColours(true); pager.add(String.format("View &6%s&f (%s) :", view.getName(), view.toString())); pager.add(String.format("Native menu: &6%s&f, Active menu: &6%s", view.getNativeMenu().getName(), view.getActiveMenu(sender instanceof Player ? (Player) sender : null).getName())); pager.add("Owner ID: &6" + view.getOwnerId()); for (String k : view.listAttributeKeys(true)) { pager.add(String.format(MessagePager.BULLET + "&e%s&f = &e%s", k, view.getAttributeAsString(k, ""))); } for (String k : MiscUtil.asSortedList(view.listVariables())) { pager.add(String.format("&4\u2022 &a$%s&f = &a%s", k, view.getVariable(k))); } if (view instanceof SMSGlobalScrollableView) { SMSGlobalScrollableView gsv = (SMSGlobalScrollableView) view; int nSwitches = gsv.getSwitches().size(); if (nSwitches > 0) { String s = nSwitches > 1 ? "s" : ""; pager.add("&f" + nSwitches + "&- redstone output" + s + ":"); for (Switch sw : MiscUtil.asSortedList(gsv.getSwitches())) { pager.add(String.format(MessagePager.BULLET + "&e%s&f @ &e%s", sw.getTrigger(), MiscUtil.formatLocation(sw.getLocation()))); } } int nCtrlSigns = gsv.getControlSigns().size(); if (nCtrlSigns > 0) { String s = nCtrlSigns > 1 ? "s" : ""; pager.add("&f" + nCtrlSigns + "&- redstone control sign" + s + ":"); for (RedstoneControlSign sign : gsv.getControlSigns()) { pager.add(String.format(MessagePager.BULLET + "&e%s&-", sign)); } } } pager.showPage(); } private boolean lookingAtSwitch(ScrollingMenuSign plugin, CommandSender sender) { if (!(sender instanceof Player)) { return false; } try { Block b = ((Player) sender).getTargetBlock(null, ScrollingMenuSign.BLOCK_TARGET_DIST); Switch sw = plugin.getLocationManager().getInteractableAt(b.getLocation(), Switch.class); if (sw != null) { MiscUtil.statusMessage(sender, String.format("Output switch @ &e%s&- for view &e%s&- / &e%s&-", MiscUtil.formatLocation(sw.getLocation()), sw.getView().getName(), sw.getTrigger())); return true; } } catch (IllegalStateException e) { return false; } return false; } @Override public List<String> onTabComplete(Plugin plugin, CommandSender sender, String[] args) { SMSView view; switch (args.length) { case 1: return getViewCompletions(sender, args[0]); case 2: view = getView(sender, args[0]); return filterPrefix(sender, view.getAttributes().listAttributeKeys(false), args[1]); case 3: view = getView(sender, args[0]); Object o = view.getAttribute(args[1]); String desc = view.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); } } }