87 lines
1.7 KiB
Go
87 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
type Data struct {
|
|
SunsetTime time.Time `json:"sunset"`
|
|
TenMinuteWarning time.Time `json:"ten_minute_warning"`
|
|
LastUpdated time.Time `json:"last_updated"`
|
|
MorningNotifySent bool `json:"morning_notify_sent"`
|
|
TenMinuteWarningSent bool `json:"ten_minute_warning_sent"`
|
|
}
|
|
|
|
func NewData() *Data {
|
|
return &Data{
|
|
MorningNotifySent: false,
|
|
TenMinuteWarningSent: false,
|
|
}
|
|
}
|
|
|
|
func loadData(path string) (*Data, error) {
|
|
state, err := os.ReadFile(path)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
return NewData(), nil
|
|
} else {
|
|
return nil, err
|
|
}
|
|
}
|
|
if len(state) == 0 {
|
|
return NewData(), nil
|
|
}
|
|
|
|
var d Data
|
|
err = json.Unmarshal(state, &d)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &d, err
|
|
}
|
|
|
|
func (d *Data) Save(path string) error {
|
|
b, err := json.Marshal(d)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
tmpPath := path + ".path"
|
|
defer os.Remove(tmpPath)
|
|
|
|
if err := os.WriteFile(tmpPath, b, 0644); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := os.Rename(tmpPath, path); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (d *Data) HandleSunsetNotifications(path string) error {
|
|
if !d.MorningNotifySent {
|
|
t := d.SunsetTime.Format("15:04")
|
|
err := SendNotification(fmt.Sprintf("Sunset is at %s", t))
|
|
if err != nil {
|
|
return fmt.Errorf("Unable to send notification | %s", err)
|
|
}
|
|
d.MorningNotifySent = true
|
|
d.Save(path)
|
|
}
|
|
|
|
if time.Now().After(d.TenMinuteWarning) && !d.TenMinuteWarningSent {
|
|
err := SendNotification("Sunset is Approaching!")
|
|
if err != nil {
|
|
return fmt.Errorf("Unable to send notification | %s", err)
|
|
}
|
|
d.TenMinuteWarningSent = true
|
|
d.Save(path)
|
|
}
|
|
return nil
|
|
}
|