mirror of
https://codeberg.org/icewind/tf-log-parser.git
synced 2026-06-03 18:24:09 +02:00
even more edge cases
This commit is contained in:
parent
2dcd691f66
commit
b01029ddde
4 changed files with 93 additions and 60 deletions
|
|
@ -32,7 +32,7 @@ impl GlobalData for HighestDamageHandler {
|
||||||
..
|
..
|
||||||
}) = event
|
}) = event
|
||||||
{
|
{
|
||||||
let damage = damage.get();
|
let damage = *damage as u32;
|
||||||
match &mut self.current {
|
match &mut self.current {
|
||||||
Some((_, current_damage)) if damage > *current_damage => {
|
Some((_, current_damage)) if damage > *current_damage => {
|
||||||
self.current = Some((subject, damage))
|
self.current = Some((subject, damage))
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use indicatif::ParallelProgressIterator;
|
use indicatif::{ParallelProgressIterator, ProgressBar, ProgressStyle};
|
||||||
use main_error::MainError;
|
use main_error::MainError;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use std::env::args;
|
use std::env::args;
|
||||||
|
|
@ -6,7 +6,7 @@ use std::ffi::OsStr;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::hint::black_box;
|
use std::hint::black_box;
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
use std::time::Instant;
|
use std::time::{Duration, Instant};
|
||||||
use tf_log_parser::parse;
|
use tf_log_parser::parse;
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
|
|
@ -18,12 +18,40 @@ fn main() -> Result<(), MainError> {
|
||||||
let count = AtomicUsize::default();
|
let count = AtomicUsize::default();
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
|
|
||||||
WalkDir::new(path)
|
let style = ProgressStyle::with_template(
|
||||||
|
"[{elapsed_precise}] {wide_bar:.cyan/blue} {per_sec:!} {pos:>7}/{len:7}",
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let pb = ProgressBar::new_spinner();
|
||||||
|
pb.enable_steady_tick(Duration::from_millis(120));
|
||||||
|
pb.set_style(
|
||||||
|
ProgressStyle::with_template("[{elapsed_precise}] {spinner:.blue} {msg}")
|
||||||
|
.unwrap()
|
||||||
|
.tick_strings(&[
|
||||||
|
"▹▹▹▹▹",
|
||||||
|
"▸▹▹▹▹",
|
||||||
|
"▹▸▹▹▹",
|
||||||
|
"▹▹▸▹▹",
|
||||||
|
"▹▹▹▸▹",
|
||||||
|
"▹▹▹▹▸",
|
||||||
|
"▪▪▪▪▪",
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
pb.set_message("Collecting paths...");
|
||||||
|
|
||||||
|
let paths: Vec<_> = WalkDir::new(path)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.flatten()
|
.flatten()
|
||||||
.par_bridge()
|
.filter(|entry| entry.path().extension() == Some(OsStr::new("log")))
|
||||||
.progress_count(2_500_000)
|
.collect();
|
||||||
.for_each(|entry| {
|
|
||||||
|
pb.finish_with_message("Done");
|
||||||
|
|
||||||
|
let bar = ProgressBar::new(paths.len() as u64);
|
||||||
|
bar.set_style(style);
|
||||||
|
|
||||||
|
paths.into_par_iter().progress_with(bar).for_each(|entry| {
|
||||||
let path = entry.path();
|
let path = entry.path();
|
||||||
if path.extension() == Some(OsStr::new("log")) {
|
if path.extension() == Some(OsStr::new("log")) {
|
||||||
// let _ = print!("{} - ", path.display());
|
// let _ = print!("{} - ", path.display());
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,8 @@ pub enum Error {
|
||||||
Malformed,
|
Malformed,
|
||||||
#[error("Incomplete logfile")]
|
#[error("Incomplete logfile")]
|
||||||
Incomplete,
|
Incomplete,
|
||||||
|
#[error("Line should be skipped")]
|
||||||
|
Skip,
|
||||||
#[error("Malformed subject: {0}")]
|
#[error("Malformed subject: {0}")]
|
||||||
Subject(#[from] SubjectError),
|
Subject(#[from] SubjectError),
|
||||||
#[error("{0}")]
|
#[error("{0}")]
|
||||||
|
|
@ -82,6 +84,9 @@ pub fn parse_with_handler<Handler: EventHandler>(
|
||||||
let raw_event = match event_res {
|
let raw_event = match event_res {
|
||||||
Ok(raw_event) => raw_event,
|
Ok(raw_event) => raw_event,
|
||||||
Err(Error::Incomplete) if events.next().is_none() => break,
|
Err(Error::Incomplete) if events.next().is_none() => break,
|
||||||
|
Err(Error::Skip) => {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
Err(e) => return Err(e),
|
Err(e) => return Err(e),
|
||||||
};
|
};
|
||||||
let should_handle = Handler::does_handle(raw_event.ty);
|
let should_handle = Handler::does_handle(raw_event.ty);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::common::Team;
|
use crate::common::Team;
|
||||||
use crate::parsing::{skip, split_once, split_subject_end};
|
use crate::parsing::{skip, skip_matches, split_once, split_subject_end};
|
||||||
use crate::{Error, Result};
|
use crate::{Error, Result};
|
||||||
use crate::{SubjectError, SubjectId};
|
use crate::{SubjectError, SubjectId};
|
||||||
use chrono::{NaiveDate, NaiveDateTime};
|
use chrono::{NaiveDate, NaiveDateTime};
|
||||||
|
|
@ -25,7 +25,7 @@ impl<'a> RawEvent<'a> {
|
||||||
|
|
||||||
fn event_parser(input: &str) -> Result<RawEvent> {
|
fn event_parser(input: &str) -> Result<RawEvent> {
|
||||||
if input.len() < 24 {
|
if input.len() < 24 {
|
||||||
return Err(Error::Incomplete);
|
return Err(Error::Skip);
|
||||||
}
|
}
|
||||||
let date = RawDate(&input[0..21]);
|
let date = RawDate(&input[0..21]);
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ fn event_parser(input: &str) -> Result<RawEvent> {
|
||||||
|
|
||||||
let (input, ty) = event_type_parser(input)?;
|
let (input, ty) = event_type_parser(input)?;
|
||||||
|
|
||||||
let params = &input[((!input.is_empty() && ty != RawEventType::Unknown) as usize)..];
|
let params = skip_matches(input, b' ').0;
|
||||||
|
|
||||||
Ok(RawEvent {
|
Ok(RawEvent {
|
||||||
date,
|
date,
|
||||||
|
|
@ -189,9 +189,9 @@ fn test_subject_parser() {
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Logos)]
|
#[derive(Copy, Clone, Debug, PartialEq, Logos)]
|
||||||
pub enum RawEventType {
|
pub enum RawEventType {
|
||||||
#[token(r#"joined"#)]
|
#[token(r#"joined "#)]
|
||||||
Joined,
|
Joined,
|
||||||
#[token(r#"changed role"#)]
|
#[token(r#"changed role "#)]
|
||||||
RoleChange,
|
RoleChange,
|
||||||
#[token(r#"triggered "shot_fired""#)]
|
#[token(r#"triggered "shot_fired""#)]
|
||||||
ShotFired,
|
ShotFired,
|
||||||
|
|
@ -203,21 +203,21 @@ pub enum RawEventType {
|
||||||
Healed,
|
Healed,
|
||||||
#[token(r#"triggered "first_heal_after_spawn""#)]
|
#[token(r#"triggered "first_heal_after_spawn""#)]
|
||||||
FirstHeal,
|
FirstHeal,
|
||||||
#[token(r#"killed"#)]
|
#[token(r#"killed "#)]
|
||||||
Killed,
|
Killed,
|
||||||
#[token(r#"triggered "kill assist""#)]
|
#[token(r#"triggered "kill assist""#)]
|
||||||
KillAssist,
|
KillAssist,
|
||||||
#[token(r#"committed suicide"#)]
|
#[token(r#"committed suicide "#)]
|
||||||
Suicide,
|
Suicide,
|
||||||
#[token(r#"triggered "domination""#)]
|
#[token(r#"triggered "domination""#)]
|
||||||
Domination,
|
Domination,
|
||||||
#[token(r#"triggered "revenge""#)]
|
#[token(r#"triggered "revenge""#)]
|
||||||
Revenge,
|
Revenge,
|
||||||
#[token(r#"spawned"#)]
|
#[token(r#"spawned "#)]
|
||||||
Spawned,
|
Spawned,
|
||||||
#[token(r#"say_team"#)]
|
#[token(r#"say_team "#)]
|
||||||
SayTeam,
|
SayTeam,
|
||||||
#[token(r#"say"#)]
|
#[token(r#"say "#)]
|
||||||
Say,
|
Say,
|
||||||
#[token(r#"triggered "empty_uber""#)]
|
#[token(r#"triggered "empty_uber""#)]
|
||||||
EmptyUber,
|
EmptyUber,
|
||||||
|
|
@ -235,7 +235,7 @@ pub enum RawEventType {
|
||||||
ObjectDetonated,
|
ObjectDetonated,
|
||||||
#[token(r#"triggered "player_extinguished""#)]
|
#[token(r#"triggered "player_extinguished""#)]
|
||||||
Extinguished,
|
Extinguished,
|
||||||
#[token(r#"picked up"#)]
|
#[token(r#"picked up "#)]
|
||||||
PickedUp,
|
PickedUp,
|
||||||
#[token(r#"triggered "medic_death""#)]
|
#[token(r#"triggered "medic_death""#)]
|
||||||
MedicDeath,
|
MedicDeath,
|
||||||
|
|
@ -275,9 +275,9 @@ pub enum RawEventType {
|
||||||
CaptureBlocked,
|
CaptureBlocked,
|
||||||
#[token(r#"triggered "Game_Over""#)]
|
#[token(r#"triggered "Game_Over""#)]
|
||||||
GameOver,
|
GameOver,
|
||||||
#[token(r#"current"#)]
|
#[token(r#"current "#)]
|
||||||
CurrentScore,
|
CurrentScore,
|
||||||
#[token(r#"final"#)]
|
#[token(r#"final "#)]
|
||||||
FinalScore,
|
FinalScore,
|
||||||
#[token(r#"triggered "Intermission_Win_Limit""#)]
|
#[token(r#"triggered "Intermission_Win_Limit""#)]
|
||||||
WinLimit,
|
WinLimit,
|
||||||
|
|
@ -289,25 +289,25 @@ pub enum RawEventType {
|
||||||
Request,
|
Request,
|
||||||
#[token(r#"Response: "#)]
|
#[token(r#"Response: "#)]
|
||||||
Response,
|
Response,
|
||||||
#[token(r#"connected,"#)]
|
#[token(r#"connected, "#)]
|
||||||
Connected,
|
Connected,
|
||||||
#[token(r#"disconnected"#)]
|
#[token(r#"disconnected "#)]
|
||||||
Disconnect,
|
Disconnect,
|
||||||
#[token(r#"STEAM USERID validated"#)]
|
#[token(r#"STEAM USERID validated "#)]
|
||||||
SteamIdValidated,
|
SteamIdValidated,
|
||||||
#[token(r#"entered the game"#)]
|
#[token(r#"entered the game "#)]
|
||||||
Entered,
|
Entered,
|
||||||
#[token(r#"file started"#)]
|
#[token(r#"file started "#)]
|
||||||
LogFileStarted,
|
LogFileStarted,
|
||||||
#[token(r#"file closed"#)]
|
#[token(r#"file closed "#)]
|
||||||
LogFileClosed,
|
LogFileClosed,
|
||||||
#[token(r#"The log might have not been uploaded."#)]
|
#[token(r#"The log might have not been uploaded. "#)]
|
||||||
NotUploaded,
|
NotUploaded,
|
||||||
#[token(r#"mode started"#)]
|
#[token(r#"mode started "#)]
|
||||||
TournamentModeStarted,
|
TournamentModeStarted,
|
||||||
#[token(r#"triggered "flagevent""#)]
|
#[token(r#"triggered "flagevent""#)]
|
||||||
FlagEvent,
|
FlagEvent,
|
||||||
#[token(r#"cvars"#)]
|
#[token(r#"cvars "#)]
|
||||||
CVars,
|
CVars,
|
||||||
#[error]
|
#[error]
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue