2
0
mirror of https://github.com/miguelmota/cointop synced 2024-11-14 18:12:57 +00:00
cointop/cointop/marketbar.go
2020-08-04 00:08:07 -07:00

162 lines
4.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cointop
import (
"fmt"
"math"
"time"
types "github.com/miguelmota/cointop/cointop/common/api/types"
"github.com/miguelmota/cointop/cointop/common/color"
"github.com/miguelmota/cointop/cointop/common/humanize"
"github.com/miguelmota/cointop/cointop/common/pad"
)
// MarketbarView is structure for marketbar view
type MarketbarView struct {
*View
}
// NewMarketbarView returns a new marketbar view
func NewMarketbarView() *MarketbarView {
return &MarketbarView{NewView("marketbar")}
}
// UpdateMarketbar updates the market bar view
func (ct *Cointop) UpdateMarketbar() error {
ct.debuglog("updateMarketbar()")
if ct.Views.Marketbar.Backing() == nil {
return nil
}
maxX := ct.width()
logo := "cointop"
if ct.colorschemeName == "cointop" {
logo = fmt.Sprintf("%s%s%s%s", color.Green(""), color.Cyan(""), color.Green(""), color.Cyan("cointop"))
}
var content string
if ct.State.portfolioVisible {
total := ct.GetPortfolioTotal()
totalstr := humanize.Commaf(total)
if !(ct.State.currencyConversion == "BTC" || ct.State.currencyConversion == "ETH" || total < 1) {
total = math.Round(total*1e2) / 1e2
totalstr = humanize.Commaf2(total)
}
timeframe := ct.State.selectedChartRange
chartname := ct.SelectedCoinName()
var charttitle string
if chartname == "" {
chartname = "Portfolio"
charttitle = ct.colorscheme.MarketBarLabelActive(chartname)
} else {
charttitle = fmt.Sprintf("Portfolio - %s", ct.colorscheme.MarketBarLabelActive(chartname))
}
var percentChange24H float64
for _, p := range ct.GetPortfolioSlice() {
n := ((p.Balance / total) * p.PercentChange24H)
if math.IsNaN(n) {
continue
}
percentChange24H += n
}
color24h := ct.colorscheme.MarketbarSprintf()
arrow := ""
if percentChange24H > 0 {
color24h = ct.colorscheme.MarketbarChangeUpSprintf()
arrow = "▲"
}
if percentChange24H < 0 {
color24h = ct.colorscheme.MarketbarChangeDownSprintf()
arrow = "▼"
}
chartInfo := ""
if !ct.State.hideChart {
chartInfo = fmt.Sprintf(
"[ Chart: %s %s ] ",
charttitle,
timeframe,
)
}
content = fmt.Sprintf(
"%sTotal Portfolio Value: %s • 24H: %s",
chartInfo,
ct.colorscheme.MarketBarLabelActive(fmt.Sprintf("%s%s", ct.CurrencySymbol(), totalstr)),
color24h(fmt.Sprintf("%.2f%%%s", percentChange24H, arrow)),
)
} else {
var market types.GlobalMarketData
var err error
cachekey := ct.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")
}
}
if market.TotalMarketCapUSD == 0 {
market, err = ct.api.GetGlobalMarketData(ct.State.currencyConversion)
if err != nil {
if ct.filecache != nil {
ct.filecache.Get(cachekey, &market)
}
}
ct.cache.Set(cachekey, market, 10*time.Second)
if ct.filecache != nil {
go func() {
ct.filecache.Set(cachekey, market, 24*time.Hour)
}()
}
}
timeframe := ct.State.selectedChartRange
chartname := ct.SelectedCoinName()
if chartname == "" {
chartname = "Global"
}
chartInfo := ""
if !ct.State.hideChart {
chartInfo = fmt.Sprintf(
"[ Chart: %s %s ] ",
ct.colorscheme.MarketBarLabelActive(chartname),
timeframe,
)
}
content = fmt.Sprintf(
"%sGlobal ▶ Market Cap: %s • 24H Volume: %s • BTC Dominance: %.2f%%",
chartInfo,
fmt.Sprintf("%s%s", ct.CurrencySymbol(), humanize.Commaf0(market.TotalMarketCapUSD)),
fmt.Sprintf("%s%s", ct.CurrencySymbol(), humanize.Commaf0(market.Total24HVolumeUSD)),
market.BitcoinPercentageOfMarketCap,
)
}
content = fmt.Sprintf("%s %s", logo, content)
content = pad.Right(content, maxX, " ")
content = ct.colorscheme.Marketbar(content)
ct.Update(func() error {
if ct.Views.Marketbar.Backing() == nil {
return nil
}
ct.Views.Marketbar.Backing().Clear()
fmt.Fprintln(ct.Views.Marketbar.Backing(), content)
return nil
})
return nil
}