#2447: Add API for fluent server connect requests

API allows for more control over callback to see why the callback was performed whilst maintaining backwards compatibility
This commit is contained in:
Mystiflow
2018-07-11 09:22:41 +01:00
committed by md_5
parent 671c4d1341
commit 7ce9ae50e7
3 changed files with 128 additions and 7 deletions

View File

@@ -27,6 +27,7 @@ import lombok.Setter;
import net.md_5.bungee.api.Callback;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.ServerConnectRequest;
import net.md_5.bungee.api.SkinConfiguration;
import net.md_5.bungee.api.Title;
import net.md_5.bungee.api.chat.BaseComponent;
@@ -253,12 +254,21 @@ public final class UserConnection implements ProxiedPlayer
{
Preconditions.checkNotNull( info, "info" );
ServerConnectEvent event = new ServerConnectEvent( this, info, reason );
connect( ServerConnectRequest.builder().callback( callback ).retry( retry ).reason( reason ).target( info ).build() );
}
@Override
public void connect(final ServerConnectRequest request)
{
Preconditions.checkNotNull( request, "request" );
final Callback<ServerConnectRequest.Result> callback = request.getResult();
ServerConnectEvent event = new ServerConnectEvent( this, request.getTarget(), request.getReason() );
if ( bungee.getPluginManager().callEvent( event ).isCancelled() )
{
if ( callback != null )
{
callback.done( false, null );
callback.done( ServerConnectRequest.Result.EVENT_CANCEL, null );
}
if ( getServer() == null && !ch.isClosing() )
@@ -274,7 +284,7 @@ public final class UserConnection implements ProxiedPlayer
{
if ( callback != null )
{
callback.done( false, null );
callback.done( ServerConnectRequest.Result.ALREADY_CONNECTED, null );
}
sendMessage( bungee.getTranslation( "already_connected" ) );
@@ -284,7 +294,7 @@ public final class UserConnection implements ProxiedPlayer
{
if ( callback != null )
{
callback.done( false, null );
callback.done( ServerConnectRequest.Result.ALREADY_CONNECTING, null );
}
sendMessage( bungee.getTranslation( "already_connecting" ) );
@@ -312,7 +322,7 @@ public final class UserConnection implements ProxiedPlayer
{
if ( callback != null )
{
callback.done( future.isSuccess(), future.cause() );
callback.done( ( future.isSuccess() ) ? ServerConnectRequest.Result.SUCCESS : ServerConnectRequest.Result.FAIL, future.cause() );
}
if ( !future.isSuccess() )
@@ -321,7 +331,7 @@ public final class UserConnection implements ProxiedPlayer
pendingConnects.remove( target );
ServerInfo def = updateAndGetNextServer( target );
if ( retry && def != null && ( getServer() == null || def != getServer().getInfo() ) )
if ( request.isRetry() && def != null && ( getServer() == null || def != getServer().getInfo() ) )
{
sendMessage( bungee.getTranslation( "fallback_lobby" ) );
connect( def, null, true, ServerConnectEvent.Reason.LOBBY_FALLBACK );
@@ -339,7 +349,7 @@ public final class UserConnection implements ProxiedPlayer
.channel( PipelineUtils.getChannel() )
.group( ch.getHandle().eventLoop() )
.handler( initializer )
.option( ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000 ) // TODO: Configurable
.option( ChannelOption.CONNECT_TIMEOUT_MILLIS, request.getConnectTimeout() )
.remoteAddress( target.getAddress() );
// Windows is bugged, multi homed users will just have to live with random connecting IPs
if ( getPendingConnection().getListener().isSetLocalAddress() && !PlatformDependent.isWindows() )