From 29c0db7acadfe171f7473af91075ca64bfc96663 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Fri, 16 Sep 2022 17:41:57 +0000 Subject: [PATCH] Add WhenBetween() --- main.go | 10 ++++++++++ rules/rules.go | 53 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index fe2bf81..45fc345 100644 --- a/main.go +++ b/main.go @@ -13,12 +13,22 @@ func main() { InWorkspace("flamingcow.io"). InMyTasksSections("Recently Assigned", "Today", "Meetings", "Maybe Today", "Upcoming", "Later", "Someday"). + WhenBetween("America/Los_Angeles", "03:00:00", "17:00:00"). OnlyIncomplete(). DueInDays(0). WithTagsAnyOf("section=Tonight"). PrintTasks(). MoveToMyTasksSection("Tonight") + InWorkspace("flamingcow.io"). + InMyTasksSections("Recently Assigned", "Meetings", "Maybe Today", "Tonight", "Upcoming", "Later", "Someday"). + WhenBetween("America/Los_Angeles", "17:00:00", "03:00:00"). + OnlyIncomplete(). + DueInDays(0). + WithTagsAnyOf("section=Tonight"). + PrintTasks(). + MoveToMyTasksSection("Today") + InWorkspace("flamingcow.io"). InMyTasksSections("Recently Assigned", "Today", "Maybe Today", "Tonight", "Upcoming", "Later", "Someday"). OnlyIncomplete(). diff --git a/rules/rules.go b/rules/rules.go index d44cc3e..fa186cb 100644 --- a/rules/rules.go +++ b/rules/rules.go @@ -10,15 +10,17 @@ import "github.com/firestuff/automana/client" import "golang.org/x/net/html" import "golang.org/x/net/html/atom" +type workspaceClientGetter func(*client.Client) (*client.WorkspaceClient, error) +type gate func(*client.WorkspaceClient) (bool, error) type queryMutator func(*client.WorkspaceClient, *client.SearchQuery) error type taskActor func(*client.WorkspaceClient, *client.Task) error type taskFilter func(*client.WorkspaceClient, *client.SearchQuery, *client.Task) (bool, error) -type workspaceClientGetter func(*client.Client) (*client.WorkspaceClient, error) type periodic struct { done chan bool workspaceClientGetter workspaceClientGetter + gates []gate queryMutators []queryMutator taskFilters []taskFilter taskActors []taskActor @@ -51,6 +53,37 @@ func InWorkspace(name string) *periodic { return ret } +// Gates +func (p *periodic) WhenBetween(tz, start, end string) *periodic { + p.gates = append(p.gates, func(wc *client.WorkspaceClient) (bool, error) { + loc, err := time.LoadLocation(tz) + if err != nil { + return false, err + } + + now := civil.TimeOf(time.Now().In(loc)) + + s, err := civil.ParseTime(start) + if err != nil { + return false, err + } + + e, err := civil.ParseTime(end) + if err != nil { + return false, err + } + + if timeBefore(e, s) { + // End is before start, so we wrap around midnight + return timeBefore(s, now) || timeBefore(now, e), nil + } else { + return timeBefore(s, now) && timeBefore(now, e), nil + } + }) + + return p +} + // Query mutators func (p *periodic) InMyTasksSections(names ...string) *periodic { p.queryMutators = append(p.queryMutators, func(wc *client.WorkspaceClient, q *client.SearchQuery) error { @@ -337,6 +370,17 @@ func (p *periodic) exec(c *client.Client) error { return err } + for _, g := range p.gates { + ok, err := g(wc) + if err != nil { + return err + } + + if !ok { + return nil + } + } + q := &client.SearchQuery{} for _, mut := range p.queryMutators { @@ -487,3 +531,10 @@ func nodeHasUnlinkedURL(node *html.Node) bool { return false } + +func timeBefore(t1, t2 civil.Time) bool { + return ((t1.Hour < t2.Hour) || + (t1.Hour == t2.Hour && t1.Minute < t2.Minute) || + (t1.Hour == t2.Hour && t1.Minute == t2.Minute && t1.Second < t2.Second) || + (t1.Hour == t2.Hour && t1.Minute == t2.Minute && t1.Second == t2.Second && t1.Nanosecond < t2.Nanosecond)) +}