aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--planetwars-server/src/db/matches.rs30
-rw-r--r--planetwars-server/src/routes/matches.rs20
2 files changed, 47 insertions, 3 deletions
diff --git a/planetwars-server/src/db/matches.rs b/planetwars-server/src/db/matches.rs
index c884a63..b806dd3 100644
--- a/planetwars-server/src/db/matches.rs
+++ b/planetwars-server/src/db/matches.rs
@@ -142,6 +142,36 @@ pub fn list_public_matches(amount: i64, conn: &PgConnection) -> QueryResult<Vec<
})
}
+pub fn list_bot_matches(
+ bot_id: i32,
+ amount: i64,
+ conn: &PgConnection,
+) -> QueryResult<Vec<FullMatchData>> {
+ conn.transaction(|| {
+ let matches = matches::table
+ .filter(matches::is_public.eq(true))
+ .order_by(matches::created_at.desc())
+ .inner_join(match_players::table)
+ .inner_join(
+ bot_versions::table
+ .on(match_players::bot_version_id.eq(bot_versions::id.nullable())),
+ )
+ .filter(bot_versions::bot_id.eq(bot_id))
+ .limit(amount)
+ .select((
+ matches::id,
+ matches::state,
+ matches::log_path,
+ matches::created_at,
+ matches::winner,
+ matches::is_public,
+ ))
+ .get_results::<MatchBase>(conn)?;
+
+ fetch_full_match_data(matches, conn)
+ })
+}
+
// TODO: maybe unify this with matchdata?
pub struct FullMatchData {
pub base: MatchBase,
diff --git a/planetwars-server/src/routes/matches.rs b/planetwars-server/src/routes/matches.rs
index fde8471..c1957d4 100644
--- a/planetwars-server/src/routes/matches.rs
+++ b/planetwars-server/src/routes/matches.rs
@@ -8,7 +8,10 @@ use serde::{Deserialize, Serialize};
use std::{path::PathBuf, sync::Arc};
use crate::{
- db::matches::{self, MatchState},
+ db::{
+ self,
+ matches::{self, MatchState},
+ },
DatabaseConnection, GlobalConfig,
};
@@ -35,6 +38,8 @@ pub struct ListRecentMatchesParams {
// TODO: implement these
before: Option<NaiveDateTime>,
after: Option<NaiveDateTime>,
+
+ bot: Option<String>,
}
const MAX_NUM_RETURNED_MATCHES: usize = 100;
@@ -47,9 +52,18 @@ pub async fn list_recent_matches(
let count = std::cmp::min(
params.count.unwrap_or(DEFAULT_NUM_RETURNED_MATCHES),
MAX_NUM_RETURNED_MATCHES,
- );
+ ) as i64;
+
+ let matches = match params.bot {
+ Some(bot_name) => {
+ let bot = db::bots::find_bot_by_name(&bot_name, &conn)
+ .map_err(|_| StatusCode::BAD_REQUEST)?;
+ matches::list_bot_matches(bot.id, count, &conn)
+ }
+ None => matches::list_public_matches(count, &conn),
+ };
- matches::list_public_matches(count as i64, &conn)
+ matches
.map_err(|_| StatusCode::BAD_REQUEST)
.map(|matches| Json(matches.into_iter().map(match_data_to_api).collect()))
}