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  }