mirror of https://github.com/miguelmota/cointop
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.
158 lines
3.7 KiB
Go
158 lines
3.7 KiB
Go
package cointop
|
|
|
|
import (
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// Coin is the row structure
|
|
type Coin struct {
|
|
ID string
|
|
Name string
|
|
Slug string
|
|
Symbol string
|
|
Rank int
|
|
Price float64
|
|
Volume24H float64
|
|
MarketCap float64
|
|
AvailableSupply float64
|
|
TotalSupply float64
|
|
PercentChange1H float64
|
|
PercentChange24H float64
|
|
PercentChange7D float64
|
|
PercentChange30D float64
|
|
PercentChange1Y float64
|
|
LastUpdated string
|
|
// for favorites
|
|
Favorite bool
|
|
// for portfolio
|
|
Holdings float64
|
|
Balance float64
|
|
BuyPrice float64
|
|
BuyCurrency string
|
|
}
|
|
|
|
// DeepCopy returns a deep copy of a 'Coin' object, making it alright to modify
|
|
// the rank of the coin object without updating the global state.
|
|
func (c *Coin) DeepCopy() *Coin {
|
|
return &Coin{
|
|
ID: c.ID,
|
|
Name: c.Name,
|
|
Slug: c.Slug,
|
|
Symbol: c.Symbol,
|
|
Rank: c.Rank,
|
|
Price: c.Price,
|
|
Volume24H: c.Volume24H,
|
|
MarketCap: c.MarketCap,
|
|
AvailableSupply: c.AvailableSupply,
|
|
TotalSupply: c.TotalSupply,
|
|
PercentChange1H: c.PercentChange1H,
|
|
PercentChange24H: c.PercentChange24H,
|
|
PercentChange7D: c.PercentChange7D,
|
|
PercentChange30D: c.PercentChange30D,
|
|
PercentChange1Y: c.PercentChange1Y,
|
|
LastUpdated: c.LastUpdated,
|
|
Favorite: c.Favorite,
|
|
Holdings: c.Holdings,
|
|
Balance: c.Balance,
|
|
BuyPrice: c.BuyPrice,
|
|
BuyCurrency: c.BuyCurrency,
|
|
}
|
|
}
|
|
|
|
// AllCoins returns a slice of all the coins
|
|
func (ct *Cointop) AllCoins() []*Coin {
|
|
log.Debug("AllCoins()")
|
|
if ct.IsFavoritesVisible() {
|
|
var list []*Coin
|
|
for i := range ct.State.allCoins {
|
|
coin := ct.State.allCoins[i]
|
|
if coin.Favorite {
|
|
list = append(list, coin)
|
|
}
|
|
}
|
|
return list
|
|
}
|
|
|
|
if ct.IsPortfolioVisible() {
|
|
var list []*Coin
|
|
for i := range ct.State.allCoins {
|
|
coin := ct.State.allCoins[i]
|
|
if ct.PortfolioEntryExists(coin) {
|
|
list = append(list, coin)
|
|
}
|
|
}
|
|
return list
|
|
}
|
|
|
|
return ct.State.allCoins
|
|
}
|
|
|
|
// CoinBySymbol returns the coin struct given the symbol
|
|
func (ct *Cointop) CoinBySymbol(symbol string) *Coin {
|
|
log.Debug("CoinBySymbol()")
|
|
for i := range ct.State.allCoins {
|
|
coin := ct.State.allCoins[i]
|
|
if coin.Symbol == symbol {
|
|
return coin
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CoinByName returns the coin struct given the name
|
|
func (ct *Cointop) CoinByName(name string) *Coin {
|
|
log.Debug("CoinByName()")
|
|
for i := range ct.State.allCoins {
|
|
coin := ct.State.allCoins[i]
|
|
if coin.Name == name {
|
|
return coin
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CoinByID returns the coin struct given the ID
|
|
func (ct *Cointop) CoinByID(id string) *Coin {
|
|
log.Debug("CoinByID()")
|
|
for i := range ct.State.allCoins {
|
|
coin := ct.State.allCoins[i]
|
|
if coin.ID == id {
|
|
return coin
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// UpdateCoin updates coin info after fetching from API
|
|
func (ct *Cointop) UpdateCoin(coin *Coin) error {
|
|
log.Debug("UpdateCoin()")
|
|
v, err := ct.api.GetCoinData(coin.Name, ct.State.currencyConversion)
|
|
if err != nil {
|
|
log.Debugf("UpdateCoin() could not fetch coin data %s", coin.Name)
|
|
return err
|
|
}
|
|
|
|
coin = &Coin{
|
|
ID: v.ID,
|
|
Name: v.Name,
|
|
Symbol: v.Symbol,
|
|
Rank: v.Rank,
|
|
Price: v.Price,
|
|
Volume24H: v.Volume24H,
|
|
MarketCap: v.MarketCap,
|
|
AvailableSupply: v.AvailableSupply,
|
|
TotalSupply: v.TotalSupply,
|
|
PercentChange1H: v.PercentChange1H,
|
|
PercentChange24H: v.PercentChange24H,
|
|
PercentChange7D: v.PercentChange7D,
|
|
PercentChange30D: v.PercentChange30D,
|
|
PercentChange1Y: v.PercentChange1Y,
|
|
LastUpdated: v.LastUpdated,
|
|
Slug: v.Slug,
|
|
}
|
|
|
|
ct.State.allCoinsSlugMap.Store(coin.Name, coin)
|
|
|
|
return nil
|
|
}
|