kclock/main.go

87 lines
1.5 KiB
Go

package main
import (
"flag"
"fmt"
"os"
"os/signal"
"syscall"
"time"
"github.com/mattn/go-isatty"
)
var (
Version = "0.0.0"
Build = "alpha"
local string
flagTick string
flagVer bool
)
func main() {
flag.StringVar(&local, "local", fmt.Sprint(time.Local), "set local manually")
flag.StringVar(&flagTick, "tick", "1s", "ticking interval")
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() {
interval, err := time.ParseDuration(flagTick)
if err != nil {
panic(err)
}
color := isatty.IsTerminal(os.Stdout.Fd())
if !color {
color = isatty.IsCygwinTerminal(os.Stdout.Fd())
}
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
start := time.Now()
<-time.After(time.Until(time.Now().Truncate(time.Second).Add(time.Second)))
tick := time.Tick(interval)
if color {
fmt.Printf("\n")
}
for {
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))
}
select {
case <-tick:
case <-quit:
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))
}
return
}
}
}