1414import java .time .Instant ;
1515import java .util .*;
1616import java .util .concurrent .ExecutionException ;
17- import java .util .concurrent .Semaphore ;
17+ import java .util .concurrent .locks . ReentrantLock ;
1818
1919import static org .zeroBzeroT .anarchyqueue .Components .mm ;
2020
@@ -28,7 +28,7 @@ public class Queue {
2828
2929 private final ProxyServer proxyServer ;
3030
31- private final Semaphore mutex = new Semaphore ( 1 );
31+ private final ReentrantLock lock = new ReentrantLock ( );
3232
3333 private final Deque <Player > playerQueue ;
3434
@@ -79,14 +79,14 @@ public void onServerConnected(ServerConnectedEvent event) {
7979 return ;
8080
8181 // Add Player to queue
82+ lock .lock ();
8283 try {
83- mutex .acquire ();
8484 playerQueue .add (event .getPlayer ());
8585 log .info (mm ("<white>" + event .getPlayer ().getUsername () + "<dark_aqua> was added to the <light_purple>queue<dark_aqua>. Queue count is " + playerQueue .size () + "." ));
86- } catch (InterruptedException e1 ) {
87- e1 . printStackTrace ( );
86+ } catch (Exception e ) {
87+ log . error ( e . getMessage () );
8888 } finally {
89- mutex . release ();
89+ lock . unlock ();
9090 }
9191 }
9292
@@ -97,16 +97,16 @@ public void onServerConnected(ServerConnectedEvent event) {
9797 public void onKickedFromServer (KickedFromServerEvent event ) {
9898 if (event .getServer ().getServerInfo ().getName ().equals (Config .target )) {
9999 // kick from target server
100+ lock .lock ();
100101 try {
101- mutex .acquire ();
102102 Player player = event .getPlayer ();
103103 Component reason = event .getServerKickReason ().isPresent () ? event .getServerKickReason ().get () : mm ("Kicked without a reason." );
104104
105105 KickOrRequeue (player , reason );
106- } catch (InterruptedException e1 ) {
107- e1 . printStackTrace ( );
106+ } catch (Exception e ) {
107+ log . error ( e . getMessage () );
108108 } finally {
109- mutex . release ();
109+ lock . unlock ();
110110 }
111111 }
112112 }
@@ -168,9 +168,8 @@ public void flushQueue() {
168168 // TODO: full notification
169169 return ;
170170
171+ lock .lock ();
171172 try {
172- mutex .acquire ();
173-
174173 Player currPlayer = null ;
175174
176175 // try to find the first player that got not kicked recently
@@ -183,46 +182,44 @@ public void flushQueue() {
183182 }
184183
185184 // no player to connect to the main server
186- if (currPlayer == null ) {
187- mutex .release ();
188- return ;
189- }
190-
191- // connect next player
192- UUID uuid = currPlayer .getUniqueId ();
193- Player finalCurrPlayer = currPlayer ;
194-
195- serverQueue .getPlayersConnected ().stream ()
196- .filter (p -> p .getUniqueId ().equals (uuid ))
197- .findAny ().ifPresentOrElse (p -> {
198- p .sendMessage (mm (Config .messageConnecting ));
199- try {
200- var conReq = p .createConnectionRequest (serverMain ).connect ().get ();
201-
202- if (conReq .isSuccessful ()) {
203- playerQueue .removeFirst ();
204- // Clear the title
205- if (Config .sendTitle ) {
206- sendTitle (finalCurrPlayer , mm (" " ), mm (" " ), 0 , 0 , 0 );
185+ if (currPlayer != null ) {
186+
187+ // connect next player
188+ UUID uuid = currPlayer .getUniqueId ();
189+ Player finalCurrPlayer = currPlayer ;
190+
191+ serverQueue .getPlayersConnected ().stream ()
192+ .filter (p -> p .getUniqueId ().equals (uuid ))
193+ .findAny ().ifPresentOrElse (p -> {
194+ p .sendMessage (mm (Config .messageConnecting ));
195+ try {
196+ var conReq = p .createConnectionRequest (serverMain ).connect ().get ();
197+
198+ if (conReq .isSuccessful ()) {
199+ playerQueue .removeFirst ();
200+ // Clear the title
201+ if (Config .sendTitle ) {
202+ sendTitle (finalCurrPlayer , mm (" " ), mm (" " ), 0 , 0 , 0 );
203+ }
204+ log .info (mm ("<white>" + p .getUsername () + "<dark_aqua> connected to server <aqua>" + serverMain .getServerInfo ().getName () + "<dark_aqua>. Queue count is " + serverQueue .getPlayersConnected ().size () + ". Main count is " + (serverMain .getPlayersConnected ().size ()) + " of " + Config .maxPlayers + "." ));
205+ } else {
206+ var reason = conReq .getReasonComponent ().isPresent () ? conReq .getReasonComponent ().get () : mm ("Connection to the main server failed." );
207+ KickOrRequeue (finalCurrPlayer , reason );
207208 }
208- log . info ( mm ( "<white>" + p . getUsername () + "<dark_aqua> connected to server <aqua>" + serverMain . getServerInfo (). getName () + "<dark_aqua>. Queue count is " + serverQueue . getPlayersConnected (). size () + ". Main count is " + ( serverMain . getPlayersConnected (). size ()) + " of " + Config . maxPlayers + "." ));
209- } else {
210- var reason = conReq . getReasonComponent (). isPresent () ? conReq . getReasonComponent (). get () : mm ( "Connection to the main server failed." );
211- KickOrRequeue (finalCurrPlayer , reason );
209+ } catch ( InterruptedException | ExecutionException e ) {
210+ log . error ( mm ( "<white>" + p . getUsername () + "s<red> connection to server <aqua>" + Config . target + "<red> failed with an exception: " + e . getMessage ()));
211+ // server down?
212+ kickedPlayers . put (finalCurrPlayer , Instant . now (). getEpochSecond () );
212213 }
213- } catch (InterruptedException | ExecutionException e ) {
214- log .error (mm ("<white>" + p .getUsername () + "s<red> connection to server <aqua>" + Config .target + "<red> failed with an exception: " + e .getMessage ()));
215- // server down?
216- kickedPlayers .put (finalCurrPlayer , Instant .now ().getEpochSecond ());
217- }
218- },
219- // player is in the queue, but not connected to the queue server
220- playerQueue ::removeFirst
221- );
222- } catch (InterruptedException e ) {
223- e .printStackTrace ();
214+ },
215+ // player is in the queue, but not connected to the queue server
216+ playerQueue ::removeFirst
217+ );
218+ }
219+ } catch (Exception e ) {
220+ log .error (e .getMessage ());
224221 } finally {
225- mutex . release ();
222+ lock . unlock ();
226223 }
227224 }
228225
0 commit comments