mirror of
				https://github.com/taigrr/wtf
				synced 2025-01-18 04:03:14 -08:00 
			
		
		
		
	
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package toplist
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
	"os"
 | 
						|
	"sync"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
var baseURL = "https://min-api.cryptocompare.com/data/top/exchanges"
 | 
						|
 | 
						|
// Widget Toplist Widget
 | 
						|
type Widget struct {
 | 
						|
	Result string
 | 
						|
 | 
						|
	RefreshInterval int
 | 
						|
 | 
						|
	list     *cList
 | 
						|
	settings *Settings
 | 
						|
}
 | 
						|
 | 
						|
// NewWidget Make new toplist widget
 | 
						|
func NewWidget(settings *Settings) *Widget {
 | 
						|
	widget := Widget{
 | 
						|
		settings: settings,
 | 
						|
	}
 | 
						|
 | 
						|
	widget.list = &cList{}
 | 
						|
	widget.setList()
 | 
						|
 | 
						|
	return &widget
 | 
						|
}
 | 
						|
 | 
						|
func (widget *Widget) setList() {
 | 
						|
	for symbol, currency := range widget.settings.top {
 | 
						|
		toList := widget.makeToList(symbol, currency.limit)
 | 
						|
		widget.list.addItem(symbol, currency.displayName, currency.limit, toList)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (widget *Widget) makeToList(symbol string, limit int) (list []*tCurrency) {
 | 
						|
	for _, to := range widget.settings.top[symbol].to {
 | 
						|
		list = append(list, &tCurrency{
 | 
						|
			name: to.(string),
 | 
						|
			info: make([]tInfo, limit),
 | 
						|
		})
 | 
						|
	}
 | 
						|
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
/* -------------------- Exported Functions -------------------- */
 | 
						|
 | 
						|
// Refresh & update after interval time
 | 
						|
func (widget *Widget) Refresh(wg *sync.WaitGroup) {
 | 
						|
	if len(widget.list.items) == 0 {
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	widget.updateData()
 | 
						|
 | 
						|
	widget.display()
 | 
						|
	wg.Done()
 | 
						|
}
 | 
						|
 | 
						|
/* -------------------- Unexported Functions -------------------- */
 | 
						|
 | 
						|
func (widget *Widget) updateData() {
 | 
						|
	defer func() {
 | 
						|
		recover()
 | 
						|
	}()
 | 
						|
 | 
						|
	client := &http.Client{
 | 
						|
		Timeout: time.Duration(5 * time.Second),
 | 
						|
	}
 | 
						|
 | 
						|
	for _, fromCurrency := range widget.list.items {
 | 
						|
		for _, toCurrency := range fromCurrency.to {
 | 
						|
 | 
						|
			request := makeRequest(fromCurrency.name, toCurrency.name, fromCurrency.limit)
 | 
						|
			response, _ := client.Do(request)
 | 
						|
 | 
						|
			var jsonResponse responseInterface
 | 
						|
 | 
						|
			err := json.NewDecoder(response.Body).Decode(&jsonResponse)
 | 
						|
 | 
						|
			if err != nil {
 | 
						|
				os.Exit(1)
 | 
						|
			}
 | 
						|
 | 
						|
			for idx, info := range jsonResponse.Data {
 | 
						|
				toCurrency.info[idx] = tInfo{
 | 
						|
					exchange:    info.Exchange,
 | 
						|
					volume24h:   info.Volume24h,
 | 
						|
					volume24hTo: info.Volume24hTo,
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func makeRequest(fsym, tsym string, limit int) *http.Request {
 | 
						|
	url := fmt.Sprintf("%s?fsym=%s&tsym=%s&limit=%d", baseURL, fsym, tsym, limit)
 | 
						|
	request, _ := http.NewRequest("GET", url, nil)
 | 
						|
	return request
 | 
						|
}
 |