diff options
Diffstat (limited to 'cmd/kbbi/main.go')
| -rw-r--r-- | cmd/kbbi/main.go | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/cmd/kbbi/main.go b/cmd/kbbi/main.go new file mode 100644 index 0000000..53bb107 --- /dev/null +++ b/cmd/kbbi/main.go @@ -0,0 +1,140 @@ +// Copyright 2020, Shulhan <m.shulhan@gmail.com>. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "bytes" + "encoding/gob" + "errors" + "flag" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "path/filepath" + "sort" + + "github.com/shuLhan/kbbi" +) + +const ( + configDir = "kbbi" + cookieFile = "cookie" +) + +func main() { + var ( + isListKataDasar bool + surel string + sandi string + ) + + log.SetFlags(0) + + baseDir, err := os.UserConfigDir() + if err != nil { + log.Fatal("kbbi.createConfigDir:", err) + } + + createConfigDir(baseDir) + cookies := loadCookies(baseDir) + + flag.StringVar(&surel, "surel", "", "Nama pengguna") + flag.StringVar(&sandi, "sandi", "", "Sandi pengguna") + flag.BoolVar(&isListKataDasar, "daftar-kata-dasar", false, + "Ambil dan cetak semua kata dasar") + + flag.Parse() + + cl, err := kbbi.New(cookies) + if err != nil { + log.Fatal(err) + } + + if len(surel) > 0 && len(sandi) > 0 { + cookies, err = cl.Login(surel, sandi) + if err != nil { + log.Fatal("kbbi: ", err) + } + saveCookies(baseDir, cookies) + cl.SetCookies(cookies) + } + + if isListKataDasar { + if len(cookies) == 0 { + log.Fatal("opsi -daftar-kata-dasar membutuhkan opsi -surel dan -sandi") + } + + listKataDasar(cl) + } +} + +func createConfigDir(baseDir string) { + var err error + + err = os.MkdirAll(filepath.Join(baseDir, configDir), 0700) + if err != nil { + log.Fatal("kbbi.createConfigDir:", err) + } +} + +func listKataDasar(cl *kbbi.Client) { + kataDasar, err := cl.ListKataDasar() + if err != nil { + log.Println(err) + } + + list := make([]string, 0, len(kataDasar)) + + for k := range kataDasar { + list = append(list, k) + } + + sort.Strings(list) + + for _, kata := range list { + fmt.Println(kata) + } +} + +func loadCookies(baseDir string) (cookies []*http.Cookie) { + f := filepath.Join(baseDir, configDir, cookieFile) + + _, err := os.Stat(f) + if errors.Is(err, os.ErrNotExist) { + return nil + } + + body, err := ioutil.ReadFile(f) + if err != nil { + log.Fatal("kbbi.loadCookies: ", err) + } + + dec := gob.NewDecoder(bytes.NewReader(body)) + + err = dec.Decode(&cookies) + if err != nil { + log.Println("kbbi.loadCookies: ", err) + } + + return cookies +} + +func saveCookies(baseDir string, cookies []*http.Cookie) { + f := filepath.Join(baseDir, configDir, cookieFile) + + var buf bytes.Buffer + enc := gob.NewEncoder(&buf) + err := enc.Encode(cookies) + if err != nil { + log.Fatal("kbbi.saveCookies: ", err) + } + + err = ioutil.WriteFile(f, buf.Bytes(), 0600) + if err != nil { + log.Fatal("kbbi.saveCookies: ", err) + } +} |
