1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00

cryptolist supports toplist

This commit is contained in:
Hossein Mehrabi
2018-06-06 02:53:15 +04:30
parent ef633cb397
commit 10b6431be1
7 changed files with 391 additions and 156 deletions

View 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)
}

View 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,
})
}

View 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
}