Skip to content

Commit

Permalink
Clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
miguelmota committed Jul 1, 2019
1 parent bedbda8 commit 4ef4f7a
Show file tree
Hide file tree
Showing 27 changed files with 794 additions and 750 deletions.
5 changes: 4 additions & 1 deletion README.md
Expand Up @@ -644,6 +644,10 @@ Frequently asked questions:
cointop --coinmarketcap-api-key=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

- Q: I can I add my own API to cointop?

- A: Fork cointop and add the API that implements the [interface](https://github.com/miguelmota/cointop/blob/master/cointop/common/api/interface.go) to [`cointop/cointop/common/api/impl/`](https://github.com/miguelmota/cointop/tree/master/cointop/common/api/impl). You can use the [CoinGecko implementatoin](https://github.com/miguelmota/cointop/blob/master/cointop/common/api/impl/coingecko/coingecko.go) as reference.

- Q: I installed cointop without errors but the command is not found.

- A: Make sure your `GOPATH` and `PATH` is set correctly.
Expand Down Expand Up @@ -886,7 +890,6 @@ Frequently asked questions:

-A: Cointop uses ~15MB of memory so you can run it on a Raspberry Pi Zero if you wanted to (one reason why cointop was built using Go instead of Node.js or Python).


- Q: How does cointop differ from [rate.sx](https://rate.sx/)?

- A: *rate.sx* is great for one-off queries or fetching data for bash scripts because it doesn't require installing anything. Cointop differs in that it is interactive and also supports more currencies.
Expand Down
2 changes: 1 addition & 1 deletion cointop/actions.go
Expand Up @@ -55,5 +55,5 @@ func actionsMap() map[string]bool {
}

func (ct *Cointop) actionExists(action string) bool {
return ct.actionsmap[action]
return ct.actionsMap[action]
}
104 changes: 43 additions & 61 deletions cointop/chart.go
Expand Up @@ -11,59 +11,59 @@ import (
"github.com/miguelmota/cointop/cointop/common/timeutil"
)

var chartlock sync.Mutex
var chartpointslock sync.Mutex
var chartLock sync.Mutex
var chartPointsLock sync.Mutex

func (ct *Cointop) updateChart() error {
if ct.chartview == nil {
if ct.Views.Chart.Backing == nil {
return nil
}

chartlock.Lock()
defer chartlock.Unlock()
chartLock.Lock()
defer chartLock.Unlock()

if ct.portfoliovisible {
if ct.State.portfolioVisible {
if err := ct.portfolioChart(); err != nil {
return err
}
} else {
symbol := ct.selectedCoinSymbol()
name := ct.selectedCoinName()
ct.chartPoints(symbol, name)
ct.calcChartPoints(symbol, name)
}

if len(ct.chartpoints) != 0 {
ct.chartview.Clear()
if len(ct.State.chartPoints) != 0 {
ct.Views.Chart.Backing.Clear()
}
var body string
if len(ct.chartpoints) == 0 {
if len(ct.State.chartPoints) == 0 {
body = "\n\n\n\n\nnot enough data for chart"
} else {
for i := range ct.chartpoints {
for i := range ct.State.chartPoints {
var s string
for j := range ct.chartpoints[i] {
p := ct.chartpoints[i][j]
for j := range ct.State.chartPoints[i] {
p := ct.State.chartPoints[i][j]
s = fmt.Sprintf("%s%c", s, p.Ch)
}
body = fmt.Sprintf("%s%s\n", body, s)

}
}
ct.update(func() {
if ct.chartview == nil {
if ct.Views.Chart.Backing == nil {
return
}

fmt.Fprint(ct.chartview, ct.colorscheme.Chart(body))
fmt.Fprint(ct.Views.Chart.Backing, ct.colorscheme.Chart(body))
})

return nil
}

func (ct *Cointop) chartPoints(symbol string, name string) error {
maxX := ct.maxtablewidth - 3
chartpointslock.Lock()
defer chartpointslock.Unlock()
func (ct *Cointop) calcChartPoints(symbol string, name string) error {
maxX := ct.maxTableWidth - 3
chartPointsLock.Lock()
defer chartPointsLock.Unlock()
// TODO: not do this (SoC)
go ct.updateMarketbar()

Expand All @@ -74,8 +74,8 @@ func (ct *Cointop) chartPoints(symbol string, name string) error {
// NOTE: empty list means don't show x-axis labels
chart.DataLabels = []string{""}

rangeseconds := ct.chartrangesmap[ct.selectedchartrange]
if ct.selectedchartrange == "YTD" {
rangeseconds := ct.chartRangesMap[ct.State.selectedChartRange]
if ct.State.selectedChartRange == "YTD" {
ytd := time.Now().Unix() - int64(timeutil.BeginningOfYear().Unix())
rangeseconds = time.Duration(ytd) * time.Second
}
Expand All @@ -91,7 +91,7 @@ func (ct *Cointop) chartPoints(symbol string, name string) error {
if keyname == "" {
keyname = "globaldata"
}
cachekey := ct.cacheKey(fmt.Sprintf("%s_%s", keyname, strings.Replace(ct.selectedchartrange, " ", "", -1)))
cachekey := ct.cacheKey(fmt.Sprintf("%s_%s", keyname, strings.Replace(ct.State.selectedChartRange, " ", "", -1)))

cached, found := ct.cache.Get(cachekey)
if found {
Expand Down Expand Up @@ -155,15 +155,15 @@ func (ct *Cointop) chartPoints(symbol string, name string) error {
points = append(points, rowpoints)
}

ct.chartpoints = points
ct.State.chartPoints = points

return nil
}

func (ct *Cointop) portfolioChart() error {
maxX := ct.maxtablewidth - 3
chartpointslock.Lock()
defer chartpointslock.Unlock()
maxX := ct.maxTableWidth - 3
chartPointsLock.Lock()
defer chartPointsLock.Unlock()
// TODO: not do this (SoC)
go ct.updateMarketbar()

Expand All @@ -174,8 +174,8 @@ func (ct *Cointop) portfolioChart() error {
// NOTE: empty list means don't show x-axis labels
chart.DataLabels = []string{""}

rangeseconds := ct.chartrangesmap[ct.selectedchartrange]
if ct.selectedchartrange == "YTD" {
rangeseconds := ct.chartRangesMap[ct.State.selectedChartRange]
if ct.State.selectedChartRange == "YTD" {
ytd := time.Now().Unix() - int64(timeutil.BeginningOfYear().Unix())
rangeseconds = time.Duration(ytd) * time.Second
}
Expand All @@ -201,7 +201,7 @@ func (ct *Cointop) portfolioChart() error {
}

var graphData []float64
cachekey := strings.ToLower(fmt.Sprintf("%s_%s", p.Symbol, strings.Replace(ct.selectedchartrange, " ", "", -1)))
cachekey := strings.ToLower(fmt.Sprintf("%s_%s", p.Symbol, strings.Replace(ct.State.selectedChartRange, " ", "", -1)))
cached, found := ct.cache.Get(cachekey)
if found {
// cache hit
Expand Down Expand Up @@ -263,16 +263,16 @@ func (ct *Cointop) portfolioChart() error {
points = append(points, rowpoints)
}

ct.chartpoints = points
ct.State.chartPoints = points

return nil
}

func (ct *Cointop) nextChartRange() error {
sel := 0
max := len(ct.chartranges)
for i, k := range ct.chartranges {
if k == ct.selectedchartrange {
max := len(ct.chartRanges)
for i, k := range ct.chartRanges {
if k == ct.State.selectedChartRange {
sel = i + 1
break
}
Expand All @@ -281,65 +281,47 @@ func (ct *Cointop) nextChartRange() error {
sel = 0
}

ct.selectedchartrange = ct.chartranges[sel]
ct.State.selectedChartRange = ct.chartRanges[sel]

go ct.updateChart()
return nil
}

func (ct *Cointop) prevChartRange() error {
sel := 0
for i, k := range ct.chartranges {
if k == ct.selectedchartrange {
for i, k := range ct.chartRanges {
if k == ct.State.selectedChartRange {
sel = i - 1
break
}
}
if sel < 0 {
sel = len(ct.chartranges) - 1
sel = len(ct.chartRanges) - 1
}

ct.selectedchartrange = ct.chartranges[sel]
ct.State.selectedChartRange = ct.chartRanges[sel]
go ct.updateChart()
return nil
}

func (ct *Cointop) firstChartRange() error {
ct.selectedchartrange = ct.chartranges[0]
ct.State.selectedChartRange = ct.chartRanges[0]
go ct.updateChart()
return nil
}

func (ct *Cointop) lastChartRange() error {
ct.selectedchartrange = ct.chartranges[len(ct.chartranges)-1]
ct.State.selectedChartRange = ct.chartRanges[len(ct.chartRanges)-1]
go ct.updateChart()
return nil
}

func (ct *Cointop) selectedCoinName() string {
coin := ct.selectedcoin
if coin != nil {
return coin.Name
}

return ""
}

func (ct *Cointop) selectedCoinSymbol() string {
coin := ct.selectedcoin
if coin != nil {
return coin.Symbol
}

return ""
}

func (ct *Cointop) toggleCoinChart() error {
highlightedcoin := ct.highlightedRowCoin()
if ct.selectedcoin == highlightedcoin {
ct.selectedcoin = nil
if ct.State.selectedCoin == highlightedcoin {
ct.State.selectedCoin = nil
} else {
ct.selectedcoin = highlightedcoin
ct.State.selectedCoin = highlightedcoin
}

go ct.updateChart()
Expand Down
61 changes: 61 additions & 0 deletions cointop/coin.go
@@ -0,0 +1,61 @@
package cointop

// 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
LastUpdated string
// for favorites
Favorite bool
// for portfolio
Holdings float64
Balance float64
}

func (ct *Cointop) allCoins() []*Coin {
if ct.State.filterByFavorites {
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.State.portfolioVisible {
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
}

func (ct *Cointop) coinBySymbol(symbol string) *Coin {
for i := range ct.State.allCoins {
coin := ct.State.allCoins[i]
if coin.Symbol == symbol {
return coin
}
}

return nil
}

0 comments on commit 4ef4f7a

Please sign in to comment.