package tc.oc.commons.bukkit.teleport; import javax.inject.Inject; import com.google.common.util.concurrent.ListenableFuture; import com.sk89q.minecraft.util.commands.Command; import com.sk89q.minecraft.util.commands.CommandContext; import com.sk89q.minecraft.util.commands.CommandException; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import tc.oc.minecraft.scheduler.SyncExecutor; import tc.oc.api.users.UserSearchResponse; import tc.oc.commons.bukkit.chat.NameStyle; import tc.oc.commons.bukkit.chat.PlayerComponent; import tc.oc.commons.bukkit.commands.CommandUtils; import tc.oc.commons.bukkit.commands.UserFinder; import tc.oc.commons.bukkit.nick.IdentityProvider; import tc.oc.commons.core.commands.CommandFutureCallback; import tc.oc.commons.core.commands.Commands; import tc.oc.commons.core.commands.TranslatableCommandException; public class TeleportCommands implements Commands { private final SyncExecutor syncExecutor; private final Teleporter teleporter; private final UserFinder userFinder; private final IdentityProvider identityProvider; @Inject TeleportCommands(SyncExecutor syncExecutor, Teleporter teleporter, UserFinder userFinder, IdentityProvider identityProvider) { this.syncExecutor = syncExecutor; this.teleporter = teleporter; this.userFinder = userFinder; this.identityProvider = identityProvider; } @Command( aliases = { "remoteteleport", "rtp", "goto" }, desc = "Teleport to a player anywhere on the network", usage = "[traveler] <destination>", min = 1, max = 2 ) public void remoteTeleport(final CommandContext args, final CommandSender sender) throws CommandException { final Player traveler; final ListenableFuture<UserSearchResponse> future; if(args.argsLength() >= 2) { CommandUtils.assertPermission(sender, Teleporter.PERMISSION_OTHERS); traveler = CommandUtils.findOnlinePlayer(args, sender, 0); future = userFinder.findUser(sender, args, 1); } else { CommandUtils.assertPermission(sender, Teleporter.PERMISSION); traveler = CommandUtils.senderToPlayer(sender); future = userFinder.findUser(sender, args, 0); } syncExecutor.callback( future, CommandFutureCallback.onSuccess(sender, args, result -> { final PlayerComponent playerComponent = new PlayerComponent(identityProvider.createIdentity(result), NameStyle.FANCY); if(!result.online) { throw new TranslatableCommandException("command.playerNotOnline", playerComponent); } else if(result.last_server == null) { // Probably because player has disabled "show current server" throw new TranslatableCommandException("command.playerLocationUnavailable", playerComponent); } else { teleporter.remoteTeleport(traveler, result.last_server, result.user.uuid()); } }) ); } }