feat: custom bracket seeding
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -27,4 +27,6 @@ target
|
|||||||
|
|
||||||
.env
|
.env
|
||||||
|
|
||||||
node_modules/
|
node_modules/
|
||||||
|
|
||||||
|
bracket_pairings.txt
|
||||||
@@ -1160,6 +1160,10 @@ impl Server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"BRACKET_PAIRINGS" => {
|
||||||
|
let file = std::fs::read_to_string("bracket_pairings.txt").unwrap_or_default();
|
||||||
|
msg += file.replace("\n", ",").as_str();
|
||||||
|
}
|
||||||
"MOVE_WAIT" => {
|
"MOVE_WAIT" => {
|
||||||
let wait_time = *self.waiting_timeout.read().await as f64 / 1000f64;
|
let wait_time = *self.waiting_timeout.read().await as f64 / 1000f64;
|
||||||
msg += wait_time.to_string().as_str();
|
msg += wait_time.to_string().as_str();
|
||||||
@@ -1212,6 +1216,14 @@ impl Server {
|
|||||||
}
|
}
|
||||||
*self.max_timeout.write().await = (max_time.unwrap() * 1000.0) as u64;
|
*self.max_timeout.write().await = (max_time.unwrap() * 1000.0) as u64;
|
||||||
}
|
}
|
||||||
|
"BRACKET_PAIRINGS" => {
|
||||||
|
let file = data_value.replace(",", "\n");
|
||||||
|
let result = std::fs::write("bracket_pairings.txt", file);
|
||||||
|
match result {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(_) => return Err(anyhow::anyhow!("ERROR:INVALID:SET")),
|
||||||
|
}
|
||||||
|
}
|
||||||
&_ => return Err(anyhow::anyhow!("ERROR:INVALID:SET")),
|
&_ => return Err(anyhow::anyhow!("ERROR:INVALID:SET")),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ pub struct KnockoutBracket {
|
|||||||
pub previous_wait: u64,
|
pub previous_wait: u64,
|
||||||
pub completed: bool,
|
pub completed: bool,
|
||||||
pub started: bool,
|
pub started: bool,
|
||||||
|
pub skip_round_robin: bool,
|
||||||
pub clients: Clients,
|
pub clients: Clients,
|
||||||
pub matches: Matches,
|
pub matches: Matches,
|
||||||
pub observers: Observers,
|
pub observers: Observers,
|
||||||
@@ -31,7 +32,13 @@ impl KnockoutBracket {
|
|||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
while i < self.pairings.len() {
|
while i < self.pairings.len() {
|
||||||
let player1_username = self.pairings[i].clone();
|
let player1_username = self.pairings[i].clone();
|
||||||
let player2_username = self.pairings[i + 1].clone();
|
let player2_username = self.pairings.get(i + 1);
|
||||||
|
|
||||||
|
if player2_username.is_none() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let player2_username = player2_username.unwrap().clone();
|
||||||
|
|
||||||
let match_id: u32 = gen_match_id(&self.matches).await;
|
let match_id: u32 = gen_match_id(&self.matches).await;
|
||||||
self.current_matches.push(match_id);
|
self.current_matches.push(match_id);
|
||||||
@@ -98,8 +105,27 @@ impl KnockoutBracket {
|
|||||||
impl Tournament for KnockoutBracket {
|
impl Tournament for KnockoutBracket {
|
||||||
async fn new(ready_players: &[String], server: &Server) -> KnockoutBracket {
|
async fn new(ready_players: &[String], server: &Server) -> KnockoutBracket {
|
||||||
let previous_wait = server.waiting_timeout.read().await.clone();
|
let previous_wait = server.waiting_timeout.read().await.clone();
|
||||||
|
let bracket_file = std::fs::read_to_string("bracket_pairings.txt").unwrap_or_default();
|
||||||
|
let bracket_players = bracket_file.split('\n').collect::<Vec<_>>();
|
||||||
|
let mut skip_round_robin =
|
||||||
|
!bracket_players.is_empty() && bracket_players.len() == ready_players.len();
|
||||||
|
|
||||||
*server.waiting_timeout.write().await = 5;
|
if skip_round_robin {
|
||||||
|
for player in bracket_players {
|
||||||
|
let mut player_match = false;
|
||||||
|
for ready_player in ready_players {
|
||||||
|
if player == ready_player {
|
||||||
|
player_match = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !player_match {
|
||||||
|
skip_round_robin = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
KnockoutBracket {
|
KnockoutBracket {
|
||||||
blitz_round_robin: RoundRobin::new(ready_players, server).await,
|
blitz_round_robin: RoundRobin::new(ready_players, server).await,
|
||||||
@@ -109,6 +135,7 @@ impl Tournament for KnockoutBracket {
|
|||||||
previous_wait,
|
previous_wait,
|
||||||
completed: false,
|
completed: false,
|
||||||
started: false,
|
started: false,
|
||||||
|
skip_round_robin,
|
||||||
clients: server.clients.clone(),
|
clients: server.clients.clone(),
|
||||||
matches: server.matches.clone(),
|
matches: server.matches.clone(),
|
||||||
observers: server.observers.clone(),
|
observers: server.observers.clone(),
|
||||||
@@ -144,7 +171,11 @@ impl Tournament for KnockoutBracket {
|
|||||||
|
|
||||||
self.data.push(self.pairings.clone());
|
self.data.push(self.pairings.clone());
|
||||||
self.create_matches().await;
|
self.create_matches().await;
|
||||||
broadcast_message(&self.observers, &format!("GET:TOURNAMENT_DATA:{}", self.get_data().unwrap())).await;
|
broadcast_message(
|
||||||
|
&self.observers,
|
||||||
|
&format!("GET:TOURNAMENT_DATA:{}", self.get_data().unwrap()),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,13 +186,39 @@ impl Tournament for KnockoutBracket {
|
|||||||
} else {
|
} else {
|
||||||
self.data.push(self.pairings.clone());
|
self.data.push(self.pairings.clone());
|
||||||
self.create_matches().await;
|
self.create_matches().await;
|
||||||
broadcast_message(&self.observers, &format!("GET:TOURNAMENT_DATA:{}", self.get_data().unwrap())).await;
|
broadcast_message(
|
||||||
|
&self.observers,
|
||||||
|
&format!("GET:TOURNAMENT_DATA:{}", self.get_data().unwrap()),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn start(&mut self, server: &Server) {
|
async fn start(&mut self, server: &Server) {
|
||||||
self.blitz_round_robin.start(server).await;
|
if self.skip_round_robin {
|
||||||
|
let bracket_file = std::fs::read_to_string("bracket_pairings.txt").unwrap_or_default();
|
||||||
|
self.blitz_round_robin.completed = true;
|
||||||
|
self.started = true;
|
||||||
|
|
||||||
|
let mut i = 0;
|
||||||
|
bracket_file.split('\n').into_iter().for_each(|line| {
|
||||||
|
self.players.push((line.to_string(), i, false));
|
||||||
|
self.pairings.push(line.to_string());
|
||||||
|
i += 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
self.data.push(self.pairings.clone());
|
||||||
|
self.create_matches().await;
|
||||||
|
broadcast_message(
|
||||||
|
&self.observers,
|
||||||
|
&format!("GET:TOURNAMENT_DATA:{}", self.get_data().unwrap()),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
} else {
|
||||||
|
*server.waiting_timeout.write().await = 5;
|
||||||
|
self.blitz_round_robin.start(server).await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn cancel(&mut self, server: &Server) {
|
async fn cancel(&mut self, server: &Server) {
|
||||||
@@ -329,7 +386,7 @@ impl Tournament for KnockoutBracket {
|
|||||||
fn get_players(&self) -> Vec<String> {
|
fn get_players(&self) -> Vec<String> {
|
||||||
self.usernames.clone()
|
self.usernames.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_winner(&self) -> Option<String> {
|
fn get_winner(&self) -> Option<String> {
|
||||||
if self.completed {
|
if self.completed {
|
||||||
return Some(self.pairings[0].clone());
|
return Some(self.pairings[0].clone());
|
||||||
@@ -337,12 +394,12 @@ impl Tournament for KnockoutBracket {
|
|||||||
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_data(&self) -> Option<String> {
|
fn get_data(&self) -> Option<String> {
|
||||||
if !self.started {
|
if !self.started {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut message = String::new();
|
let mut message = String::new();
|
||||||
for round in self.data.iter() {
|
for round in self.data.iter() {
|
||||||
for player in round.iter() {
|
for player in round.iter() {
|
||||||
@@ -352,7 +409,7 @@ impl Tournament for KnockoutBracket {
|
|||||||
message.pop();
|
message.pop();
|
||||||
message.push('|');
|
message.push('|');
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.data.len() > 0 {
|
if self.data.len() > 0 {
|
||||||
message.pop();
|
message.pop();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ impl RoundRobin {
|
|||||||
|
|
||||||
self.current_matches.push(match_id.clone());
|
self.current_matches.push(match_id.clone());
|
||||||
let match_guard = new_match.read().await;
|
let match_guard = new_match.read().await;
|
||||||
|
|
||||||
let mut player1 = clients_guard.get(&player1_username.0).unwrap().write().await;
|
let mut player1 = clients_guard.get(&player1_username.0).unwrap().write().await;
|
||||||
player1.current_match = Some(match_id);
|
player1.current_match = Some(match_id);
|
||||||
player1.ready = false;
|
player1.ready = false;
|
||||||
@@ -212,7 +212,7 @@ impl Tournament for RoundRobin {
|
|||||||
fn get_players(&self) -> Vec<String> {
|
fn get_players(&self) -> Vec<String> {
|
||||||
self.usernames.clone()
|
self.usernames.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_winner(&self) -> Option<String> {
|
fn get_winner(&self) -> Option<String> {
|
||||||
if !self.is_completed() {
|
if !self.is_completed() {
|
||||||
return None;
|
return None;
|
||||||
@@ -230,7 +230,7 @@ impl Tournament for RoundRobin {
|
|||||||
|
|
||||||
winner
|
winner
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_data(&self) -> Option<String> {
|
fn get_data(&self) -> Option<String> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user