diff --git a/README.md b/README.md index 41d1823..0834787 100644 --- a/README.md +++ b/README.md @@ -36,4 +36,4 @@ _Note: I may provide a Docker image in the future with file watching to restart Gome-Assistant is a new library, and I'm opening it up early to get some user feedback on the API and help shape the direction. I plan for it to grow to cover all Home Assistant use cases, services, and event types. So it's possible — maybe likely — that breaking changes will happen before v1.0.0! -## API Reference (WIP) +## API Reference (TODO) diff --git a/app.go b/app.go index a3b0577..0625827 100644 --- a/app.go +++ b/app.go @@ -35,6 +35,11 @@ See https://pkg.go.dev/time#ParseDuration for all valid time units. */ type DurationString string +type timeRange struct { + start time.Time + end time.Time +} + /* NewApp establishes the websocket connection and returns an object you can use to register schedules and listeners. diff --git a/eventListener.go b/eventListener.go index 5821f0d..424fb71 100644 --- a/eventListener.go +++ b/eventListener.go @@ -16,6 +16,9 @@ type EventListener struct { betweenEnd string throttle time.Duration lastRan carbon.Carbon + + exceptionDays []time.Time + exceptionRanges []timeRange } type EventListenerCallback func(*Service, EventData) @@ -77,6 +80,16 @@ func (b eventListenerBuilder3) Throttle(s DurationString) eventListenerBuilder3 return b } +func (b eventListenerBuilder3) ExceptionDay(t time.Time) eventListenerBuilder3 { + b.eventListener.exceptionDays = append(b.eventListener.exceptionDays, t) + return b +} + +func (b eventListenerBuilder3) ExceptionRange(start, end time.Time) eventListenerBuilder3 { + b.eventListener.exceptionRanges = append(b.eventListener.exceptionRanges, timeRange{start, end}) + return b +} + func (b eventListenerBuilder3) Build() EventListener { return b.eventListener } @@ -100,10 +113,16 @@ func callEventListeners(app *app, msg ws.ChanMsg) { for _, l := range listeners { // Check conditions if c := checkWithinTimeRange(l.betweenStart, l.betweenEnd); c.fail { - return + continue } if c := checkThrottle(l.throttle, l.lastRan); c.fail { - return + continue + } + if c := checkExceptionDays(l.exceptionDays); c.fail { + continue + } + if c := checkExceptionRanges(l.exceptionRanges); c.fail { + continue } eventData := EventData{ diff --git a/listeners.go b/listeners.go index e32c55f..c1618b9 100644 --- a/listeners.go +++ b/listeners.go @@ -60,3 +60,28 @@ func checkThrottle(throttle time.Duration, lastRan carbon.Carbon) conditionCheck } return cc } + +func checkExceptionDays(eList []time.Time) conditionCheck { + cc := conditionCheck{fail: false} + for _, e := range eList { + y1, m1, d1 := e.Date() + y2, m2, d2 := time.Now().Date() + if y1 == y2 && m1 == m2 && d1 == d2 { + cc.fail = true + break + } + } + return cc +} + +func checkExceptionRanges(eList []timeRange) conditionCheck { + cc := conditionCheck{fail: false} + now := time.Now() + for _, eRange := range eList { + if now.After(eRange.start) && now.Before(eRange.end) { + cc.fail = true + break + } + } + return cc +}