diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/SendCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/SendCommand.java index a0435983..77cd2193 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/SendCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/SendCommand.java @@ -20,6 +20,7 @@ package de.steamwar.velocitycore.commands; import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.ServerInfo; import de.steamwar.command.PreviousArguments; @@ -34,22 +35,29 @@ import de.steamwar.velocitycore.VelocityCore; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; public class SendCommand extends SWCommand { + // /send to only [] + // can also be current + public SendCommand() { super("send", UserPerm.TEAM); } - @Register - public void sendToServer(Chatter sender, Player send, RegisteredServer server) { - send.createConnectionRequest(server).fireAndForget(); + @Register("to") + public void sendCommand(Chatter sender, RegisteredServer toServer, @ArrayLength(min = 1) Player... players) { + for (Player player : players) { + player.createConnectionRequest(toServer).fireAndForget(); + } } @ClassMapper(value = RegisteredServer.class, local = true) public TypeMapper subserverTypeMapper() { return new TypeMapper<>() { private boolean check(SteamwarUser user, RegisteredServer registeredServer) { + if (registeredServer == null) return false; ServerInfo serverInfo = registeredServer.getServerInfo(); String name = serverInfo.getName(); if (name.contains(" ")) return false; @@ -66,20 +74,55 @@ public class SendCommand extends SWCommand { return registeredServer; } } + + RegisteredServer currentServer = sender.getPlayer().getCurrentServer().map(ServerConnection::getServer).orElse(null); + if (s.equals("current") && check(user, currentServer)) { + return currentServer; + } return null; } @Override public Collection tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) { SteamwarUser user = sender.user(); + List previous = previousArguments.getAll(RegisteredServer.class); + List tabCompletes = new ArrayList<>(); for (RegisteredServer registeredServer : VelocityCore.getProxy().getAllServers()) { + if (previous.contains(registeredServer)) continue; if (check(user, registeredServer)) { tabCompletes.add(registeredServer.getServerInfo().getName()); } } + + Player player = sender.getPlayer(); + if (player != null) { + RegisteredServer currentServer = player.getCurrentServer().map(ServerConnection::getServer).orElse(null); + if (currentServer != null && !previous.contains(currentServer) && check(user, currentServer)) { + tabCompletes.add("current"); + } + } + return tabCompletes; } }; } + + @ClassMapper(value = Player.class, local = true) + public TypeMapper playerTypeMapper() { + return new TypeMapper<>() { + @Override + public Player map(Chatter sender, PreviousArguments previousArguments, String s) { + return VelocityCore.getProxy().getPlayer(s).orElse(null); + } + + @Override + public Collection tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) { + List previous = previousArguments.getAll(RegisteredServer.class); + if (previous.isEmpty()) return null; + Collection players = previous.get(0).getPlayersConnected(); + return VelocityCore.getProxy().getAllPlayers().stream().filter(player -> !players.contains(player)).map(Player::getUsername).collect(Collectors.toList()); + } + }; + } }