You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cointop/cointop/marketbar.go

117 lines
2.9 KiB
Go

package cointop
import (
"fmt"
6 years ago
"math"
"time"
5 years ago
types "github.com/miguelmota/cointop/cointop/common/api/types"
"github.com/miguelmota/cointop/cointop/common/color"
"github.com/miguelmota/cointop/cointop/common/filecache"
"github.com/miguelmota/cointop/cointop/common/humanize"
"github.com/miguelmota/cointop/cointop/common/pad"
)
func (ct *Cointop) updateMarketbar() error {
maxX := ct.width()
6 years ago
logo := fmt.Sprintf("%s%s%s%s", color.Green(""), color.Cyan(""), color.Green(""), color.Cyan("cointop"))
var content string
6 years ago
if ct.portfoliovisible {
total := ct.getPortfolioTotal()
totalstr := humanize.Commaf(total)
6 years ago
if !(ct.currencyconversion == "BTC" || ct.currencyconversion == "ETH" || total < 1) {
total = math.Round(total*1e2) / 1e2
totalstr = humanize.Commaf2(total)
}
6 years ago
timeframe := ct.selectedchartrange
chartname := ct.selectedCoinName()
var charttitle string
if chartname == "" {
chartname = "Portfolio"
charttitle = color.Cyan(chartname)
} else {
charttitle = fmt.Sprintf("Portfolio - %s", color.Cyan(chartname))
}
var percentChange24H float64
for _, p := range ct.getPortfolioSlice() {
n := ((p.Balance / total) * p.PercentChange24H)
if math.IsNaN(n) {
continue
}
percentChange24H += n
}
color24h := color.White
arrow := ""
if percentChange24H > 0 {
color24h = color.Green
arrow = "▲"
}
if percentChange24H < 0 {
color24h = color.Red
arrow = "▼"
}
6 years ago
content = fmt.Sprintf(
"[ Chart: %s %s ] Total Portfolio Value: %s • 24H: %s",
6 years ago
charttitle,
timeframe,
color.Cyan(fmt.Sprintf("%s%s", ct.currencySymbol(), totalstr)),
color24h(fmt.Sprintf("%.2f%%%s", percentChange24H, arrow)),
6 years ago
)
} else {
6 years ago
var market types.GlobalMarketData
var err error
cachekey := "market"
cached, found := ct.cache.Get(cachekey)
if found {
// cache hit
var ok bool
market, ok = cached.(types.GlobalMarketData)
if ok {
ct.debuglog("soft cache hit")
}
} else {
market, err = ct.api.GetGlobalMarketData(ct.currencyconversion)
if err != nil {
return err
}
ct.cache.Set(cachekey, market, 10*time.Second)
go func() {
5 years ago
filecache.Set(cachekey, market, 24*time.Hour)
6 years ago
}()
}
6 years ago
timeframe := ct.selectedchartrange
chartname := ct.selectedCoinName()
if chartname == "" {
chartname = "Global"
}
6 years ago
content = fmt.Sprintf(
"[ Chart: %s %s ] Global ▶ Market Cap: $%s • 24H Volume: $%s • BTC Dominance: %.2f%% • Active Currencies: %s • Active Markets: %s",
color.Cyan(chartname),
timeframe,
humanize.Commaf(market.TotalMarketCapUSD),
humanize.Commaf(market.Total24HVolumeUSD),
market.BitcoinPercentageOfMarketCap,
humanize.Commaf(float64(market.ActiveCurrencies)),
humanize.Commaf(float64(market.ActiveMarkets)),
)
}
6 years ago
content = fmt.Sprintf("%s %s", logo, content)
content = pad.Right(content, maxX, " ")
ct.update(func() {
ct.marketbarview.Clear()
6 years ago
fmt.Fprintln(ct.marketbarview, content)
})
6 years ago
return nil
}