handle more truncateion

This commit is contained in:
Robin Appelman 2023-03-26 14:45:36 +02:00
commit 2cb43e1872
2 changed files with 18 additions and 12 deletions

View file

@ -5,7 +5,7 @@ use crate::module::{
ChatMessages, ClassStatsHandler, HealSpread, MedicStatsBuilder, PlayerHandler, ChatMessages, ClassStatsHandler, HealSpread, MedicStatsBuilder, PlayerHandler,
}; };
pub use crate::subjectmap::SubjectMap; pub use crate::subjectmap::SubjectMap;
use chrono::{Duration, NaiveDateTime}; use chrono::{Duration, NaiveDate, NaiveDateTime};
pub use event::{Event, EventMeta, GameEvent}; pub use event::{Event, EventMeta, GameEvent};
use memchr::memmem::{find_iter, FindIter}; use memchr::memmem::{find_iter, FindIter};
pub use raw_event::{RawEvent, RawEventType}; pub use raw_event::{RawEvent, RawEventType};
@ -30,8 +30,6 @@ 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(Box<SubjectError>), Subject(Box<SubjectError>),
#[error("{0}")] #[error("{0}")]
@ -96,10 +94,7 @@ pub fn parse_with_handler<Handler: EventHandler>(
while let Some(event_res) = events.next() { while let Some(event_res) = events.next() {
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) => continue,
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);
@ -108,16 +103,22 @@ pub fn parse_with_handler<Handler: EventHandler>(
let event = match GameEvent::parse(&raw_event) { let event = match GameEvent::parse(&raw_event) {
Ok(event) => event, Ok(event) => event,
Err(e) => { Err(e) => {
let old_date: NaiveDateTime = raw_event
.date
.try_into()
.unwrap_or_else(|_| NaiveDateTime::from_timestamp(0, 0));
// truncated newline during log combining, ignore error
if contains_line_start(raw_event.params, &old_date.date()) {
continue;
}
let Some(next) = events.next() else { let Some(next) = events.next() else {
// log is truncated // log is truncated
break; break;
}; };
if let Ok(next) = next { if let Ok(next) = next {
let old_date: NaiveDateTime = raw_event
.date
.try_into()
.unwrap_or_else(|_| NaiveDateTime::from_timestamp(0, 0));
let new_date: NaiveDateTime = next let new_date: NaiveDateTime = next
.date .date
.try_into() .try_into()
@ -153,6 +154,11 @@ pub fn parse_with_handler<Handler: EventHandler>(
Ok((global, per_player)) Ok((global, per_player))
} }
fn contains_line_start(line: &str, date: &NaiveDate) -> bool {
let expected_start = format!("L {}", date.format("%m/%d/%Y"));
line.contains(&expected_start)
}
handler!(LogHandler { handler!(LogHandler {
chat: ChatMessages, chat: ChatMessages,
heal_spread: PlayerHandler::<HealSpread>, heal_spread: PlayerHandler::<HealSpread>,

View file

@ -26,7 +26,7 @@ impl<'a> RawEvent<'a> {
fn event_parser(input: &str) -> Result<RawEvent> { fn event_parser(input: &str) -> Result<RawEvent> {
// println!("{}", input); // println!("{}", input);
if input.len() < 24 { if input.len() < 24 {
return Err(Error::Skip); return Err(Error::Incomplete);
} }
let date = RawDate(&input[0..21]); let date = RawDate(&input[0..21]);