package script import ( "fmt" lucifer3 "git.aiterp.net/lucifer3/server" "git.aiterp.net/lucifer3/server/device" "git.aiterp.net/lucifer3/server/events" "github.com/google/uuid" "strconv" ) type TriggerEvent string const ( TEButton TriggerEvent = "Button" TETime TriggerEvent = "Time" TETemperatureAbove TriggerEvent = "TemperatureAbove" TETemperatureBelow TriggerEvent = "TemperatureBelow" ) type Trigger struct { ID uuid.UUID `json:"id"` Event TriggerEvent `json:"event"` DeviceMatch string `json:"deviceMatch"` Parameter string `json:"parameter"` ScriptTarget string `json:"scriptTarget"` ScriptName string `json:"scriptName"` ScriptPre []Line `json:"scriptPre"` ScriptPost []Line `json:"scriptPost"` } func (t *Trigger) Check(event lucifer3.Event, res device.Resolver) bool { devices := res.Resolve(t.DeviceMatch) switch event := event.(type) { case events.ButtonPressed: if t.Event != TEButton { return false } for _, dev := range devices { if dev.ID == event.ID { return t.Parameter == event.Name } } case events.Time: if t.Event != TETime { return false } return fmt.Sprintf("%02d:%02d", event.Hour, event.Minute) == t.Parameter case events.TemperatureChanged: if t.Event != TETemperatureAbove && t.Event != TETemperatureBelow { return false } num, err := strconv.ParseFloat(t.Parameter, 64) if err != nil { return false } for _, dev := range devices { if dev.ID == event.ID { return (event.Temperature >= num) == (t.Event == TETemperatureAbove) } } } return false }