mirror of
https://codeberg.org/icewind/tf-log-parser.git
synced 2026-06-03 10:14:10 +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
|
||||
{
|
||||
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))
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue