Add WhenBetween()
This commit is contained in:
10
main.go
10
main.go
@@ -13,12 +13,22 @@ func main() {
|
|||||||
|
|
||||||
InWorkspace("flamingcow.io").
|
InWorkspace("flamingcow.io").
|
||||||
InMyTasksSections("Recently Assigned", "Today", "Meetings", "Maybe Today", "Upcoming", "Later", "Someday").
|
InMyTasksSections("Recently Assigned", "Today", "Meetings", "Maybe Today", "Upcoming", "Later", "Someday").
|
||||||
|
WhenBetween("America/Los_Angeles", "03:00:00", "17:00:00").
|
||||||
OnlyIncomplete().
|
OnlyIncomplete().
|
||||||
DueInDays(0).
|
DueInDays(0).
|
||||||
WithTagsAnyOf("section=Tonight").
|
WithTagsAnyOf("section=Tonight").
|
||||||
PrintTasks().
|
PrintTasks().
|
||||||
MoveToMyTasksSection("Tonight")
|
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").
|
InWorkspace("flamingcow.io").
|
||||||
InMyTasksSections("Recently Assigned", "Today", "Maybe Today", "Tonight", "Upcoming", "Later", "Someday").
|
InMyTasksSections("Recently Assigned", "Today", "Maybe Today", "Tonight", "Upcoming", "Later", "Someday").
|
||||||
OnlyIncomplete().
|
OnlyIncomplete().
|
||||||
|
|||||||
@@ -10,15 +10,17 @@ import "github.com/firestuff/automana/client"
|
|||||||
import "golang.org/x/net/html"
|
import "golang.org/x/net/html"
|
||||||
import "golang.org/x/net/html/atom"
|
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 queryMutator func(*client.WorkspaceClient, *client.SearchQuery) error
|
||||||
type taskActor func(*client.WorkspaceClient, *client.Task) error
|
type taskActor func(*client.WorkspaceClient, *client.Task) error
|
||||||
type taskFilter func(*client.WorkspaceClient, *client.SearchQuery, *client.Task) (bool, error)
|
type taskFilter func(*client.WorkspaceClient, *client.SearchQuery, *client.Task) (bool, error)
|
||||||
type workspaceClientGetter func(*client.Client) (*client.WorkspaceClient, error)
|
|
||||||
|
|
||||||
type periodic struct {
|
type periodic struct {
|
||||||
done chan bool
|
done chan bool
|
||||||
|
|
||||||
workspaceClientGetter workspaceClientGetter
|
workspaceClientGetter workspaceClientGetter
|
||||||
|
gates []gate
|
||||||
queryMutators []queryMutator
|
queryMutators []queryMutator
|
||||||
taskFilters []taskFilter
|
taskFilters []taskFilter
|
||||||
taskActors []taskActor
|
taskActors []taskActor
|
||||||
@@ -51,6 +53,37 @@ func InWorkspace(name string) *periodic {
|
|||||||
return ret
|
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
|
// Query mutators
|
||||||
func (p *periodic) InMyTasksSections(names ...string) *periodic {
|
func (p *periodic) InMyTasksSections(names ...string) *periodic {
|
||||||
p.queryMutators = append(p.queryMutators, func(wc *client.WorkspaceClient, q *client.SearchQuery) error {
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, g := range p.gates {
|
||||||
|
ok, err := g(wc)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
q := &client.SearchQuery{}
|
q := &client.SearchQuery{}
|
||||||
|
|
||||||
for _, mut := range p.queryMutators {
|
for _, mut := range p.queryMutators {
|
||||||
@@ -487,3 +531,10 @@ func nodeHasUnlinkedURL(node *html.Node) bool {
|
|||||||
|
|
||||||
return false
|
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))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user