package com.intellectualcrafters.plot.commands; import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.PlotArea; import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.RunnableVal2; import com.intellectualcrafters.plot.object.RunnableVal3; import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MathMan; import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.UUIDHandler; import com.plotsquared.general.commands.Command; import com.plotsquared.general.commands.CommandDeclaration; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.UUID; @CommandDeclaration( command = "visit", permission = "plots.visit", description = "Visit someones plot", usage = "/plot visit [<player>|<alias>|<world>|<id>] [#]", aliases = {"v", "tp", "teleport", "goto", "home", "h"}, requiredType = RequiredType.NONE, category = CommandCategory.TELEPORT) public class Visit extends Command { public Visit() { super(MainCommand.getInstance(), true); } @Override public Collection<Command> tab(PlotPlayer player, String[] args, boolean space) { return tabOf(player, args, space, getUsage()); } @Override public void execute(final PlotPlayer player, String[] args, RunnableVal3<Command, Runnable, Runnable> confirm, final RunnableVal2<Command, CommandResult> whenDone) throws CommandException { if (args.length == 1 && args[0].contains(":")) { args = args[0].split(":"); } int page = Integer.MIN_VALUE; Collection<Plot> unsorted = null; PlotArea sortByArea = player.getApplicablePlotArea(); boolean shouldSortByArea = Settings.Teleport.PER_WORLD_VISIT; switch (args.length) { case 3: if (!MathMan.isInteger(args[1])) { C.NOT_VALID_NUMBER.send(player, "(1, ∞)"); C.COMMAND_SYNTAX.send(player, getUsage()); return; } page = Integer.parseInt(args[2]); case 2: if (!MathMan.isInteger(args[1])) { sortByArea = PS.get().getPlotAreaByString(args[1]); if (sortByArea == null) { C.NOT_VALID_NUMBER.send(player, "(1, ∞)"); C.COMMAND_SYNTAX.send(player, getUsage()); return; } UUID user = UUIDHandler.getUUIDFromString(args[0]); if (user == null) { C.COMMAND_SYNTAX.send(player, getUsage()); return; } unsorted = PS.get().getBasePlots(user); shouldSortByArea = true; break; } page = Integer.parseInt(args[1]); case 1: UUID user = (args.length == 2 || !MathMan.isInteger(args[0])) ? UUIDHandler.getUUIDFromString(args[0]) : null; if (page == Integer.MIN_VALUE && user == null && MathMan.isInteger(args[0])) { page = Integer.parseInt(args[0]); unsorted = PS.get().getBasePlots(player); break; } if (user != null) { unsorted = PS.get().getBasePlots(user); } else { Plot plot = MainUtil.getPlotFromString(player, args[0], true); if (plot != null) { unsorted = Collections.singletonList(plot.getBasePlot(false)); } } break; case 0: page = 1; unsorted = PS.get().getPlots(player); break; default: } if (page == Integer.MIN_VALUE) { page = 1; } if (unsorted == null || unsorted.isEmpty()) { C.FOUND_NO_PLOTS.send(player); return; } Iterator<Plot> iterator = unsorted.iterator(); while (iterator.hasNext()) { if (!iterator.next().isBasePlot()) { iterator.remove(); } } if (page < 1 || page > unsorted.size()) { C.NOT_VALID_NUMBER.send(player, "(1, " + unsorted.size() + ")"); return; } List<Plot> plots; if (shouldSortByArea) { plots = PS.get().sortPlots(unsorted, PS.SortType.CREATION_DATE, sortByArea); } else { plots = PS.get().sortPlotsByTemp(unsorted); } final Plot plot = plots.get(page - 1); if (!plot.hasOwner()) { if (!Permissions.hasPermission(player, C.PERMISSION_VISIT_UNOWNED)) { C.NO_PERMISSION.send(player, C.PERMISSION_VISIT_UNOWNED); return; } } else if (plot.isOwner(player.getUUID())) { if (!Permissions.hasPermission(player, C.PERMISSION_VISIT_OWNED) && !Permissions.hasPermission(player, C.PERMISSION_HOME)) { C.NO_PERMISSION.send(player, C.PERMISSION_VISIT_OWNED); return; } } else if (plot.isAdded(player.getUUID())) { if (!Permissions.hasPermission(player, C.PERMISSION_SHARED)) { C.NO_PERMISSION.send(player, C.PERMISSION_SHARED); return; } } else { if (!Permissions.hasPermission(player, C.PERMISSION_VISIT_OTHER)) { C.NO_PERMISSION.send(player, C.PERMISSION_VISIT_OTHER); return; } } confirm.run(this, new Runnable() { @Override public void run() { if (plot.teleportPlayer(player)) { whenDone.run(Visit.this, CommandResult.SUCCESS); } else { whenDone.run(Visit.this, CommandResult.FAILURE); } } }, new Runnable() { @Override public void run() { whenDone.run(Visit.this, CommandResult.FAILURE); } }); } }