mirror of
https://github.com/taigrr/wtf
synced 2025-01-18 04:03:14 -08:00
cryptolist supports toplist
This commit is contained in:
23
cryptoexchanges/cryptolive/toplist/display.go
Normal file
23
cryptoexchanges/cryptolive/toplist/display.go
Normal file
@@ -0,0 +1,23 @@
|
||||
package toplist
|
||||
|
||||
import "fmt"
|
||||
|
||||
func (widget *Widget) display() {
|
||||
str := ""
|
||||
for _, fromCurrency := range widget.list.items {
|
||||
str += fmt.Sprintf("%s (%s)\n", fromCurrency.displayName, fromCurrency.name)
|
||||
for _, toCurrency := range fromCurrency.to {
|
||||
str += fmt.Sprintf(" %s\n", toCurrency.name)
|
||||
for _, info := range toCurrency.info {
|
||||
str += makeInfoRow(info)
|
||||
str += "\n\n"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
widget.Result = str
|
||||
}
|
||||
|
||||
func makeInfoRow(info tInfo) string {
|
||||
return fmt.Sprintf(" Exchange: %s\n", info.exchange) + fmt.Sprintf(" Volume(24h): %f-%f", info.volume24h, info.volume24hTo)
|
||||
}
|
||||
41
cryptoexchanges/cryptolive/toplist/toplist.go
Normal file
41
cryptoexchanges/cryptolive/toplist/toplist.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package toplist
|
||||
|
||||
type cList struct {
|
||||
items []*fCurrency
|
||||
}
|
||||
|
||||
type fCurrency struct {
|
||||
name, displayName string
|
||||
limit int
|
||||
to []*tCurrency
|
||||
}
|
||||
|
||||
type tCurrency struct {
|
||||
name string
|
||||
info []tInfo
|
||||
}
|
||||
|
||||
type tInfo struct {
|
||||
exchange string
|
||||
volume24h, volume24hTo float32
|
||||
}
|
||||
|
||||
type responseInterface struct {
|
||||
Response string `json:"Response"`
|
||||
Data []struct {
|
||||
Exchange string `json:"exchange"`
|
||||
FromSymbol string `json:"fromSymbol"`
|
||||
ToSymbol string `json:"toSymbol"`
|
||||
Volume24h float32 `json:"volume24h"`
|
||||
Volume24hTo float32 `json:"volume24hTo"`
|
||||
} `json:"Data"`
|
||||
}
|
||||
|
||||
func (list *cList) addItem(name, displayName string, limit int, to []*tCurrency) {
|
||||
list.items = append(list.items, &fCurrency{
|
||||
name: name,
|
||||
displayName: displayName,
|
||||
limit: limit,
|
||||
to: to,
|
||||
})
|
||||
}
|
||||
117
cryptoexchanges/cryptolive/toplist/widget.go
Normal file
117
cryptoexchanges/cryptolive/toplist/widget.go
Normal file
@@ -0,0 +1,117 @@
|
||||
package toplist
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/olebedev/config"
|
||||
)
|
||||
|
||||
// Config is a pointer to the global config object
|
||||
var Config *config.Config
|
||||
var started = false
|
||||
var baseURL = "https://min-api.cryptocompare.com/data/top/exchanges"
|
||||
|
||||
// Widget Toplist Widget
|
||||
type Widget struct {
|
||||
Result string
|
||||
|
||||
RefreshInterval int
|
||||
|
||||
list *cList
|
||||
}
|
||||
|
||||
// NewWidget Make new toplist widget
|
||||
func NewWidget() *Widget {
|
||||
widget := Widget{}
|
||||
|
||||
started = false
|
||||
widget.list = &cList{}
|
||||
widget.setList()
|
||||
|
||||
return &widget
|
||||
}
|
||||
|
||||
func (widget *Widget) setList() {
|
||||
currenciesMap, _ := Config.Map("wtf.mods.cryptolive.top")
|
||||
|
||||
for fromCurrency := range currenciesMap {
|
||||
displayName := Config.UString("wtf.mods.cryptolive.top."+fromCurrency+".displayName", "")
|
||||
limit := Config.UInt("wtf.mods.cryptolive.top."+fromCurrency+".limit", 5)
|
||||
widget.list.addItem(fromCurrency, displayName, limit, makeToList(fromCurrency, limit))
|
||||
}
|
||||
}
|
||||
|
||||
func makeToList(fCurrencyName string, limit int) (list []*tCurrency) {
|
||||
toList, _ := Config.List("wtf.mods.cryptolive.top." + fCurrencyName + ".to")
|
||||
|
||||
for _, toCurrency := range toList {
|
||||
list = append(list, &tCurrency{
|
||||
name: toCurrency.(string),
|
||||
info: make([]tInfo, limit),
|
||||
})
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
/* -------------------- Exported Functions -------------------- */
|
||||
|
||||
// Refresh & update after interval time
|
||||
func (widget *Widget) Refresh() {
|
||||
|
||||
if !started {
|
||||
go func() {
|
||||
for {
|
||||
widget.updateData()
|
||||
time.Sleep(time.Second * time.Duration(widget.RefreshInterval))
|
||||
}
|
||||
}()
|
||||
started = true
|
||||
}
|
||||
|
||||
widget.display()
|
||||
}
|
||||
|
||||
/* -------------------- Unexported Functions -------------------- */
|
||||
|
||||
func (widget *Widget) updateData() {
|
||||
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user