From 35a64342fd7317ba9fe090b1a16963377cd2ebc6 Mon Sep 17 00:00:00 2001 From: Adithya Chari Date: Wed, 27 Nov 2019 14:13:38 -0600 Subject: [PATCH] initial --- main.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 main.go diff --git a/main.go b/main.go new file mode 100644 index 0000000..4d696e7 --- /dev/null +++ b/main.go @@ -0,0 +1,86 @@ +package main + +import ( + "encoding/json" + "flag" + "io/ioutil" + "log" + "net/http" + "os" + "os/exec" + "strings" + "time" +) + +func main() { + ledgerFile := flag.String("f", "ledger.ledger", "Ledger File") + priceDbFile := flag.String("p", "prices.db", "Price Database File") + flag.Parse() + + commodities := GetCommodities(*ledgerFile) + + pricedb, err := os.OpenFile(*priceDbFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Fatalf("Price database file access failed with %s\n", err) + } + defer pricedb.Close() + + for _, c := range commodities { + pricedb.WriteString("P " + GetTimeString() + " " + c + " " + GetPriceString(c) + "\n") + } +} + +func GetPriceString(ticker string) string { + resp, err := http.Get("https://api.worldtradingdata.com/api/v1/stock?symbol=" + ticker + "&api_token=zkyqseprRGFE2qN0sck4QiFcmyw0kJirCeXKYcXpGM80FEBmitI03aLT31RJ") + if err != nil { + log.Fatalf("Price request of ticker %s failed with %s\n", ticker, err) + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Fatalf("Price read of ticker %s failed with %s\n", ticker, err) + } + + var f interface{} + json.Unmarshal(body, &f) + m := f.(map[string]interface{}) + dataInterface := m["data"] + arr := dataInterface.([]interface{}) + elem := arr[0] + ma := elem.(map[string]interface{}) + priceInterface := ma["price"] + price := priceInterface.(string) + return "$" + price +} + +func GetTimeString() string { + return time.Now().Format("2006-01-02 15:04:05") +} + +func GetCommodities(ledger string) []string { + cmd := exec.Command("ledger", "-f", ledger, "commodities") + out, err := cmd.Output() + if err != nil { + log.Fatalf("Ledger file commodity report failed with %s\n", err) + } + a := strings.Split(string(out), "\n") + sliceOut := a[:len(a)-1] + + commodities := make([]string, 0) + for _, e := range sliceOut { + if IsTicker(e) { + commodities = append(commodities, e) + } + } + return commodities +} + +func IsTicker(s string) bool { + for _, e := range s { + if (e < 'A' || e > 'Z') && (e < '0' || e > '9') { + return false + } + } + return true +}