From 15bd21059dde02248a13c628caf592fee50a0a81 Mon Sep 17 00:00:00 2001 From: xeruf <27jf@pm.me> Date: Sat, 10 Aug 2024 21:04:13 +0300 Subject: [PATCH] fix: show currently running timetracking for task --- src/tasks.rs | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/tasks.rs b/src/tasks.rs index bd11773..44f9354 100644 --- a/src/tasks.rs +++ b/src/tasks.rs @@ -13,7 +13,6 @@ use colored::Colorize; use itertools::Itertools; use log::{debug, error, info, trace, warn}; use nostr_sdk::{Event, EventBuilder, EventId, Keys, Kind, PublicKey, Tag, TagStandard, Timestamp, UncheckedUrl, Url}; -use nostr_sdk::base64::write::StrConsumer; use nostr_sdk::prelude::Marker; use TagStandard::Hashtag; @@ -172,11 +171,7 @@ impl Tasks { .dedup() } - /// Total time in seconds tracked on this task by the current user. - pub(crate) fn time_tracked(&self, id: EventId) -> u64 { - TimesTracked::from(self.history.get(&self.sender.pubkey()).into_iter().flatten(), &vec![id]).sum::().as_secs() - } - + /// Dynamic time tracking overview for current task or current user. pub(crate) fn times_tracked(&self) -> String { match self.get_position() { None => { @@ -201,23 +196,29 @@ impl Tasks { } } Some(id) => { - let vec = vec![id]; - let res = - once(format!("Times tracked on {}", self.get_task_title(&id))).chain( - self.history.iter().flat_map(|(key, set)| - timestamps(set.iter(), &vec) - .tuples::<(_, _)>() - .map(move |((start, _), (end, _))| { - format!("{} - {} by {}", start.to_human_datetime(), end.to_human_datetime(), key) - }) - ).sorted_unstable() - ).join("\n"); - drop(vec); - res + let ids = vec![id]; + once(format!("Times tracked on {}", self.get_task_title(&id))).chain( + self.history.iter().flat_map(|(key, set)| { + let mut vec = Vec::with_capacity(set.len() / 2); + let mut iter = timestamps(set.iter(), &ids).tuples(); + while let Some(((start, _), (end, _))) = iter.next() { + vec.push(format!("{} - {} by {}", start.to_human_datetime(), end.to_human_datetime(), key)) + } + iter.into_buffer().for_each(|(stamp, _)| + vec.push(format!("{} started by {}", stamp.to_human_datetime(), key))); + vec + }).sorted_unstable() + ).join("\n") } } } + /// Total time in seconds tracked on this task by the current user. + pub(crate) fn time_tracked(&self, id: EventId) -> u64 { + TimesTracked::from(self.history.get(&self.sender.pubkey()).into_iter().flatten(), &vec![id]).sum::().as_secs() + } + + /// Total time in seconds tracked on this task and its subtasks by all users. fn total_time_tracked(&self, id: EventId) -> u64 { let mut total = 0;