go time is stupid

master
Bel LaPointe 2018-04-19 08:01:12 -06:00
parent e5d1fee1d5
commit 8bff38479f
1 changed files with 31 additions and 15 deletions

46
main.go
View File

@ -12,7 +12,10 @@ import (
var notified = false var notified = false
var originalStart = time.Now()
func main() { func main() {
var duration string var duration string
var offset string var offset string
var interval string var interval string
@ -63,15 +66,16 @@ func main() {
go func() { go func() {
last := time.Now() last := time.Now()
printTime(&cur, base, &delim, invert) printTime(&cur, base, &delim, invert, repeat)
for { for {
select { select {
case <-monitor.C: case <-monitor.C:
if invert { if invert {
cur += time.Now().Sub(last) cur += time.Duration(time.Now().UnixNano() - last.UnixNano())
} else { } else {
cur -= time.Now().Sub(last) cur -= time.Duration(time.Now().UnixNano() - last.UnixNano())
} }
last = time.Now()
case state := <-pause: case state := <-pause:
if !state { if !state {
monitor = time.NewTicker(tickerInterval) monitor = time.NewTicker(tickerInterval)
@ -83,8 +87,7 @@ func main() {
confirm <- true confirm <- true
return return
} }
last = time.Now() printTime(&cur, base, &delim, invert, repeat)
printTime(&cur, base, &delim, invert)
} }
}() }()
@ -106,13 +109,23 @@ func main() {
paused = !paused paused = !paused
pause <- paused pause <- paused
case 'r': case 'r':
skip = time.Duration(0)
originalStart = time.Now()
cur = base 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 remains := *pRemains
sec := remains.Seconds() sec := remains.Seconds()
min := int(sec / 60.0) min := int(sec / 60.0)
@ -136,7 +149,7 @@ func printTime(pRemains *time.Duration, target time.Duration, delim *rune, rever
rSec = 0 rSec = 0
rHrs = 0 rHrs = 0
tdelim = ':' 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) 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) 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) rem := fmt.Sprintf("%2d%c%02d%c%02d", hrs, byte(*delim), min, byte(*delim), seconds)
fmt.Printf("\rRemaining: %s ", rem) fmt.Printf("\rRemaining: %s ", rem)
if remains < 0 { 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 { if !notified {
notified = true notified = true
_, err := mack.Alert(fmt.Sprintf("Timer for %s done", target.String())) _, err := mack.Alert(fmt.Sprintf("Timer for %s done", target.String()))
if err != nil { if err != nil {
panic(err) panic(err)
} }
if reverse { if repeat {
*pRemains -= target originalStart = time.Now()
} else { if reverse {
*pRemains += target *pRemains -= target
} else {
*pRemains += target
}
notified = false
} }
notified = false
} }
} }