initial
This commit is contained in:
86
main.go
Normal file
86
main.go
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user