sunset/main.go

156 lines
2.9 KiB
Go
Raw Normal View History

2020-10-26 00:39:45 +00:00
package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"path"
"strconv"
"strings"
"time"
)
type sunsetConfig struct {
Files []sunsetImage `json:"files"`
}
type sunsetImage struct {
File string `json:"file"`
Time string `json:"time"`
}
func loadSunsetConfig(filepath string) sunsetConfig {
data, err := ioutil.ReadFile(filepath)
var result sunsetConfig
err = json.Unmarshal(data, &result)
if err != nil {
log.Fatal("Failed to load file: ", err.Error())
}
return result
}
func currentIndex(config sunsetConfig) int {
currentTime := getCurrentTime()
var min int = 2401
var minIndex int = -1
for i := 0; i < len(config.Files); i++ {
element := getTimeSimple(config.Files[i].Time)
diff := currentTime - element
if diff < 0 {
diff = 2400 - (diff * -1)
}
if diff < min {
min = diff
minIndex = i
}
}
return minIndex
}
func nextIndex(config sunsetConfig) int {
currentTime := getCurrentTime()
var min int = 2401
var minIndex int = -1
for i := 0; i < len(config.Files); i++ {
element := getTimeSimple(config.Files[i].Time)
diff := element - currentTime
if diff < 0 {
diff = 2400 - (diff * -1)
}
if diff < min {
min = diff
minIndex = i
}
}
return minIndex
}
func getCurrentTime() int {
now := time.Now()
hr := now.Hour()
min := now.Minute()
return hr*100 + min
}
func getTimeSimple(timeString string) int {
hr, min := getTime(timeString)
return hr*100 + min
}
func getNextTime(config sunsetConfig) string {
index := nextIndex(config)
return config.Files[index].Time
}
func getTime(timeString string) (int, int) {
splits := strings.Split(timeString, ":")
hr, _ := strconv.ParseInt(splits[0], 10, 32)
min, _ := strconv.ParseInt(splits[1], 10, 32)
// res, err := time.Parse("15:04", fmt.Sprintf("%02d:%02d", hr, min))
// if err != nil {
// log.Fatal(err)
// }
return int(hr), int(min)
}
func getNextWait(config sunsetConfig) string {
index := nextIndex(config)
now := time.Now()
nextHr, nextMin := getTime(config.Files[index].Time)
var diffHr int
var diffMin int
// FIXME still not working
if now.Hour() >= nextHr && now.Minute() >= nextMin {
fmt.Print("u")
diffHr = 24 - (now.Hour() - nextHr)
diffMin = 60 - (now.Minute() - nextMin)
} else {
diffHr = nextHr - now.Hour()
diffMin = nextMin - now.Minute()
}
return fmt.Sprintf("%dh%dm", diffHr, diffMin)
}
func main() {
printNextTime := flag.Bool("next", false, "Print the time to the next change")
printNextWait := flag.Bool("wait", false, "Print the time to wait for the next change")
configFile := flag.String("file", "./sunset.json", "Specify the file to load")
flag.Parse()
conf := loadSunsetConfig(*configFile)
if *printNextTime {
fmt.Printf("%s", getNextTime(conf))
} else if *printNextWait {
fmt.Printf("%s", getNextWait(conf))
} else {
index := currentIndex(conf)
absoluteImagePath := path.Join(path.Dir(*configFile), conf.Files[index].File)
fmt.Printf("%s", absoluteImagePath)
}
}