Make ProxyPingEvent async

This commit is contained in:
Steve Anton 2014-09-05 20:23:01 -07:00 committed by md_5
parent 65ae8b4c6a
commit bc48ab3fb8
2 changed files with 45 additions and 16 deletions

View File

@ -1,9 +1,9 @@
package net.md_5.bungee.api.event; package net.md_5.bungee.api.event;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.ToString; import lombok.ToString;
import net.md_5.bungee.api.Callback;
import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.ServerPing;
import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.PendingConnection;
import net.md_5.bungee.api.plugin.Event; import net.md_5.bungee.api.plugin.Event;
@ -12,10 +12,9 @@ import net.md_5.bungee.api.plugin.Event;
* Called when the proxy is pinged with packet 0xFE from the server list. * Called when the proxy is pinged with packet 0xFE from the server list.
*/ */
@Data @Data
@AllArgsConstructor
@ToString(callSuper = false) @ToString(callSuper = false)
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class ProxyPingEvent extends Event public class ProxyPingEvent extends AsyncEvent<ProxyPingEvent>
{ {
/** /**
@ -26,4 +25,11 @@ public class ProxyPingEvent extends Event
* The data to respond with. * The data to respond with.
*/ */
private ServerPing response; private ServerPing response;
public ProxyPingEvent(PendingConnection connection, ServerPing response, Callback<ProxyPingEvent> done)
{
super( done );
this.connection = connection;
this.response = response;
}
} }

View File

@ -134,18 +134,33 @@ public class InitialHandler extends PacketHandler implements PendingConnection
{ {
ServerPing legacy = new ServerPing( new ServerPing.Protocol( bungee.getName() + " " + bungee.getGameVersion(), bungee.getProtocolVersion() ), ServerPing legacy = new ServerPing( new ServerPing.Protocol( bungee.getName() + " " + bungee.getGameVersion(), bungee.getProtocolVersion() ),
new ServerPing.Players( listener.getMaxPlayers(), bungee.getOnlineCount(), null ), listener.getMotd(), (Favicon) null ); new ServerPing.Players( listener.getMaxPlayers(), bungee.getOnlineCount(), null ), listener.getMotd(), (Favicon) null );
legacy = bungee.getPluginManager().callEvent( new ProxyPingEvent( this, legacy ) ).getResponse();
Callback<ProxyPingEvent> callback = new Callback<ProxyPingEvent>()
{
@Override
public void done(ProxyPingEvent result, Throwable error)
{
if ( ch.isClosed() )
{
return;
}
ServerPing ping = result.getResponse();
String kickMessage = ChatColor.DARK_BLUE String kickMessage = ChatColor.DARK_BLUE
+ "\00" + 127 + "\00" + 127
+ "\00" + legacy.getVersion().getName() + "\00" + ping.getVersion().getName()
+ "\00" + legacy.getDescription() + "\00" + ping.getDescription()
+ "\00" + legacy.getPlayers().getOnline() + "\00" + ping.getPlayers().getOnline()
+ "\00" + legacy.getPlayers().getMax(); + "\00" + ping.getPlayers().getMax();
ch.getHandle().writeAndFlush( kickMessage ); ch.getHandle().writeAndFlush( kickMessage );
ch.close(); ch.close();
} }
};
bungee.getPluginManager().callEvent( new ProxyPingEvent( this, legacy, callback ) );
}
@Override @Override
public void handle(StatusRequest statusRequest) throws Exception public void handle(StatusRequest statusRequest) throws Exception
@ -166,11 +181,19 @@ public class InitialHandler extends PacketHandler implements PendingConnection
result.setDescription( bungee.getTranslation( "ping_cannot_connect" ) ); result.setDescription( bungee.getTranslation( "ping_cannot_connect" ) );
bungee.getLogger().log( Level.WARNING, "Error pinging remote server", error ); bungee.getLogger().log( Level.WARNING, "Error pinging remote server", error );
} }
result = bungee.getPluginManager().callEvent( new ProxyPingEvent( InitialHandler.this, result ) ).getResponse();
Callback<ProxyPingEvent> callback = new Callback<ProxyPingEvent>()
{
@Override
public void done(ProxyPingEvent pingResult, Throwable error)
{
BungeeCord.getInstance().getConnectionThrottle().unthrottle( getAddress().getAddress() ); BungeeCord.getInstance().getConnectionThrottle().unthrottle( getAddress().getAddress() );
Gson gson = handshake.getProtocolVersion() == ProtocolConstants.MINECRAFT_1_7_2 ? BungeeCord.getInstance().gsonLegacy : BungeeCord.getInstance().gson; Gson gson = handshake.getProtocolVersion() == ProtocolConstants.MINECRAFT_1_7_2 ? BungeeCord.getInstance().gsonLegacy : BungeeCord.getInstance().gson;
unsafe.sendPacket( new StatusResponse( gson.toJson( result ) ) ); unsafe.sendPacket( new StatusResponse( gson.toJson( pingResult.getResponse() ) ) );
}
};
bungee.getPluginManager().callEvent( new ProxyPingEvent( InitialHandler.this, result, callback ) );
} }
}; };