From 8bff38479f75e1e0d983856ffb2553cd81195ea3 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Thu, 19 Apr 2018 08:01:12 -0600 Subject: [PATCH] go time is stupid --- main.go | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index 59ea5ac..e7c184c 100644 --- a/main.go +++ b/main.go @@ -12,7 +12,10 @@ import ( var notified = false +var originalStart = time.Now() + func main() { + var duration string var offset string var interval string @@ -63,15 +66,16 @@ func main() { go func() { last := time.Now() - printTime(&cur, base, &delim, invert) + printTime(&cur, base, &delim, invert, repeat) for { select { case <-monitor.C: if invert { - cur += time.Now().Sub(last) + cur += time.Duration(time.Now().UnixNano() - last.UnixNano()) } else { - cur -= time.Now().Sub(last) + cur -= time.Duration(time.Now().UnixNano() - last.UnixNano()) } + last = time.Now() case state := <-pause: if !state { monitor = time.NewTicker(tickerInterval) @@ -83,8 +87,7 @@ func main() { confirm <- true return } - last = time.Now() - printTime(&cur, base, &delim, invert) + printTime(&cur, base, &delim, invert, repeat) } }() @@ -106,13 +109,23 @@ func main() { paused = !paused pause <- paused case 'r': + skip = time.Duration(0) + originalStart = time.Now() cur = base - printTime(&cur, base, &delim, invert) + notified = false + printTime(&cur, base, &delim, invert, repeat) + case 'z': + fmt.Printf("\nnow:\t%v\nstart:\t%v\ndiff:\t%v\n", time.Now().UnixNano()/int64(time.Second), originalStart.UnixNano()/int64(time.Second), (time.Now().UnixNano()-originalStart.UnixNano())/int64(time.Second)) + if invert { + cur = skip + time.Duration(time.Now().UnixNano()-originalStart.UnixNano()) + } else { + cur = base - skip - time.Duration(time.Now().UnixNano()-originalStart.UnixNano()) + } } } } -func printTime(pRemains *time.Duration, target time.Duration, delim *rune, reverse bool) { +func printTime(pRemains *time.Duration, target time.Duration, delim *rune, reverse bool, repeat bool) { remains := *pRemains sec := remains.Seconds() min := int(sec / 60.0) @@ -136,7 +149,7 @@ func printTime(pRemains *time.Duration, target time.Duration, delim *rune, rever rSec = 0 rHrs = 0 tdelim = ':' - go alertTime(pRemains, target, reverse) + go alertTime(pRemains, target, reverse, repeat) } at := fmt.Sprintf("%2d%c%02d%c%02d", hrs, byte(*delim), min, byte(*delim), seconds) rem := fmt.Sprintf("%2d%c%02d%c%02d", rHrs, tdelim, rMin, tdelim, rSec) @@ -145,23 +158,26 @@ func printTime(pRemains *time.Duration, target time.Duration, delim *rune, rever rem := fmt.Sprintf("%2d%c%02d%c%02d", hrs, byte(*delim), min, byte(*delim), seconds) fmt.Printf("\rRemaining: %s ", rem) if remains < 0 { - go alertTime(pRemains, target, reverse) + go alertTime(pRemains, target, reverse, repeat) } } } -func alertTime(pRemains *time.Duration, target time.Duration, reverse bool) { +func alertTime(pRemains *time.Duration, target time.Duration, reverse, repeat bool) { if !notified { notified = true _, err := mack.Alert(fmt.Sprintf("Timer for %s done", target.String())) if err != nil { panic(err) } - if reverse { - *pRemains -= target - } else { - *pRemains += target + if repeat { + originalStart = time.Now() + if reverse { + *pRemains -= target + } else { + *pRemains += target + } + notified = false } - notified = false } }