1111
1212import java .util .ArrayList ;
1313import java .util .List ;
14+ import java .util .Map ;
1415import java .util .concurrent .TimeUnit ;
1516
1617import static com .jaimemartz .playerbalancer .utils .MessageUtils .safeNull ;
1718
18- //TODO I don't like this, improve it
1919public abstract class ConnectionIntent {
2020 protected final PlayerBalancer plugin ;
2121 protected final ProxiedPlayer player ;
@@ -24,7 +24,7 @@ public abstract class ConnectionIntent {
2424 public ConnectionIntent (PlayerBalancer plugin , ProxiedPlayer player , ProviderType provider , ServerSection section , List <ServerInfo > servers ) {
2525 this .plugin = plugin ;
2626 this .player = player ;
27- this .section = section ;
27+ this .section = tryRoute ( player , section ) ;
2828
2929 MessageUtils .send (player , plugin .getSettings ().getMessagesProps ().getConnectingMessage (),
3030 (str ) -> str .replace ("{section}" , section .getName ())
@@ -101,9 +101,33 @@ private ServerInfo fetchServer(ProxiedPlayer player, ServerSection section, Prov
101101 return null ;
102102 }
103103
104+ private ServerSection tryRoute (ProxiedPlayer player , ServerSection section ) {
105+ if (plugin .getSettings ().getFeaturesProps ().getPermissionRouterProps ().isEnabled ()) {
106+ Map <String , String > routes = plugin .getSettings ().getFeaturesProps ().getPermissionRouterProps ().getRules ().get (section .getName ());
107+
108+ if (routes != null ) {
109+ for (Map .Entry <String , String > route : routes .entrySet ()) {
110+ if (player .hasPermission (route .getKey ())) {
111+ ServerSection bind = plugin .getSectionManager ().getByName (route .getValue ());
112+ ServerSection current = plugin .getSectionManager ().getByPlayer (player );
113+
114+ if (bind != null ) {
115+ if (current == bind )
116+ break ;
117+
118+ return bind ;
119+ }
120+
121+ break ;
122+ }
123+ }
124+ }
125+ }
126+ return section ;
127+ }
128+
104129 public abstract void connect (ServerInfo server , Callback <Boolean > callback );
105130
106- //TODO Create this as a type
107131 public static void simple (PlayerBalancer plugin , ProxiedPlayer player , ServerSection section ) {
108132 new ConnectionIntent (plugin , player , section ) {
109133 @ Override
@@ -113,7 +137,6 @@ public void connect(ServerInfo server, Callback<Boolean> callback) {
113137 };
114138 }
115139
116- //TODO Create this as a type
117140 public static void direct (PlayerBalancer plugin , ProxiedPlayer player , ServerInfo server , Callback <Boolean > callback ) {
118141 PlayerLocker .lock (player );
119142 player .connect (server , (result , throwable ) -> {
0 commit comments