139 lines
2.7 KiB
Go
139 lines
2.7 KiB
Go
|
package morningalarm
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"errors"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
// addAlarm adds an alarm to the list of alarms and starts a cron job to fire it at the specified time
|
||
|
func (ma *MorningAlarm) addAlarm(time, name string) (*alarm, error) {
|
||
|
// Check if alarm already exists
|
||
|
if ma.getAlarm(name) != nil {
|
||
|
return nil, errors.New("Alarm with name " + name + " already exists")
|
||
|
}
|
||
|
|
||
|
alarm := alarm{
|
||
|
Name: name,
|
||
|
Time: time,
|
||
|
Disabled: false,
|
||
|
}
|
||
|
|
||
|
alarm.cronID, _ = ma.armAlarm(&alarm)
|
||
|
|
||
|
ma.alarms = append(ma.alarms, alarm)
|
||
|
|
||
|
return &alarm, nil
|
||
|
}
|
||
|
|
||
|
func (ma *MorningAlarm) getAlarm(name string) *alarm {
|
||
|
for _, alarm := range ma.alarms {
|
||
|
if alarm.Name == name {
|
||
|
return &alarm
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// loadAlarmsFromFile loads the list of alarms from alarms.json into memory
|
||
|
func (ma *MorningAlarm) loadAlarmsFromFile() error {
|
||
|
if _, err := os.Stat("alarms.json"); os.IsNotExist(err) {
|
||
|
ma.alarms = []alarm{}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
content, err := os.ReadFile("alarms.json")
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = json.Unmarshal(content, &ma.alarms)
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// saveAlarmsToFile saves the list of alarms to alarms.json
|
||
|
func (ma *MorningAlarm) saveAlarmsToFile() error {
|
||
|
content, err := json.Marshal(ma.alarms)
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = os.WriteFile("alarms.json", content, 0644)
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// removeAlarm removes an alarm from the list of alarms and stops cron from firing it. Returns true if the alarm was removed, false if it was not found
|
||
|
func (ma *MorningAlarm) removeAlarm(name string) bool {
|
||
|
for _, alarm := range ma.alarms {
|
||
|
if alarm.Name == name {
|
||
|
|
||
|
// Stop cron from firing the alarm
|
||
|
ma.disarmAlarm(&alarm)
|
||
|
|
||
|
// Remove alarm from list of alarms
|
||
|
for i, a := range ma.alarms {
|
||
|
if a.Name == name {
|
||
|
ma.alarms = append(ma.alarms[:i], ma.alarms[i+1:]...)
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
// armAllAlarms arms all alarms in the list of alarms that are not disabled and returns an error if any of them fail to arm
|
||
|
func (ma *MorningAlarm) armAllAlarms() error {
|
||
|
for _, alarm := range ma.alarms {
|
||
|
if !alarm.Disabled {
|
||
|
id, err := ma.armAlarm(&alarm)
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
alarm.cronID = id
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// setDisabled sets the disabled status of an alarm
|
||
|
func (ma *MorningAlarm) setDisabled(name string, disabled bool) {
|
||
|
for i, alarm := range ma.alarms {
|
||
|
if alarm.Name == name {
|
||
|
if alarm.Disabled == disabled {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
ma.alarms[i].Disabled = disabled
|
||
|
|
||
|
if disabled {
|
||
|
ma.disarmAlarm(&alarm)
|
||
|
} else {
|
||
|
id, _ := ma.armAlarm(&alarm)
|
||
|
ma.alarms[i].cronID = id
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|