Add basic analysis results, like scoreboard
This commit is contained in:
@@ -49,7 +49,22 @@ pub struct AnalysisInput {
|
||||
#[derive(Debug)]
|
||||
pub struct BaseInfo {
|
||||
pub map: String,
|
||||
pub players: Vec<()>,
|
||||
pub players: Vec<(BasePlayerInfo, BasePlayerStats)>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct BasePlayerInfo {
|
||||
pub name: String,
|
||||
pub steam_id: String,
|
||||
pub team: i32,
|
||||
pub color: i32,
|
||||
pub ingame_id: i32,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct BasePlayerStats {
|
||||
pub kills: usize,
|
||||
pub deaths: usize,
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(input))]
|
||||
@@ -66,7 +81,7 @@ pub fn analyse_base(input: AnalysisInput) -> BaseInfo {
|
||||
|
||||
tracing::info!("Header: {:?}", header);
|
||||
|
||||
dbg!(&output.player_info);
|
||||
let mut player_stats = std::collections::HashMap::with_capacity(output.player_info.len());
|
||||
|
||||
for event in output.events.iter() {
|
||||
match event {
|
||||
@@ -76,52 +91,58 @@ pub fn analyse_base(input: AnalysisInput) -> BaseInfo {
|
||||
csdemo::DemoEvent::RankReveal(reveal) => {}
|
||||
csdemo::DemoEvent::GameEvent(gevent) => {
|
||||
match gevent {
|
||||
csdemo::game_event::GameEvent::BeginNewMatch(_) => {
|
||||
player_stats.clear();
|
||||
}
|
||||
csdemo::game_event::GameEvent::PlayerTeam(pteam) => {
|
||||
tracing::info!("{:?}", pteam);
|
||||
// tracing::info!("{:?}", pteam);
|
||||
}
|
||||
csdemo::game_event::GameEvent::RoundOfficiallyEnded(r_end) => {
|
||||
tracing::info!("{:?}", r_end);
|
||||
// tracing::info!("{:?}", r_end);
|
||||
}
|
||||
csdemo::game_event::GameEvent::PlayerDeath(pdeath) => {
|
||||
tracing::info!("{:?}", pdeath);
|
||||
// tracing::info!("{:?}", pdeath);
|
||||
|
||||
let player_died_id = pdeath.userid.unwrap();
|
||||
|
||||
let player_died = player_stats.entry(player_died_id).or_insert(BasePlayerStats {
|
||||
kills: 0,
|
||||
deaths: 0,
|
||||
});
|
||||
player_died.deaths += 1;
|
||||
|
||||
if let Some(attacker_id) = pdeath.attacker {
|
||||
let attacker = player_stats.entry(attacker_id).or_insert(BasePlayerStats {
|
||||
kills: 0,
|
||||
deaths: 0,
|
||||
});
|
||||
attacker.kills += 1;
|
||||
|
||||
// tracing::trace!("{:?} killed {:?}", attacker_id, player_died_id);
|
||||
}
|
||||
}
|
||||
other => {}
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
match event.name.as_str() {
|
||||
"team_info" => {
|
||||
tracing::info!("Team Info: {:?}", event);
|
||||
}
|
||||
"player_spawn" => {
|
||||
// tracing::info!("Player Spawn: {:?}", event);
|
||||
}
|
||||
"team_score" => {
|
||||
tracing::info!("Team Score: {:?}", event);
|
||||
}
|
||||
"game_end" => {
|
||||
tracing::info!("Game End: {:?}", event);
|
||||
}
|
||||
"match_end_conditions" => {
|
||||
tracing::info!("Match End Conditions: {:?}", event);
|
||||
}
|
||||
"switch_team" => {
|
||||
tracing::info!("Switch Team: {:?}", event);
|
||||
}
|
||||
"player_given_c4" => {
|
||||
tracing::info!("Player Given C4: {:?}", event);
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
*/
|
||||
}
|
||||
|
||||
let players: Vec<_> = player_stats.into_iter().filter_map(|(id, stats)| {
|
||||
let player = output.player_info.get(&id)?;
|
||||
|
||||
Some((BasePlayerInfo {
|
||||
name: player.name.clone(),
|
||||
steam_id: player.xuid.to_string(),
|
||||
team: player.team,
|
||||
color: player.color,
|
||||
ingame_id: id.0,
|
||||
}, stats))
|
||||
}).collect();
|
||||
|
||||
let map = header.map_name().to_owned();
|
||||
|
||||
BaseInfo {
|
||||
map,
|
||||
players: Vec::new(),
|
||||
players,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,23 +114,49 @@ pub async fn run_analysis(
|
||||
|
||||
let mut db_con = crate::db_connection().await;
|
||||
|
||||
let store_info_query = diesel::dsl::insert_into(crate::schema::demo_info::dsl::demo_info)
|
||||
.values(crate::models::DemoInfo {
|
||||
let (player_info, player_stats): (Vec<_>, Vec<_>) = result.players.into_iter().map(|(info, stats)| {
|
||||
(crate::models::DemoPlayer {
|
||||
demo_id,
|
||||
name: info.name,
|
||||
steam_id: info.steam_id.clone(),
|
||||
team: info.team as i16,
|
||||
color: info.color as i16,
|
||||
}, crate::models::DemoPlayerStats {
|
||||
demo_id,
|
||||
steam_id: info.steam_id,
|
||||
deaths: stats.deaths as i16,
|
||||
kills: stats.kills as i16,
|
||||
})
|
||||
}).unzip();
|
||||
|
||||
let demo_info = crate::models::DemoInfo {
|
||||
demo_id,
|
||||
map: result.map,
|
||||
});
|
||||
};
|
||||
|
||||
let store_demo_info_query = diesel::dsl::insert_into(crate::schema::demo_info::dsl::demo_info)
|
||||
.values(&demo_info).on_conflict(crate::schema::demo_info::dsl::demo_id).do_update().set(crate::schema::demo_info::dsl::map.eq(diesel::upsert::excluded(crate::schema::demo_info::dsl::map)));
|
||||
let store_demo_players_query = diesel::dsl::insert_into(crate::schema::demo_players::dsl::demo_players).values(player_info)
|
||||
.on_conflict_do_nothing();
|
||||
let store_demo_player_stats_query = diesel::dsl::insert_into(crate::schema::demo_player_stats::dsl::demo_player_stats)
|
||||
.values(player_stats)
|
||||
.on_conflict((crate::schema::demo_player_stats::dsl::demo_id, crate::schema::demo_player_stats::dsl::steam_id))
|
||||
.do_update()
|
||||
.set((
|
||||
crate::schema::demo_player_stats::dsl::deaths.eq(diesel::upsert::excluded(crate::schema::demo_player_stats::dsl::deaths)),
|
||||
crate::schema::demo_player_stats::dsl::kills.eq(diesel::upsert::excluded(crate::schema::demo_player_stats::dsl::kills)),
|
||||
));
|
||||
let update_process_info =
|
||||
diesel::dsl::update(crate::schema::processing_status::dsl::processing_status)
|
||||
.set(crate::schema::processing_status::dsl::info.eq(1))
|
||||
.filter(crate::schema::processing_status::dsl::demo_id.eq(demo_id));
|
||||
|
||||
tracing::trace!(?store_info_query, "Store demo info query");
|
||||
tracing::trace!(?update_process_info, "Update processing info query");
|
||||
|
||||
db_con
|
||||
.transaction::<'_, '_, '_, _, diesel::result::Error, _>(|conn| {
|
||||
Box::pin(async move {
|
||||
store_info_query.execute(conn).await?;
|
||||
store_demo_info_query.execute(conn).await?;
|
||||
store_demo_players_query.execute(conn).await?;
|
||||
store_demo_player_stats_query.execute(conn).await?;
|
||||
update_process_info.execute(conn).await?;
|
||||
Ok(())
|
||||
})
|
||||
|
||||
@@ -33,6 +33,27 @@ pub struct DemoInfo {
|
||||
pub map: String,
|
||||
}
|
||||
|
||||
#[derive(Queryable, Selectable, Insertable, Debug)]
|
||||
#[diesel(table_name = crate::schema::demo_players)]
|
||||
#[diesel(check_for_backend(diesel::pg::Pg))]
|
||||
pub struct DemoPlayer {
|
||||
pub demo_id: i64,
|
||||
pub steam_id: String,
|
||||
pub name: String,
|
||||
pub team: i16,
|
||||
pub color: i16,
|
||||
}
|
||||
|
||||
#[derive(Queryable, Selectable, Insertable, Debug)]
|
||||
#[diesel(table_name = crate::schema::demo_player_stats)]
|
||||
#[diesel(check_for_backend(diesel::pg::Pg))]
|
||||
pub struct DemoPlayerStats {
|
||||
pub demo_id: i64,
|
||||
pub steam_id: String,
|
||||
pub kills: i16,
|
||||
pub deaths: i16,
|
||||
}
|
||||
|
||||
#[derive(Queryable, Selectable, Insertable, Debug)]
|
||||
#[diesel(table_name = crate::schema::processing_status)]
|
||||
#[diesel(check_for_backend(diesel::pg::Pg))]
|
||||
|
||||
@@ -15,6 +15,25 @@ diesel::table! {
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
demo_player_stats (demo_id, steam_id) {
|
||||
demo_id -> Int8,
|
||||
steam_id -> Text,
|
||||
kills -> Int2,
|
||||
deaths -> Int2,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
demo_players (demo_id, steam_id) {
|
||||
demo_id -> Int8,
|
||||
steam_id -> Text,
|
||||
name -> Text,
|
||||
team -> Int2,
|
||||
color -> Int2,
|
||||
}
|
||||
}
|
||||
|
||||
diesel::table! {
|
||||
demos (demo_id) {
|
||||
steam_id -> Text,
|
||||
@@ -46,11 +65,15 @@ diesel::table! {
|
||||
|
||||
diesel::joinable!(analysis_queue -> demos (demo_id));
|
||||
diesel::joinable!(demo_info -> demos (demo_id));
|
||||
diesel::joinable!(demo_player_stats -> demo_info (demo_id));
|
||||
diesel::joinable!(demo_players -> demo_info (demo_id));
|
||||
diesel::joinable!(processing_status -> demos (demo_id));
|
||||
|
||||
diesel::allow_tables_to_appear_in_same_query!(
|
||||
analysis_queue,
|
||||
demo_info,
|
||||
demo_player_stats,
|
||||
demo_players,
|
||||
demos,
|
||||
processing_status,
|
||||
sessions,
|
||||
|
||||
Reference in New Issue
Block a user