From 9e8008f0903121b86ec44b5c9bdbea2ab99bb487 Mon Sep 17 00:00:00 2001 From: Zorchenhimer Date: Sun, 28 Feb 2021 21:59:06 -0500 Subject: [PATCH] Allow specifying a time to count down to The input for this is dumb AF, but it "works". Added flags are: -target-year -target-month -target-day -target-hour -target-minute -target-second These flags all take a number, and default to the current time if omitted. --- main.go | 74 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index ced67b7..56323db 100644 --- a/main.go +++ b/main.go @@ -28,29 +28,71 @@ func main() { var format string flag.StringVar(&filename, "o", "/tmp/countdown.txt", "Output file to write the countdown to.") - flag.StringVar(&untilStr, "u", "10m", "Countdown duration") + flag.StringVar(&untilStr, "u", "", "Countdown duration") flag.StringVar(&targetTimeStr, "t", "", "Countdown to time") flag.StringVar(&doneStr, "d", "00:00:00", "String to display when done") //flag.StringVar(&format, "f", "%H:%M:%S", "Format for the countdown") flag.StringVar(&format, "f", "{{if .Hours}}{{.Hours}}h {{end}}{{if or .Minutes .Hours}}{{.Minutes}}m {{end}}{{.Seconds}}s", "Format for the countdown") + + var targetYear int + var targetDay int + var targetMonth int + + flag.IntVar(&targetYear, "target-year", -1, "") + flag.IntVar(&targetDay, "target-day", -1, "") + flag.IntVar(&targetMonth, "target-month", -1, "") + + var targetHour int + var targetMinute int + var targetSecond int + + flag.IntVar(&targetHour, "target-hour", -1, "") + flag.IntVar(&targetMinute, "target-minute", -1, "") + flag.IntVar(&targetSecond, "target-second", -1, "") + flag.Parse() - untilDuration, err := time.ParseDuration(untilStr) - if err != nil { - fmt.Println(err) - os.Exit(1) + var until time.Time + now := time.Now() + + if untilStr != "" { + untilDuration, err := time.ParseDuration(untilStr) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + until = time.Now().Add(untilDuration) + } else { + if targetYear == -1 { + targetYear = now.Year() + } + if targetMonth == -1 { + targetMonth = int(now.Month()) + } + if targetDay == -1 { + targetDay = now.Day() + } + + if targetHour == -1 { + targetHour = now.Hour() + } + if targetMinute == -1 { + targetMinute = now.Minute() + } + if targetSecond == -1 { + targetSecond = now.Second() + } + + until = time.Date( + targetYear, time.Month(targetMonth), targetDay, + targetHour, targetMinute, targetSecond, + 0, time.Local, + ) } - var until time.Time = time.Now().Add(untilDuration) - - d, err := time.ParseDuration("1s") - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - fmt.Printf("Output file: %s\nCountdown duration: %s\n", filename, untilDuration) + fmt.Printf("Output file: %s\nCountdown to: %s\n", filename, untiluntil) + var err error tp := template.New("time") tp, err = tp.Parse(format) if err != nil { @@ -60,9 +102,11 @@ func main() { wg := sync.WaitGroup{} wg.Add(1) - ticker := time.NewTicker(d) + ticker := time.NewTicker(time.Second) + go func(c <-chan time.Time) { count := time.Until(until) + fmt.Println(count) for ; count >= 0; count = time.Until(until) { h := int(count.Hours()) m := int(int(count.Minutes()) % 60)