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