Working
This commit is contained in:
77
asana.go
Normal file
77
asana.go
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AsanaClient struct {
|
||||||
|
cli *http.Client
|
||||||
|
token string
|
||||||
|
workspace string
|
||||||
|
assignee string
|
||||||
|
}
|
||||||
|
|
||||||
|
type addTaskRequest struct {
|
||||||
|
Data *addTaskRequestInt `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type addTaskRequestInt struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
HtmlNotes string `json:"html_notes"`
|
||||||
|
Workspace string `json:"workspace"`
|
||||||
|
Assignee string `json:"assignee"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAsanaClient() *AsanaClient {
|
||||||
|
return &AsanaClient{
|
||||||
|
cli: &http.Client{},
|
||||||
|
token: os.Getenv("ASANA_TOKEN"),
|
||||||
|
workspace: os.Getenv("ASANA_WORKSPACE"),
|
||||||
|
assignee: os.Getenv("ASANA_ASSIGNEE"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ac *AsanaClient) CreateTask(name string, notes string) error {
|
||||||
|
body := &addTaskRequest{
|
||||||
|
Data: &addTaskRequestInt{
|
||||||
|
Name: name,
|
||||||
|
HtmlNotes: notes,
|
||||||
|
Workspace: ac.workspace,
|
||||||
|
Assignee: ac.assignee,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
js, err := json.Marshal(body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequest("POST", "https://app.asana.com/api/1.0/tasks", bytes.NewReader(js))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ac.addAuth(req)
|
||||||
|
req.Header.Add("Content-Type", "application/json")
|
||||||
|
|
||||||
|
resp, err := ac.cli.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode != 201 {
|
||||||
|
msg, _ := io.ReadAll(resp.Body)
|
||||||
|
return fmt.Errorf("%s: %s", resp.Status, msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ac *AsanaClient) addAuth(req *http.Request) {
|
||||||
|
req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", ac.token))
|
||||||
|
}
|
||||||
34
imap.go
34
imap.go
@@ -1,7 +1,9 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"net/mail"
|
"net/mail"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/emersion/go-imap"
|
"github.com/emersion/go-imap"
|
||||||
"github.com/emersion/go-imap/client"
|
"github.com/emersion/go-imap/client"
|
||||||
@@ -65,19 +67,32 @@ func (ic *ImapClient) Poll() ([]*Task, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = append(ret, &Task{
|
d, err := msg.Header.Date()
|
||||||
Name: msg.Header.Get("Subject"),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
err = ic.Move(seqset, ic.toFolder)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = append(ret, &Task{
|
||||||
|
Name: msg.Header.Get("Subject"),
|
||||||
|
HtmlNotes: fmt.Sprintf(
|
||||||
|
"<body>From: %s\nTo: %s\nDate: %s</body>",
|
||||||
|
ic.escape(msg.Header.Get("From")),
|
||||||
|
ic.escape(msg.Header.Get("To")),
|
||||||
|
ic.escape(d.Local().Format("Monday, 2006-01-02 15h04 -0700")),
|
||||||
|
),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ic *ImapClient) Archive(num int) error {
|
||||||
|
seqset := &imap.SeqSet{}
|
||||||
|
seqset.AddRange(1, uint32(num))
|
||||||
|
|
||||||
|
return ic.Move(seqset, ic.toFolder)
|
||||||
|
}
|
||||||
|
|
||||||
func (ic *ImapClient) List(ref, name string) ([]*imap.MailboxInfo, error) {
|
func (ic *ImapClient) List(ref, name string) ([]*imap.MailboxInfo, error) {
|
||||||
ch := make(chan *imap.MailboxInfo, 10)
|
ch := make(chan *imap.MailboxInfo, 10)
|
||||||
done := make(chan error)
|
done := make(chan error)
|
||||||
@@ -125,3 +140,10 @@ func (ic *ImapClient) Select(name string, readonly bool) (*imap.MailboxStatus, e
|
|||||||
func (ic *ImapClient) Move(seqset *imap.SeqSet, dest string) error {
|
func (ic *ImapClient) Move(seqset *imap.SeqSet, dest string) error {
|
||||||
return ic.cli.Move(seqset, dest)
|
return ic.cli.Move(seqset, dest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ic *ImapClient) escape(in string) string {
|
||||||
|
in = strings.ReplaceAll(in, "<", "<")
|
||||||
|
in = strings.ReplaceAll(in, ">", ">")
|
||||||
|
in = strings.ReplaceAll(in, `"`, """)
|
||||||
|
return in
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
@@ -24,7 +23,9 @@ func main() {
|
|||||||
|
|
||||||
defer ic.Close()
|
defer ic.Close()
|
||||||
|
|
||||||
err = Poll(ic)
|
ac := NewAsanaClient()
|
||||||
|
|
||||||
|
err = Poll(ic, ac)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("%s", err)
|
log.Printf("%s", err)
|
||||||
}
|
}
|
||||||
@@ -32,7 +33,7 @@ func main() {
|
|||||||
for {
|
for {
|
||||||
time.Sleep(time.Duration(rand.Intn(60)) * time.Second)
|
time.Sleep(time.Duration(rand.Intn(60)) * time.Second)
|
||||||
|
|
||||||
err := Poll(ic)
|
err := Poll(ic, ac)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("%s", err)
|
log.Printf("%s", err)
|
||||||
}
|
}
|
||||||
@@ -44,15 +45,24 @@ type Task struct {
|
|||||||
HtmlNotes string
|
HtmlNotes string
|
||||||
}
|
}
|
||||||
|
|
||||||
func Poll(ic *ImapClient) error {
|
func Poll(ic *ImapClient, ac *AsanaClient) error {
|
||||||
tasks, err := ic.Poll()
|
tasks, err := ic.Poll()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, task := range tasks {
|
if len(tasks) < 1 {
|
||||||
fmt.Printf("%#v\n", task)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, task := range tasks {
|
||||||
|
log.Printf("%s", task.Name)
|
||||||
|
|
||||||
|
err = ac.CreateTask(task.Name, task.HtmlNotes)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ic.Archive(len(tasks))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user