kclock/main.go

87 lines
1.5 KiB
Go
Raw Permalink Normal View History

2021-11-29 04:21:54 +00:00
package main
import (
"flag"
"fmt"
"os"
"os/signal"
"syscall"
"time"
2021-11-30 05:06:07 +00:00
"github.com/mattn/go-isatty"
2021-11-29 04:21:54 +00:00
)
var (
Version = "0.0.0"
Build = "alpha"
2021-11-30 05:06:07 +00:00
local string
flagTick string
flagVer bool
2021-11-29 04:21:54 +00:00
)
func main() {
flag.StringVar(&local, "local", fmt.Sprint(time.Local), "set local manually")
2021-11-30 05:06:07 +00:00
flag.StringVar(&flagTick, "tick", "1s", "ticking interval")
2021-11-29 04:21:54 +00:00
flag.BoolVar(&flagVer, "v", false, "show version")
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "Usage: kclock [options]\n")
flag.PrintDefaults()
}
flag.Parse()
if flagVer {
fmt.Printf("%v - %v\n", Version, Build)
return
}
l, err := time.LoadLocation(local)
if err != nil {
panic(err)
}
time.Local = l
watch()
}
func watch() {
2021-11-30 05:06:07 +00:00
interval, err := time.ParseDuration(flagTick)
if err != nil {
panic(err)
}
color := isatty.IsTerminal(os.Stdout.Fd())
if !color {
color = isatty.IsCygwinTerminal(os.Stdout.Fd())
}
2021-11-29 04:21:54 +00:00
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
start := time.Now()
2021-11-30 05:06:07 +00:00
<-time.After(time.Until(time.Now().Truncate(time.Second).Add(time.Second)))
tick := time.Tick(interval)
if color {
fmt.Printf("\n")
}
2021-11-29 04:21:54 +00:00
for {
2021-11-30 05:06:07 +00:00
if color {
fmt.Printf("\r\033[1A\033[0K\033[32m%v\033[0m\n", time.Now().Truncate(time.Second))
} else {
fmt.Printf("%v\n", time.Now().Truncate(time.Second))
}
2021-11-29 04:21:54 +00:00
select {
case <-tick:
case <-quit:
2021-11-30 05:06:07 +00:00
if color {
fmt.Printf("\r\033[0Ktime elapsed: \033[34m%v\033[0m\n", time.Since(start))
} else {
fmt.Printf("time elapsed: %v\n", time.Since(start))
}
2021-11-29 04:21:54 +00:00
return
}
}
}