From dac2114af0fc787d28f34508fcdb71bdaf796356 Mon Sep 17 00:00:00 2001 From: bel Date: Thu, 2 Apr 2020 23:12:32 +0000 Subject: [PATCH] Config for todo --- config.go | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- main.go | 22 +++++++++++++++++++- upload.go | 31 ++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 upload.go diff --git a/config.go b/config.go index ccd015f..7a0c32f 100644 --- a/config.go +++ b/config.go @@ -1,8 +1,12 @@ package main import ( + "encoding/json" "local/args" + "local/oauth2" "local/storage" + "net/http" + "strings" ) type Config struct { @@ -10,7 +14,8 @@ type Config struct { EmailPass string EmailIMAP string TodoAddr string - TodoPass string + TodoToken string + TodoList string Storage storage.DB } @@ -24,6 +29,10 @@ func NewConfig() Config { as.Append(args.STRING, "emailimap", "email imap", "imap.gmail.com:993") as.Append(args.STRING, "todoaddr", "todo addr", "https://todo-server.remote.blapointe.com") as.Append(args.STRING, "todopass", "todo pass", "gJtEXbbLHLf54yS9EdujtVN2n6Y") + as.Append(args.STRING, "todotoken", "todo token", "") + as.Append(args.STRING, "todolist", "todo list", "") + + as.Append(args.STRING, "authaddr", "auth addr", "https://auth.remote.blapointe.com") as.Append(args.STRING, "store", "store type", "map") as.Append(args.STRING, "storeaddr", "store addr", "/tmp/store") as.Append(args.STRING, "storeuser", "store user", "") @@ -33,6 +42,52 @@ func NewConfig() Config { panic(err) } + token := as.GetString("todotoken") + if len(token) == 0 { + c := &http.Client{CheckRedirect: func(r *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }} + body := "username=" + as.GetString("todopass") + req, err := http.NewRequest("POST", as.GetString("authaddr")+"/authorize/todo-server?"+oauth2.REDIRECT+"=127.0.0.1", strings.NewReader(body)) + if err != nil { + panic(err) + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + resp, err := c.Do(req) + if err != nil { + panic(err) + } + defer resp.Body.Close() + cookie := resp.Header.Get("Set-Cookie") + token = cookie[strings.Index(cookie, "=")+1:] + token = strings.Split(token, "; ")[0] + } + list := as.GetString("todolist") + if len(list) == 0 { + req, err := http.NewRequest("GET", as.GetString("todoaddr")+"/ajax.php?loadLists", nil) + if err != nil { + panic(err) + } + req.Header.Set("Cookie", oauth2.COOKIE+"="+token) + resp, err := http.DefaultClient.Do(req) + if err != nil { + panic(err) + } + defer resp.Body.Close() + var r struct { + List []struct { + ID string `json:"id"` + } `json:"list"` + } + if err := json.NewDecoder(resp.Body).Decode(&r); err != nil { + panic(err) + } + if len(r.List) == 0 { + panic("no lists found") + } + list = r.List[0].ID + } + storage, err := storage.New(storage.TypeFromString(as.GetString("store")), as.GetString("storeaddr"), as.GetString("storeuser"), as.GetString("storepass")) if err != nil { panic(err) @@ -43,7 +98,8 @@ func NewConfig() Config { EmailPass: as.GetString("emailpass"), EmailIMAP: as.GetString("emailimap"), TodoAddr: as.GetString("todoaddr"), - TodoPass: as.GetString("todopass"), + TodoToken: token, + TodoList: list, Storage: storage, } return config diff --git a/main.go b/main.go index 61b3531..ce24754 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "local/sandbox/contact/contact" "log" + "time" ) func main() { @@ -13,11 +14,30 @@ func main() { Password: config.EmailPass, } log.Println(emailer) + + //{45b6895c6dd6345f46e6e15dd2c61f03 Chase 12.86 GOOGLE *GSUITE_blapo [Wed, 1 Apr 2020 10:14:11 -0400 (EDT)]} + log.Println(Upload(config, NewTransaction("11.11", "vendor", time.Now().String(), Bank(0)))) + + return emails, err := emailer.Read() if err != nil { panic(err) } for _, email := range emails { - log.Println(Scrape(email)) + transactions, err := Scrape(email) + if err != nil { + log.Println("failed to scrape email:", err) + } + for _, transaction := range transactions { + if _, err := config.Storage.Get(transaction.ID); err == nil { + log.Println("skipping duplicate transaction:", transaction) + } else { + if err := Upload(config, transaction); err != nil { + log.Println("failed to upload transaction", transaction, ":", err) + } else if err := config.Storage.Set(transaction.ID, []byte(transaction.String())); err != nil { + log.Println("failed to log", transaction, ":", err) + } + } + } } } diff --git a/upload.go b/upload.go new file mode 100644 index 0000000..f3475fa --- /dev/null +++ b/upload.go @@ -0,0 +1,31 @@ +package main + +import ( + "errors" + "local/oauth2" + "log" + "net/http" + "net/url" + "strings" + "time" +) + +func Upload(config Config, transaction *Transaction) error { + params := url.Values{ + "list": {"2548023766"}, + "title": {"test task: " + time.Now().String()}, + "tag": {"expense"}, + } + req, err := http.NewRequest("POST", config.TodoAddr+"/ajax.php?newTask", strings.NewReader(params.Encode())) + if err != nil { + return err + } + req.Header.Set("Cookie", oauth2.COOKIE+"="+config.TodoToken) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + log.Printf("%+v\n\n%+v", req, resp) + return errors.New("not impl") +}