diff --git a/cointop/actions.go b/cointop/actions.go index 5092a07..53f098b 100644 --- a/cointop/actions.go +++ b/cointop/actions.go @@ -28,6 +28,7 @@ func ActionsMap() map[string]bool { "sort_column_24h_volume": true, "sort_column_7d_change": true, "sort_column_30d_change": true, + "sort_column_1y_change": true, "sort_column_asc": true, "sort_column_available_supply": true, "sort_column_desc": true, diff --git a/cointop/coin.go b/cointop/coin.go index c2592e1..ad01a32 100644 --- a/cointop/coin.go +++ b/cointop/coin.go @@ -16,6 +16,7 @@ type Coin struct { PercentChange24H float64 PercentChange7D float64 PercentChange30D float64 + PercentChange1Y float64 LastUpdated string // for favorites Favorite bool diff --git a/cointop/coins_table.go b/cointop/coins_table.go index 222b778..475dfd3 100644 --- a/cointop/coins_table.go +++ b/cointop/coins_table.go @@ -19,6 +19,7 @@ var SupportedCoinTableHeaders = []string{ "24h_change", "7d_change", "30d_change", + "1y_change", "24h_volume", "market_cap", "available_supply", @@ -221,6 +222,25 @@ func (ct *Cointop) GetCoinsTable() *table.Table { Color: color30d, Text: text, }) + case "1y_change": + color1y := ct.colorscheme.TableColumnChange + if coin.PercentChange1Y > 0 { + color1y = ct.colorscheme.TableColumnChangeUp + } + if coin.PercentChange1Y < 0 { + color1y = ct.colorscheme.TableColumnChangeDown + } + text := fmt.Sprintf("%v%%", humanize.Numericf(coin.PercentChange1Y, 2)) + ct.SetTableColumnWidthFromString(header, text) + ct.SetTableColumnAlignLeft(header, false) + rowCells = append(rowCells, + &table.RowCell{ + LeftMargin: leftMargin, + RightMargin: rightMargin, + LeftAlign: false, + Color: color1y, + Text: text, + }) case "market_cap": text := humanize.Monetaryf(coin.MarketCap, 0) ct.SetTableColumnWidthFromString(header, text) diff --git a/cointop/default_shortcuts.go b/cointop/default_shortcuts.go index 96fe3e7..f1bdafa 100644 --- a/cointop/default_shortcuts.go +++ b/cointop/default_shortcuts.go @@ -69,6 +69,7 @@ func DefaultShortcuts() map[string]string { "t": "sort_column_total_supply", "u": "sort_column_last_updated", "v": "sort_column_24h_volume", + "y": "sort_column_1y_change", "q": "quit_view", "Q": "quit_view", "%": "sort_column_percent_holdings", diff --git a/cointop/keybindings.go b/cointop/keybindings.go index 67def1a..a6c544d 100644 --- a/cointop/keybindings.go +++ b/cointop/keybindings.go @@ -227,6 +227,8 @@ func (ct *Cointop) Keybindings(g *gocui.Gui) error { fn = ct.Sortfn("7d_change", true) case "sort_column_30d_change": fn = ct.Sortfn("30d_change", true) + case "sort_column_1y_change": + fn = ct.Sortfn("1y_change", true) case "sort_column_available_supply": fn = ct.Sortfn("available_supply", true) case "toggle_row_chart": diff --git a/cointop/list.go b/cointop/list.go index 0bd3882..404b1eb 100644 --- a/cointop/list.go +++ b/cointop/list.go @@ -91,6 +91,7 @@ func (ct *Cointop) processCoins(coins []types.Coin) { PercentChange24H: v.PercentChange24H, PercentChange7D: v.PercentChange7D, PercentChange30D: v.PercentChange30D, + PercentChange1Y: v.PercentChange1Y, LastUpdated: v.LastUpdated, }) if ilast != nil { @@ -141,6 +142,7 @@ func (ct *Cointop) processCoins(coins []types.Coin) { c.PercentChange24H = cm.PercentChange24H c.PercentChange7D = cm.PercentChange7D c.PercentChange30D = cm.PercentChange30D + c.PercentChange1Y = cm.PercentChange1Y c.LastUpdated = cm.LastUpdated c.Favorite = cm.Favorite } diff --git a/cointop/portfolio.go b/cointop/portfolio.go index 93a89dc..0317040 100644 --- a/cointop/portfolio.go +++ b/cointop/portfolio.go @@ -30,6 +30,7 @@ var SupportedPortfolioTableHeaders = []string{ "24h_change", "7d_change", "30d_change", + "1y_change", "percent_holdings", "last_updated", } @@ -238,6 +239,25 @@ func (ct *Cointop) GetPortfolioTable() *table.Table { Color: color30d, Text: text, }) + case "1y_change": + color1y := ct.colorscheme.TableColumnChange + if coin.PercentChange1Y > 0 { + color1y = ct.colorscheme.TableColumnChangeUp + } + if coin.PercentChange1Y < 0 { + color1y = ct.colorscheme.TableColumnChangeDown + } + text := fmt.Sprintf("%.2f%%", coin.PercentChange1Y) + ct.SetTableColumnWidthFromString(header, text) + ct.SetTableColumnAlignLeft(header, false) + rowCells = append(rowCells, + &table.RowCell{ + LeftMargin: leftMargin, + RightMargin: rightMargin, + LeftAlign: false, + Color: color1y, + Text: text, + }) case "percent_holdings": percentHoldings := (coin.Balance / total) * 1e2 if math.IsNaN(percentHoldings) { diff --git a/cointop/sort.go b/cointop/sort.go index 44a3342..148f4ff 100644 --- a/cointop/sort.go +++ b/cointop/sort.go @@ -59,6 +59,8 @@ func (ct *Cointop) Sort(sortBy string, desc bool, list []*Coin, renderHeaders bo return a.PercentChange7D < b.PercentChange7D case "30d_change": return a.PercentChange30D < b.PercentChange30D + case "1y_change": + return a.PercentChange1Y < b.PercentChange1Y case "total_supply": return a.TotalSupply < b.TotalSupply case "available_supply": diff --git a/cointop/table_header.go b/cointop/table_header.go index df88fe9..359c0a7 100644 --- a/cointop/table_header.go +++ b/cointop/table_header.go @@ -95,6 +95,11 @@ var HeaderColumns = map[string]*HeaderColumn{ Label: "[3]0D%", PlainLabel: "30D%", }, + "1y_change": &HeaderColumn{ + Slug: "1y_change", + Label: "1[y]%", + PlainLabel: "1Y%", + }, "total_supply": &HeaderColumn{ Slug: "total_supply", Label: "[t]otal supply", diff --git a/docs/content/faq.md b/docs/content/faq.md index 691d1b8..0392af4 100644 --- a/docs/content/faq.md +++ b/docs/content/faq.md @@ -347,7 +347,7 @@ draft: false ## What price-change columns are available? - Supported columns relating to price change are `1h_change`, `24h_change`, `7d_change`, `30d_change` + Supported columns relating to price change are `1h_change`, `24h_change`, `7d_change`, `30d_change`, `1y_change` ## How can use a different config file other than the default? diff --git a/pkg/api/impl/coingecko/coingecko.go b/pkg/api/impl/coingecko/coingecko.go index dba038a..6bd7b08 100644 --- a/pkg/api/impl/coingecko/coingecko.go +++ b/pkg/api/impl/coingecko/coingecko.go @@ -343,6 +343,7 @@ func (s *Service) getPaginatedCoinData(convert string, offset int, names []strin pcp.PCP24h, pcp.PCP7d, pcp.PCP30d, + pcp.PCP1y, } order := geckoTypes.OrderTypeObject.MarketCapDesc convertTo := strings.ToLower(convert) @@ -372,6 +373,7 @@ func (s *Service) getPaginatedCoinData(convert string, offset int, names []strin var percentChange24H float64 var percentChange7D float64 var percentChange30D float64 + var percentChange1Y float64 if item.PriceChangePercentage1hInCurrency != nil { percentChange1H = *item.PriceChangePercentage1hInCurrency @@ -385,6 +387,9 @@ func (s *Service) getPaginatedCoinData(convert string, offset int, names []strin if item.PriceChangePercentage30dInCurrency != nil { percentChange30D = *item.PriceChangePercentage30dInCurrency } + if item.PriceChangePercentage1yInCurrency != nil { + percentChange1Y = *item.PriceChangePercentage1yInCurrency + } availableSupply := item.CirculatingSupply totalSupply := item.TotalSupply @@ -405,6 +410,7 @@ func (s *Service) getPaginatedCoinData(convert string, offset int, names []strin PercentChange24H: util.FormatPercentChange(percentChange24H), PercentChange7D: util.FormatPercentChange(percentChange7D), PercentChange30D: util.FormatPercentChange(percentChange30D), + PercentChange1Y: util.FormatPercentChange(percentChange1Y), Volume24H: util.FormatVolume(item.TotalVolume), LastUpdated: util.FormatLastUpdated(item.LastUpdated), }) diff --git a/pkg/api/types/types.go b/pkg/api/types/types.go index b474eba..3e4bf37 100644 --- a/pkg/api/types/types.go +++ b/pkg/api/types/types.go @@ -15,6 +15,7 @@ type Coin struct { PercentChange24H float64 `json:"percentChange24H"` PercentChange7D float64 `json:"percentChange7D"` PercentChange30D float64 `json:"percentChange30D"` + PercentChange1Y float64 `json:"percentChange1Y"` LastUpdated string `json:"lastUpdated"` }