email-xactions-to-todo/config.go

110 lines
3.0 KiB
Go
Executable File

package main
import (
"encoding/json"
"local/args"
"local/oauth2"
"local/storage"
"net/http"
"strings"
)
type Config struct {
EmailUser string
EmailPass string
EmailIMAP string
TodoAddr string
TodoToken string
TodoList string
TodoTag string
Storage storage.DB
}
var config Config
func NewConfig() Config {
as := args.NewArgSet()
as.Append(args.STRING, "emailuser", "email username", "breellocaldev@gmail.com")
as.Append(args.STRING, "emailpass", "email password", "ML3WQRFSqe9rQ8qNkm")
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, "todotag", "todo tag", "expense")
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", "")
as.Append(args.STRING, "storepass", "store pass", "")
if err := as.Parse(); err != nil {
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)
}
config = Config{
EmailUser: as.GetString("emailuser"),
EmailPass: as.GetString("emailpass"),
EmailIMAP: as.GetString("emailimap"),
TodoAddr: as.GetString("todoaddr"),
TodoToken: token,
TodoList: list,
TodoTag: as.GetString("todotag"),
Storage: storage,
}
return config
}