aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/down.sql1
-rw-r--r--planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/up.sql1
-rw-r--r--planetwars-server/src/db/matches.rs21
-rw-r--r--planetwars-server/src/modules/matches.rs12
-rw-r--r--planetwars-server/src/schema.rs1
5 files changed, 32 insertions, 4 deletions
diff --git a/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/down.sql b/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/down.sql
new file mode 100644
index 0000000..41ee396
--- /dev/null
+++ b/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/down.sql
@@ -0,0 +1 @@
+ALTER TABLE match_players DROP COLUMN had_errors; \ No newline at end of file
diff --git a/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/up.sql b/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/up.sql
new file mode 100644
index 0000000..68ac0b7
--- /dev/null
+++ b/planetwars-server/migrations/2022-10-13-195242_add_had_errors_to_match_players/up.sql
@@ -0,0 +1 @@
+ALTER TABLE match_players ADD COLUMN had_errors boolean; \ No newline at end of file
diff --git a/planetwars-server/src/db/matches.rs b/planetwars-server/src/db/matches.rs
index d628b14..43e93a3 100644
--- a/planetwars-server/src/db/matches.rs
+++ b/planetwars-server/src/db/matches.rs
@@ -55,6 +55,7 @@ pub struct MatchPlayer {
pub match_id: i32,
pub player_id: i32,
pub code_bundle_id: Option<i32>,
+ pub had_errors: Option<bool>,
}
pub struct MatchPlayerData {
@@ -190,7 +191,7 @@ pub fn list_bot_matches(
amount,
};
- let matches = lbm.get_results::<MatchBase>(conn)?;
+ let matches = lbm.get_results(conn)?;
fetch_full_match_data(matches, conn)
}
@@ -294,6 +295,24 @@ pub fn save_match_result(id: i32, result: MatchResult, conn: &mut PgConnection)
Ok(())
}
+pub fn set_player_had_errors(
+ match_id: i32,
+ player_id: i32,
+ had_errors: bool,
+ conn: &mut PgConnection,
+) -> QueryResult<()> {
+ let num_modified = diesel::update(match_players::table)
+ .filter(match_players::match_id.eq(match_id))
+ .filter(match_players::player_id.eq(player_id))
+ .set(match_players::had_errors.eq(had_errors))
+ .execute(conn)?;
+ if num_modified == 0 {
+ Err(diesel::result::Error::NotFound)
+ } else {
+ Ok(())
+ }
+}
+
#[derive(QueryableByName)]
pub struct BotStatsRecord {
#[diesel(sql_type = Text)]
diff --git a/planetwars-server/src/modules/matches.rs b/planetwars-server/src/modules/matches.rs
index 71e8a98..489a9fa 100644
--- a/planetwars-server/src/modules/matches.rs
+++ b/planetwars-server/src/modules/matches.rs
@@ -1,4 +1,4 @@
-use diesel::{PgConnection, QueryResult};
+use diesel::{Connection, PgConnection, QueryResult};
use planetwars_matchrunner::{self as runner, docker_runner::DockerBotSpec, BotSpec, MatchConfig};
use runner::MatchOutcome;
use std::{path::PathBuf, sync::Arc};
@@ -176,8 +176,14 @@ async fn run_match_task(
winner: outcome.winner.map(|w| (w - 1) as i32), // player numbers in matchrunner start at 1
};
- db::matches::save_match_result(match_id, result, &mut conn)
- .expect("could not save match result");
+ conn.transaction(|conn| {
+ for (player_id, player_outcome) in outcome.player_outcomes.iter().enumerate() {
+ let had_errors = player_outcome.had_errors || player_outcome.crashed;
+ db::matches::set_player_had_errors(match_id, player_id as i32, had_errors, conn)?;
+ }
+ db::matches::save_match_result(match_id, result, conn)
+ })
+ .expect("could not save match result");
outcome
}
diff --git a/planetwars-server/src/schema.rs b/planetwars-server/src/schema.rs
index 27ebebe..2c5ab2a 100644
--- a/planetwars-server/src/schema.rs
+++ b/planetwars-server/src/schema.rs
@@ -53,6 +53,7 @@ diesel::table! {
match_id -> Int4,
player_id -> Int4,
bot_version_id -> Nullable<Int4>,
+ had_errors -> Nullable<Bool>,
}
}