aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorDaniel <kingdread@gmx.de>2020-06-12 00:48:18 +0200
committerDaniel <kingdread@gmx.de>2020-06-12 00:48:18 +0200
commitd4a24eef7fd410c147de201d776089e0601317d5 (patch)
tree8311b261c20d6d5f2d817f63e2cf4a3b213cdd34 /src/main.rs
parent1fb3d3259d23410f8bf9879f64de880a11e4f876 (diff)
downloadraidgrep-d4a24eef7fd410c147de201d776089e0601317d5.tar.gz
raidgrep-d4a24eef7fd410c147de201d776089e0601317d5.tar.bz2
raidgrep-d4a24eef7fd410c147de201d776089e0601317d5.zip
initial work on comparison based filters
This enables filters such as -time > 2020-01-01 -time < 2020-02-03 ... for time and duration, and later possibly also for more things (such as a COUNT(...) construct). This work tries to integrate them into the existing filter system as seamless as possible, by providing a Comparator which implements LogFilter. The "type checking" is done at parse time, so nonsensical comparisons like -time > 12s flat out give a parse error. This however might be changed to a more dynamic system with run-time type checking, in which case we could do away with the type parameter on Producer and simply work with a generic Value. The comparator would then return an error if two non-identical types would be compared. Note that the system does not support arithmetic expressions, only simple comparisons to constant values.
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index ba834ce..9ed67cf 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -8,7 +8,7 @@ use std::str::FromStr;
use std::sync::atomic::{AtomicBool, Ordering};
use anyhow::{anyhow, Context, Error, Result};
-use chrono::{DateTime, TimeZone, Utc};
+use chrono::{DateTime, Duration, TimeZone, Utc};
use colored::Colorize;
use log::debug;
use regex::Regex;
@@ -156,6 +156,8 @@ pub struct LogResult {
log_file: PathBuf,
/// The time of the recording.
time: DateTime<Utc>,
+ /// The duration of the fight.
+ duration: Duration,
/// The boss.
boss: Option<Boss>,
/// A vector of all participating players.
@@ -550,9 +552,17 @@ fn extract_info(path: &Path, log: &Log) -> LogResult {
.collect::<Vec<Player>>();
players.sort();
+ let duration = log
+ .local_end_timestamp()
+ .and_then(|end| log.local_start_timestamp().map(|start| end - start))
+ .map(|x| x as i64)
+ .map(Duration::seconds)
+ .unwrap_or_else(Duration::zero);
+
LogResult {
log_file: path.to_path_buf(),
time: Utc.timestamp(i64::from(log.local_end_timestamp().unwrap_or(0)), 0),
+ duration,
boss,
players,
outcome: get_fight_outcome(log),