Add WhenBetween()

This commit is contained in:
Ian Gulliver
2022-09-16 17:41:57 +00:00
parent 897334e11d
commit 29c0db7aca
2 changed files with 62 additions and 1 deletions

10
main.go
View File

@@ -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().

View File

@@ -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))
}