diff --git a/module/cmd-send/src/main/java/net/md_5/bungee/module/cmd/send/CommandSend.java b/module/cmd-send/src/main/java/net/md_5/bungee/module/cmd/send/CommandSend.java index 7129293d..4ca18d9e 100644 --- a/module/cmd-send/src/main/java/net/md_5/bungee/module/cmd/send/CommandSend.java +++ b/module/cmd-send/src/main/java/net/md_5/bungee/module/cmd/send/CommandSend.java @@ -1,11 +1,23 @@ package net.md_5.bungee.module.cmd.send; +import com.google.common.base.Joiner; import com.google.common.collect.ImmutableSet; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Set; +import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.ServerConnectRequest; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.ServerConnectEvent; @@ -15,6 +27,69 @@ import net.md_5.bungee.api.plugin.TabExecutor; public class CommandSend extends Command implements TabExecutor { + protected static class SendCallback + { + + private final Map> results = new HashMap<>(); + private final CommandSender sender; + private int count = 0; + + public SendCallback(CommandSender sender) + { + this.sender = sender; + for ( ServerConnectRequest.Result result : ServerConnectRequest.Result.values() ) + { + results.put( result, new ArrayList() ); + } + } + + public void lastEntryDone() + { + sender.sendMessage( ChatColor.GREEN.toString() + ChatColor.BOLD + "Send Results:" ); + for ( Map.Entry> entry : results.entrySet() ) + { + ComponentBuilder builder = new ComponentBuilder( "" ); + if ( !entry.getValue().isEmpty() ) + { + builder.event( new HoverEvent( HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder( Joiner.on( ", " ).join( entry.getValue() ) ).color( ChatColor.YELLOW ).create() ) ); + } + builder.append( entry.getKey().name() + ": " ).color( ChatColor.GREEN ); + builder.append( "" + entry.getValue().size() ).bold( true ); + sender.sendMessage( builder.create() ); + } + } + + public static class Entry implements Callback + { + + private final SendCallback callback; + private final ProxiedPlayer target; + + public Entry(SendCallback callback, ProxiedPlayer target) + { + this.callback = callback; + this.target = target; + this.callback.count++; + } + + @Override + public void done(ServerConnectRequest.Result result, Throwable error) + { + callback.results.get( result ).add( target.getName() ); + if ( result == ServerConnectRequest.Result.SUCCESS ) + { + target.sendMessage( ProxyServer.getInstance().getTranslation( "you_got_summoned", target.getName(), callback.sender.getName() ) ); + } + + if ( --callback.count == 0 ) + { + callback.lastEntryDone(); + } + } + } + } + public CommandSend() { super( "send", "bungeecord.command.send" ); @@ -28,19 +103,17 @@ public class CommandSend extends Command implements TabExecutor sender.sendMessage( ProxyServer.getInstance().getTranslation( "send_cmd_usage" ) ); return; } - ServerInfo target = ProxyServer.getInstance().getServerInfo( args[1] ); - if ( target == null ) + ServerInfo server = ProxyServer.getInstance().getServerInfo( args[1] ); + if ( server == null ) { sender.sendMessage( ProxyServer.getInstance().getTranslation( "no_server" ) ); return; } + List targets; if ( args[0].equalsIgnoreCase( "all" ) ) { - for ( ProxiedPlayer p : ProxyServer.getInstance().getPlayers() ) - { - summon( p, target, sender ); - } + targets = new ArrayList<>( ProxyServer.getInstance().getPlayers() ); } else if ( args[0].equalsIgnoreCase( "current" ) ) { if ( !( sender instanceof ProxiedPlayer ) ) @@ -49,20 +122,14 @@ public class CommandSend extends Command implements TabExecutor return; } ProxiedPlayer player = (ProxiedPlayer) sender; - for ( ProxiedPlayer p : player.getServer().getInfo().getPlayers() ) - { - summon( p, target, sender ); - } + targets = new ArrayList<>( player.getServer().getInfo().getPlayers() ); } else { // If we use a server name, send the entire server. This takes priority over players. ServerInfo serverTarget = ProxyServer.getInstance().getServerInfo( args[0] ); if ( serverTarget != null ) { - for ( ProxiedPlayer p : serverTarget.getPlayers() ) - { - summon( p, target, sender ); - } + targets = new ArrayList<>( serverTarget.getPlayers() ); } else { ProxiedPlayer player = ProxyServer.getInstance().getPlayer( args[0] ); @@ -71,19 +138,24 @@ public class CommandSend extends Command implements TabExecutor sender.sendMessage( ProxyServer.getInstance().getTranslation( "user_not_online" ) ); return; } - summon( player, target, sender ); + targets = Collections.singletonList( player ); } } - sender.sendMessage( ProxyServer.getInstance().getTranslation( "successfully_summoned" ) ); - } - private void summon(ProxiedPlayer player, ServerInfo target, CommandSender sender) - { - if ( player.getServer() != null && !player.getServer().getInfo().equals( target ) ) + final SendCallback callback = new SendCallback( sender ); + Iterator iterator = targets.iterator(); + while ( iterator.hasNext() ) { - player.connect( target, ServerConnectEvent.Reason.COMMAND ); - player.sendMessage( ProxyServer.getInstance().getTranslation( "you_got_summoned", target.getName(), sender.getName() ) ); + ProxiedPlayer target = iterator.next(); + ServerConnectRequest request = ServerConnectRequest.builder() + .target( server ) + .reason( ServerConnectEvent.Reason.COMMAND ) + .callback( new SendCallback.Entry( callback, target ) ) + .build(); + target.connect( request ); } + + sender.sendMessage( ChatColor.DARK_GREEN + "Attempting to send " + targets.size() + " players to " + server.getName() ); } @Override