main.go (2325B)
1 package main 2 3 import ( 4 "bytes" 5 "fio/fio" 6 "flag" 7 "fmt" 8 "log" 9 "net/http" 10 "os" 11 "strings" 12 ) 13 14 const base_url = "https://www.fio.cz/ib_api/rest/" 15 16 var ( 17 tokensFile = flag.String("t", "tokens", "fio api token") 18 port = flag.String("port", "3000", "serving port") 19 20 templates map[string][]byte 21 accounts []*account 22 lastUri string = "/" 23 ) 24 25 func checkErr(err error, msg ...interface{}) { 26 if err != nil { 27 log.Fatal(msg...) 28 } 29 } 30 31 func main() { 32 flag.Parse() 33 34 // Tokens 35 if *tokensFile == "" { 36 log.Fatal("Token file was not provided") 37 } 38 file, err := os.Open(*tokensFile) 39 checkErr(err, "Cannot read token file") 40 tokens, err := parseTokens(file) 41 checkErr(err, "Cannot parse token file") 42 43 // templates 44 templates = loadTemplates([]string{"dashboard", "balance", "card"}) 45 46 // accounts 47 for _, token := range tokens { 48 fio := fio.Fio{Base_url: base_url, Token: token.token} 49 accounts = append(accounts, &account{name: token.name, config: token.config, fio: &fio}) 50 } 51 52 http.HandleFunc("/", serveDashboard()) 53 for _, acc := range accounts { 54 http.HandleFunc("/"+acc.name, serveBalance(acc.name)) 55 } 56 57 log.Printf("Listening on :%s...\n", *port) 58 err = http.ListenAndServe(":"+*port, nil) 59 checkErr(err, err) 60 } 61 62 // DASHBOARD 63 func serveDashboard() http.HandlerFunc { 64 return func(w http.ResponseWriter, r *http.Request) { 65 file := loadDashboard(templates["dashboard"]) 66 fmt.Fprint(w, file) 67 } 68 } 69 70 // BALANCE 71 func serveBalance(name string) http.HandlerFunc { 72 return func(w http.ResponseWriter, r *http.Request) { 73 acc := getAcc(name) 74 cards := accCards(acc.name) 75 balance, err := acc.loadBalance(templates["balance"], cards) 76 if err != nil { 77 log.Print(err) 78 http.Redirect(w, r, "/", http.StatusTemporaryRedirect) 79 return 80 } 81 fmt.Fprint(w, balance) 82 } 83 } 84 85 func loadDashboard(template []byte) string { 86 cards := accCards("") 87 return strings.Replace(string(template), "{{CARDS}}", cards, -1) 88 } 89 90 func accCards(activeAcc string) string { 91 var cardBuf bytes.Buffer 92 for _, acc := range accounts { 93 card, err := acc.loadCard(templates["card"], activeAcc == acc.name) 94 if err != nil { 95 log.Print(err) 96 continue 97 } 98 cardBuf.WriteString(card) 99 } 100 return cardBuf.String() 101 } 102 103 func getAcc(name string) *account { 104 for _, acc := range accounts { 105 if acc.name == name { 106 return acc 107 } 108 } 109 return nil 110 }