From fcfb0f48fe0c0671b060cd6436b78ffca836eb36 Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Thu, 26 Aug 2021 10:29:25 +1000 Subject: [PATCH 1/4] Add support for 1Y columns - see https://github.com/miguelmota/cointop/issues/131 --- cointop/actions.go | 1 + cointop/coin.go | 1 + cointop/coins_table.go | 20 ++++++++++++++++++++ cointop/default_shortcuts.go | 1 + cointop/keybindings.go | 2 ++ cointop/list.go | 2 ++ cointop/portfolio.go | 20 ++++++++++++++++++++ cointop/sort.go | 2 ++ cointop/table_header.go | 5 +++++ pkg/api/impl/coingecko/coingecko.go | 6 ++++++ pkg/api/types/types.go | 1 + 11 files changed, 61 insertions(+) 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..b5894a5 100644 --- a/cointop/default_shortcuts.go +++ b/cointop/default_shortcuts.go @@ -39,6 +39,7 @@ func DefaultShortcuts() map[string]string { "1": "sort_column_1h_change", "2": "sort_column_24h_change", "3": "sort_column_30d_change", + "6": "sort_column_1y_change", "7": "sort_column_7d_change", "a": "sort_column_available_supply", "b": "sort_column_balance", 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..80ea034 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: "3[6]5D%", + PlainLabel: "1Y%", + }, "total_supply": &HeaderColumn{ Slug: "total_supply", Label: "[t]otal supply", 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"` } From 7f2f4c551cdaf84e4d14763e9988973ec9774e15 Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Thu, 26 Aug 2021 11:33:27 +1000 Subject: [PATCH 2/4] Merge doc update, and add 1y_change --- docs/content/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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? From 79b2fb8ea6ff9bf8defda79837a9f925367faa28 Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Sun, 29 Aug 2021 16:38:58 +1000 Subject: [PATCH 3/4] Change hotkey for 1Y change to "y" --- .vscode/launch.json | 25 +++++++++++++++++++++++++ cointop/default_shortcuts.go | 2 +- cointop/table_header.go | 2 +- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..ef5ad3b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Holdings", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "cmd/cointop/cointop.go", + "args": ["holdings"], + "env": {"DEBUG": "yes"} + }, + { + "name": "Portfolio", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "cmd/cointop/cointop.go", + "env": {"DEBUG": "yes"} + } + ] +} \ No newline at end of file diff --git a/cointop/default_shortcuts.go b/cointop/default_shortcuts.go index b5894a5..f1bdafa 100644 --- a/cointop/default_shortcuts.go +++ b/cointop/default_shortcuts.go @@ -39,7 +39,6 @@ func DefaultShortcuts() map[string]string { "1": "sort_column_1h_change", "2": "sort_column_24h_change", "3": "sort_column_30d_change", - "6": "sort_column_1y_change", "7": "sort_column_7d_change", "a": "sort_column_available_supply", "b": "sort_column_balance", @@ -70,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/table_header.go b/cointop/table_header.go index 80ea034..359c0a7 100644 --- a/cointop/table_header.go +++ b/cointop/table_header.go @@ -97,7 +97,7 @@ var HeaderColumns = map[string]*HeaderColumn{ }, "1y_change": &HeaderColumn{ Slug: "1y_change", - Label: "3[6]5D%", + Label: "1[y]%", PlainLabel: "1Y%", }, "total_supply": &HeaderColumn{ From 31fbce600643f8c904c3458e02170da2d83f8343 Mon Sep 17 00:00:00 2001 From: Simon Roberts Date: Sun, 29 Aug 2021 16:39:50 +1000 Subject: [PATCH 4/4] Remove vscode file --- .vscode/launch.json | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index ef5ad3b..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Holdings", - "type": "go", - "request": "launch", - "mode": "auto", - "program": "cmd/cointop/cointop.go", - "args": ["holdings"], - "env": {"DEBUG": "yes"} - }, - { - "name": "Portfolio", - "type": "go", - "request": "launch", - "mode": "auto", - "program": "cmd/cointop/cointop.go", - "env": {"DEBUG": "yes"} - } - ] -} \ No newline at end of file