even more edge cases

This commit is contained in:
Robin Appelman 2023-03-18 15:14:37 +01:00
commit b01029ddde
4 changed files with 93 additions and 60 deletions

View file

@ -32,7 +32,7 @@ impl GlobalData for HighestDamageHandler {
..
}) = event
{
let damage = damage.get();
let damage = *damage as u32;
match &mut self.current {
Some((_, current_damage)) if damage > *current_damage => {
self.current = Some((subject, damage))

View file

@ -1,4 +1,4 @@
use indicatif::ParallelProgressIterator;
use indicatif::{ParallelProgressIterator, ProgressBar, ProgressStyle};
use main_error::MainError;
use rayon::prelude::*;
use std::env::args;
@ -6,7 +6,7 @@ use std::ffi::OsStr;
use std::fs;
use std::hint::black_box;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::time::Instant;
use std::time::{Duration, Instant};
use tf_log_parser::parse;
use walkdir::WalkDir;
@ -18,12 +18,40 @@ fn main() -> Result<(), MainError> {
let count = AtomicUsize::default();
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()
.flatten()
.par_bridge()
.progress_count(2_500_000)
.for_each(|entry| {
.filter(|entry| entry.path().extension() == Some(OsStr::new("log")))
.collect();
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();
if path.extension() == Some(OsStr::new("log")) {
// let _ = print!("{} - ", path.display());

View file

@ -29,6 +29,8 @@ pub enum Error {
Malformed,
#[error("Incomplete logfile")]
Incomplete,
#[error("Line should be skipped")]
Skip,
#[error("Malformed subject: {0}")]
Subject(#[from] SubjectError),
#[error("{0}")]
@ -82,6 +84,9 @@ pub fn parse_with_handler<Handler: EventHandler>(
let raw_event = match event_res {
Ok(raw_event) => raw_event,
Err(Error::Incomplete) if events.next().is_none() => break,
Err(Error::Skip) => {
continue;
}
Err(e) => return Err(e),
};
let should_handle = Handler::does_handle(raw_event.ty);

View file

@ -1,5 +1,5 @@
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::{SubjectError, SubjectId};
use chrono::{NaiveDate, NaiveDateTime};
@ -25,7 +25,7 @@ impl<'a> RawEvent<'a> {
fn event_parser(input: &str) -> Result<RawEvent> {
if input.len() < 24 {
return Err(Error::Incomplete);
return Err(Error::Skip);
}
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 params = &input[((!input.is_empty() && ty != RawEventType::Unknown) as usize)..];
let params = skip_matches(input, b' ').0;
Ok(RawEvent {
date,
@ -189,9 +189,9 @@ fn test_subject_parser() {
#[derive(Copy, Clone, Debug, PartialEq, Logos)]
pub enum RawEventType {
#[token(r#"joined"#)]
#[token(r#"joined "#)]
Joined,
#[token(r#"changed role"#)]
#[token(r#"changed role "#)]
RoleChange,
#[token(r#"triggered "shot_fired""#)]
ShotFired,
@ -203,21 +203,21 @@ pub enum RawEventType {
Healed,
#[token(r#"triggered "first_heal_after_spawn""#)]
FirstHeal,
#[token(r#"killed"#)]
#[token(r#"killed "#)]
Killed,
#[token(r#"triggered "kill assist""#)]
KillAssist,
#[token(r#"committed suicide"#)]
#[token(r#"committed suicide "#)]
Suicide,
#[token(r#"triggered "domination""#)]
Domination,
#[token(r#"triggered "revenge""#)]
Revenge,
#[token(r#"spawned"#)]
#[token(r#"spawned "#)]
Spawned,
#[token(r#"say_team"#)]
#[token(r#"say_team "#)]
SayTeam,
#[token(r#"say"#)]
#[token(r#"say "#)]
Say,
#[token(r#"triggered "empty_uber""#)]
EmptyUber,
@ -235,7 +235,7 @@ pub enum RawEventType {
ObjectDetonated,
#[token(r#"triggered "player_extinguished""#)]
Extinguished,
#[token(r#"picked up"#)]
#[token(r#"picked up "#)]
PickedUp,
#[token(r#"triggered "medic_death""#)]
MedicDeath,
@ -275,9 +275,9 @@ pub enum RawEventType {
CaptureBlocked,
#[token(r#"triggered "Game_Over""#)]
GameOver,
#[token(r#"current"#)]
#[token(r#"current "#)]
CurrentScore,
#[token(r#"final"#)]
#[token(r#"final "#)]
FinalScore,
#[token(r#"triggered "Intermission_Win_Limit""#)]
WinLimit,
@ -289,25 +289,25 @@ pub enum RawEventType {
Request,
#[token(r#"Response: "#)]
Response,
#[token(r#"connected,"#)]
#[token(r#"connected, "#)]
Connected,
#[token(r#"disconnected"#)]
#[token(r#"disconnected "#)]
Disconnect,
#[token(r#"STEAM USERID validated"#)]
#[token(r#"STEAM USERID validated "#)]
SteamIdValidated,
#[token(r#"entered the game"#)]
#[token(r#"entered the game "#)]
Entered,
#[token(r#"file started"#)]
#[token(r#"file started "#)]
LogFileStarted,
#[token(r#"file closed"#)]
#[token(r#"file closed "#)]
LogFileClosed,
#[token(r#"The log might have not been uploaded."#)]
#[token(r#"The log might have not been uploaded. "#)]
NotUploaded,
#[token(r#"mode started"#)]
#[token(r#"mode started "#)]
TournamentModeStarted,
#[token(r#"triggered "flagevent""#)]
FlagEvent,
#[token(r#"cvars"#)]
#[token(r#"cvars "#)]
CVars,
#[error]
Unknown,