1package bittrex 2 3import ( 4 "encoding/json" 5 "fmt" 6 "time" 7 8 "net/http" 9 10 "github.com/rivo/tview" 11 "github.com/wtfutil/wtf/view" 12) 13 14var ok = true 15var errorText = "" 16 17const baseURL = "https://bittrex.com/api/v1.1/public/getmarketsummary" 18 19// Widget define wtf widget to register widget later 20type Widget struct { 21 view.TextWidget 22 23 settings *Settings 24 summaryList 25} 26 27// NewWidget Make new instance of widget 28func NewWidget(app *tview.Application, settings *Settings) *Widget { 29 widget := Widget{ 30 TextWidget: view.NewTextWidget(app, settings.common, false), 31 32 settings: settings, 33 summaryList: summaryList{}, 34 } 35 36 ok = true 37 errorText = "" 38 39 widget.setSummaryList() 40 41 return &widget 42} 43 44func (widget *Widget) setSummaryList() { 45 for symbol, currency := range widget.settings.summary.currencies { 46 mCurrencyList := widget.makeSummaryMarketList(symbol, currency.market) 47 widget.summaryList.addSummaryItem(symbol, currency.displayName, mCurrencyList) 48 } 49} 50 51func (widget *Widget) makeSummaryMarketList(currencySymbol string, market []interface{}) []*mCurrency { 52 mCurrencyList := []*mCurrency{} 53 54 for _, marketSymbol := range market { 55 mCurrencyList = append(mCurrencyList, makeMarketCurrency(marketSymbol.(string))) 56 } 57 58 return mCurrencyList 59} 60 61func makeMarketCurrency(name string) *mCurrency { 62 return &mCurrency{ 63 name: name, 64 summaryInfo: summaryInfo{ 65 High: "", 66 Low: "", 67 Volume: "", 68 Last: "", 69 OpenBuyOrders: "", 70 OpenSellOrders: "", 71 }, 72 } 73} 74 75/* -------------------- Exported Functions -------------------- */ 76 77// Refresh & update after interval time 78func (widget *Widget) Refresh() { 79 widget.updateSummary() 80 81 widget.display() 82} 83 84/* -------------------- Unexported Functions -------------------- */ 85 86func (widget *Widget) updateSummary() { 87 // In case if anything bad happened! 88 defer func() { 89 recover() 90 }() 91 92 client := &http.Client{ 93 Timeout: time.Duration(5 * time.Second), 94 } 95 96 for _, baseCurrency := range widget.summaryList.items { 97 for _, mCurrency := range baseCurrency.markets { 98 request := makeRequest(baseCurrency.name, mCurrency.name) 99 response, err := client.Do(request) 100 101 if err != nil { 102 ok = false 103 errorText = "Please Check Your Internet Connection!" 104 break 105 } else { 106 ok = true 107 errorText = "" 108 } 109 110 if response.StatusCode != http.StatusOK { 111 errorText = response.Status 112 ok = false 113 break 114 } else { 115 ok = true 116 errorText = "" 117 } 118 119 defer response.Body.Close() 120 jsonResponse := summaryResponse{} 121 decoder := json.NewDecoder(response.Body) 122 decoder.Decode(&jsonResponse) 123 124 if !jsonResponse.Success { 125 ok = false 126 errorText = fmt.Sprintf("%s-%s: %s", baseCurrency.name, mCurrency.name, jsonResponse.Message) 127 break 128 } 129 ok = true 130 errorText = "" 131 132 mCurrency.Last = fmt.Sprintf("%f", jsonResponse.Result[0].Last) 133 mCurrency.High = fmt.Sprintf("%f", jsonResponse.Result[0].High) 134 mCurrency.Low = fmt.Sprintf("%f", jsonResponse.Result[0].Low) 135 mCurrency.Volume = fmt.Sprintf("%f", jsonResponse.Result[0].Volume) 136 mCurrency.OpenBuyOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenBuyOrders) 137 mCurrency.OpenSellOrders = fmt.Sprintf("%d", jsonResponse.Result[0].OpenSellOrders) 138 } 139 } 140 141 widget.display() 142} 143 144func makeRequest(baseName, marketName string) *http.Request { 145 url := fmt.Sprintf("%s?market=%s-%s", baseURL, baseName, marketName) 146 request, _ := http.NewRequest("GET", url, nil) 147 148 return request 149} 150