66import com .jaimemartz .playerbalancer .ping .ServerStatus ;
77import com .jaimemartz .playerbalancer .section .ServerSection ;
88import com .jaimemartz .playerbalancer .utils .MessageUtils ;
9+ import net .md_5 .bungee .api .Callback ;
910import net .md_5 .bungee .api .config .ServerInfo ;
1011import net .md_5 .bungee .api .connection .ProxiedPlayer ;
1112
1213import java .util .ArrayList ;
1314import java .util .List ;
1415import java .util .concurrent .TimeUnit ;
16+ import java .util .concurrent .atomic .AtomicBoolean ;
1517
1618public abstract class ConnectionIntent {
1719 protected final PlayerBalancer plugin ;
@@ -34,12 +36,13 @@ public ConnectionIntent(PlayerBalancer plugin, ProxiedPlayer player, ProviderTyp
3436 if (section .getProvider () != ProviderType .NONE ) {
3537 ServerInfo target = this .fetchServer (plugin , player , section , provider , servers );
3638 if (target != null ) {
37- this .connect (target );
38-
39- //todo only send this if the above method returns true
40- MessageUtils .send (player , ConfigEntries .CONNECTED_MESSAGE .get (),
41- (str ) -> str .replace ("{server}" , target .getName ())
42- );
39+ this .connect (target , (response , throwable ) -> {
40+ if (response ) { //only if the connect has been executed correctly
41+ MessageUtils .send (player , ConfigEntries .CONNECTED_MESSAGE .get (),
42+ (str ) -> str .replace ("{server}" , target .getName ())
43+ );
44+ }
45+ });
4346 } else {
4447 MessageUtils .send (player , ConfigEntries .FAILURE_MESSAGE .get ());
4548 }
@@ -74,7 +77,6 @@ private ServerInfo fetchServer(PlayerBalancer plugin, ProxiedPlayer player, Serv
7477 int intents = ConfigEntries .SERVER_CHECK_ATTEMPTS .get ();
7578 for (int intent = 1 ; intent <= intents ; intent ++) {
7679 if (servers .size () == 0 ) return null ;
77- if (servers .size () == 1 ) return servers .get (0 );
7880
7981 ServerInfo target = provider .requestTarget (plugin , section , servers , player );
8082 if (target == null ) continue ;
@@ -90,23 +92,26 @@ private ServerInfo fetchServer(PlayerBalancer plugin, ProxiedPlayer player, Serv
9092 return null ;
9193 }
9294
93- public abstract void connect (ServerInfo server );
95+ public abstract void connect (ServerInfo server , Callback < Boolean > callback );
9496
97+ //todo create this as a type
9598 public static void simple (PlayerBalancer plugin , ProxiedPlayer player , ServerSection section ) {
9699 new ConnectionIntent (plugin , player , section ) {
97100 @ Override
98- public void connect (ServerInfo server ) {
99- direct (plugin , player , server );
101+ public void connect (ServerInfo server , Callback < Boolean > callback ) {
102+ ConnectionIntent . direct (plugin , player , server , callback );
100103 }
101104 };
102105 }
103106
104- //todo make this return true or false depending if the player really got moved or not
105- public static void direct (PlayerBalancer plugin , ProxiedPlayer player , ServerInfo server ) {
107+ //todo create this as a type
108+ public static void direct (PlayerBalancer plugin , ProxiedPlayer player , ServerInfo server , Callback < Boolean > callback ) {
106109 PlayerLocker .lock (player );
107- player .connect (server );
108- plugin .getProxy ().getScheduler ().schedule (plugin , () -> {
109- PlayerLocker .unlock (player );
110- }, 5 , TimeUnit .SECONDS );
110+ player .connect (server , (result , throwable ) -> {
111+ plugin .getProxy ().getScheduler ().schedule (plugin , () -> {
112+ PlayerLocker .unlock (player );
113+ }, 5 , TimeUnit .SECONDS );
114+ callback .done (result , throwable );
115+ });
111116 }
112117}
0 commit comments