diff --git a/src/server.rs b/src/server.rs index 66cba04..29b9b0b 100644 --- a/src/server.rs +++ b/src/server.rs @@ -507,6 +507,8 @@ impl Server { client.color = Color::None; drop(client); + self.matches.write().await.remove(¤t_match_id).unwrap(); + let mut tournament_guard = self.tournament.write().await; let tourney = tournament_guard.as_mut().unwrap(); tourney @@ -520,8 +522,6 @@ impl Server { ) .await; drop(tournament_guard); - - self.matches.write().await.remove(¤t_match_id).unwrap(); } return Ok(()); } @@ -588,6 +588,7 @@ impl Server { } matches_guard.remove(¤t_match_id).unwrap(); + drop(matches_guard); if self.tournament.read().await.is_some() { let mut tournament_guard = self.tournament.write().await; @@ -604,8 +605,7 @@ impl Server { .inform_winner(winner, current_match_id, player1.clone(), player2.clone()) .await; - if matches_guard.is_empty() { - drop(matches_guard); + if self.matches.read().await.is_empty() { drop(clients_guard); tourney.write().await.next(&self).await; @@ -744,12 +744,12 @@ impl Server { opponent.color = Color::None; drop(opponent); + matches.write().await.remove(&match_id).unwrap(); + let mut tournament_guard = tournament.write().await; let tourney = tournament_guard.as_mut().unwrap(); tourney.write().await.inform_winner(client_username, match_id, player1, player2).await; drop(tournament_guard); - - matches.write().await.remove(&match_id).unwrap(); } } })); diff --git a/src/tournaments/knockout_bracket.rs b/src/tournaments/knockout_bracket.rs index 8aaa8fd..3b29631 100644 --- a/src/tournaments/knockout_bracket.rs +++ b/src/tournaments/knockout_bracket.rs @@ -276,78 +276,86 @@ impl Tournament for KnockoutBracket { } } - if player1_track.2 { + if player1_track.2 || player2_track.2 { if player1_track.1 < player2_track.1 { winner = player2_track.0.clone(); } else { winner = player1_track.0.clone(); } - } - - let match_id: u32 = gen_match_id(&self.matches).await; - self.current_matches.push(match_id); - let new_match = Arc::new(RwLock::new(Match::new( - match_id, - player1.clone(), - player2.clone(), - false, - ))); - - let match_guard = new_match.read().await; - let clients_guard = self.clients.read().await; - let mut player1 = clients_guard.get(&player1).unwrap().write().await; - - player1.current_match = Some(match_id); - player1.ready = false; - let player1_name = player1.username.clone(); - - if match_guard.player1 == player1.username { - player1.color = Color::Red; - let _ = send(&player1.connection, "GAME:START:1"); } else { - player1.color = Color::Yellow; - let _ = send(&player1.connection, "GAME:START:0"); + for player in self.players.iter_mut() { + if player.0 == player1 || player.0 == player2 { + player.2 = true; + } + } + + let new_match_id: u32 = gen_match_id(&self.matches).await; + self.current_matches.push(new_match_id); + let new_match = Arc::new(RwLock::new(Match::new_with_order( + new_match_id, + player2.clone(), + player1.clone(), + false, + ))); + + let match_guard = new_match.read().await; + let clients_guard = self.clients.read().await; + let mut player1 = clients_guard.get(&player1).unwrap().write().await; + + player1.current_match = Some(new_match_id); + player1.ready = false; + let player1_name = player1.username.clone(); + + if match_guard.player1 == player1.username { + player1.color = Color::Red; + let _ = send(&player1.connection, "GAME:START:1"); + } else { + player1.color = Color::Yellow; + let _ = send(&player1.connection, "GAME:START:0"); + } + + drop(player1); + + let mut player2 = clients_guard.get(&player2).unwrap().write().await; + + player2.current_match = Some(new_match_id); + player2.ready = false; + let player2_name = player2.username.clone(); + + if match_guard.player1 == player2.username { + player2.color = Color::Red; + let _ = send(&player2.connection, "GAME:START:1"); + } else { + player2.color = Color::Yellow; + let _ = send(&player2.connection, "GAME:START:0"); + } + + drop(player2); + + broadcast_message( + &self.observers, + &format!("READY:{}:{}", player1_name, false), + ) + .await; + broadcast_message( + &self.observers, + &format!("READY:{}:{}", player2_name, false), + ) + .await; + + self.matches.write().await.insert(new_match_id, new_match.clone()); + broadcast_message( + &self.observers, + &format!( + "GAME:START:{},{},{}", + new_match_id, match_guard.player1, match_guard.player2 + ), + ) + .await; + + self.current_matches.retain(|v| *v != match_id); + return; } - - drop(player1); - - let mut player2 = clients_guard.get(&player2).unwrap().write().await; - - player2.current_match = Some(match_id); - player2.ready = false; - let player2_name = player2.username.clone(); - - if match_guard.player1 == player2.username { - player2.color = Color::Red; - let _ = send(&player2.connection, "GAME:START:1"); - } else { - player2.color = Color::Yellow; - let _ = send(&player2.connection, "GAME:START:0"); - } - - drop(player2); - - broadcast_message( - &self.observers, - &format!("READY:{}:{}", player1_name, false), - ) - .await; - broadcast_message( - &self.observers, - &format!("READY:{}:{}", player2_name, false), - ) - .await; - - self.current_matches.push(match_id); - self.matches.write().await.insert(match_id, new_match.clone()); - broadcast_message( - &self.observers, - &format!( - "GAME:START:{},{},{}", - match_id, match_guard.player1, match_guard.player2 - ), - ) - .await; } let mut loser = String::new(); diff --git a/src/types.rs b/src/types.rs index f54c607..db3e750 100644 --- a/src/types.rs +++ b/src/types.rs @@ -88,6 +88,19 @@ impl Match { } } + pub fn new_with_order(id: u32, player1: String, player2: String, demo_mode: bool) -> Match { + Match { + id, + demo_mode, + board: vec![vec![Color::None; 6]; 7], + ledger: Vec::new(), + wait_thread: None, + timeout_thread: None, + player1, + player2, + } + } + pub fn place_token(&mut self, color: Color, column: usize) { for i in 0..6 { if self.board[column][i] == Color::None {