From e5f907c9146b2f2675aa22792530b021a37e464f Mon Sep 17 00:00:00 2001 From: yuriy0803 <68668177+yuriy0803@users.noreply.github.com> Date: Sun, 14 Mar 2021 13:10:56 +0100 Subject: [PATCH] Current price --- api.json | 10 +++++- api/server.go | 5 +++ main.go | 11 ++++++- proxy/config.go | 12 ++++--- storage/redis.go | 52 +++++++++++++++++++++++++++--- www/app/controllers/application.js | 12 +++++++ www/app/templates/index.hbs | 1 + 7 files changed, 92 insertions(+), 11 deletions(-) diff --git a/api.json b/api.json index 816a81d..13fbb3e 100644 --- a/api.json +++ b/api.json @@ -2,8 +2,9 @@ "threads": 4, "coin": "etc", "name": "main", - "pplns": 9000, + "pplns": 9000, "network": "classic", + "coin-name":"etc", "proxy": { "enabled": true, @@ -86,6 +87,13 @@ "database": 0, "password": "" }, + + "exchange": { + "enabled": true, + "url": "https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=ethereum-classic", + "timeout": "50s", + "refreshInterval": "900s" + }, "unlocker": { "enabled": true, diff --git a/api/server.go b/api/server.go index 280725b..8b88e86 100644 --- a/api/server.go +++ b/api/server.go @@ -257,6 +257,7 @@ func (s *ApiServer) StatsIndex(w http.ResponseWriter, r *http.Request) { reply["maturedTotal"] = stats["maturedTotal"] reply["immatureTotal"] = stats["immatureTotal"] reply["candidatesTotal"] = stats["candidatesTotal"] + reply["exchangedata"] = stats["exchangedata"] } err = json.NewEncoder(w).Encode(reply) @@ -322,6 +323,7 @@ func (s *ApiServer) PaymentsIndex(w http.ResponseWriter, r *http.Request) { if stats != nil { reply["payments"] = stats["payments"] reply["paymentsTotal"] = stats["paymentsTotal"] + reply["exchangedata"] = stats["exchangedata"] } err := json.NewEncoder(w).Encode(reply) @@ -339,6 +341,8 @@ func (s *ApiServer) AccountIndex(w http.ResponseWriter, r *http.Request) { s.minersMu.Lock() defer s.minersMu.Unlock() + generalstats := s.getStats() + reply, ok := s.miners[login] now := util.MakeTimestamp() cacheIntv := int64(s.statsIntv / time.Millisecond) @@ -371,6 +375,7 @@ func (s *ApiServer) AccountIndex(w http.ResponseWriter, r *http.Request) { stats[key] = value } stats["pageSize"] = s.config.Payments + stats["exchangedata"] = generalstats["exchangedata"] stats["minerCharts"], err = s.backend.GetMinerCharts(s.config.MinerChartsNum, login) stats["paymentCharts"], err = s.backend.GetPaymentCharts(login) reply = &Entry{stats: stats, updatedAt: now} diff --git a/main.go b/main.go index f60ab57..043a4da 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( "github.com/yvasiyarov/gorelic" "github.com/yuriy0803/open-etc-pool-friends/api" + "github.com/yuriy0803/open-etc-pool-friends/exchange" "github.com/yuriy0803/open-etc-pool-friends/payouts" "github.com/yuriy0803/open-etc-pool-friends/proxy" "github.com/yuriy0803/open-etc-pool-friends/storage" @@ -42,6 +43,11 @@ func startPayoutsProcessor() { u.Start() } +func startExchangeProcessor() { + u := exchange.StartExchangeProcessor(&cfg.Exchange, backend) + u.Start() +} + func startNewrelic() { if cfg.NewrelicEnabled { nr := gorelic.NewAgent() @@ -82,7 +88,7 @@ func main() { startNewrelic() - backend = storage.NewRedisClient(&cfg.Redis, cfg.Coin, cfg.Pplns) + backend = storage.NewRedisClient(&cfg.Redis, cfg.Coin, cfg.Pplns, cfg.CoinName) pong, err := backend.Check() if err != nil { log.Printf("Can't establish connection to backend: %v", err) @@ -102,6 +108,9 @@ func main() { if cfg.Payouts.Enabled { go startPayoutsProcessor() } + if cfg.Exchange.Enabled { + go startExchangeProcessor() + } quit := make(chan bool) <-quit } diff --git a/proxy/config.go b/proxy/config.go index c4701ce..4f03a41 100644 --- a/proxy/config.go +++ b/proxy/config.go @@ -2,6 +2,7 @@ package proxy import ( "github.com/yuriy0803/open-etc-pool-friends/api" + "github.com/yuriy0803/open-etc-pool-friends/exchange" "github.com/yuriy0803/open-etc-pool-friends/payouts" "github.com/yuriy0803/open-etc-pool-friends/policy" "github.com/yuriy0803/open-etc-pool-friends/storage" @@ -16,14 +17,17 @@ type Config struct { Threads int `json:"threads"` - Network string `json:"network"` - Coin string `json:"coin"` - Pplns int64 `json:"pplns"` - Redis storage.Config `json:"redis"` + Network string `json:"network"` + Coin string `json:"coin"` + Pplns int64 `json:"pplns"` + Redis storage.Config `json:"redis"` + CoinName string `json:"coin-name"` BlockUnlocker payouts.UnlockerConfig `json:"unlocker"` Payouts payouts.PayoutsConfig `json:"payouts"` + Exchange exchange.ExchangeConfig `json:"exchange"` + NewrelicName string `json:"newrelicName"` NewrelicKey string `json:"newrelicKey"` NewrelicVerbose bool `json:"newrelicVerbose"` diff --git a/storage/redis.go b/storage/redis.go index 86c87db..03fdb4e 100644 --- a/storage/redis.go +++ b/storage/redis.go @@ -2,6 +2,7 @@ package storage import ( "fmt" + "log" "math" "math/big" "sort" @@ -22,9 +23,10 @@ type Config struct { } type RedisClient struct { - client *redis.Client - prefix string - pplns int64 + client *redis.Client + prefix string + pplns int64 + CoinName string } type PoolCharts struct { @@ -137,14 +139,14 @@ type Worker struct { WorkerStatushas int64 `json:"w_stat_s"` } -func NewRedisClient(cfg *Config, prefix string, pplns int64) *RedisClient { +func NewRedisClient(cfg *Config, prefix string, pplns int64, CoinName string) *RedisClient { client := redis.NewClient(&redis.Options{ Addr: cfg.Endpoint, Password: cfg.Password, DB: cfg.Database, PoolSize: cfg.PoolSize, }) - return &RedisClient{client: client, prefix: prefix, pplns: pplns} + return &RedisClient{client: client, prefix: prefix, pplns: pplns, CoinName: CoinName} } func (r *RedisClient) Client() *redis.Client { @@ -949,6 +951,7 @@ func (r *RedisClient) CollectStats(smallWindow time.Duration, maxBlocks, maxPaym tx.ZRevRangeWithScores(r.formatKey("payments", "all"), 0, maxPayments-1) tx.LLen(r.formatKey("lastshares")) tx.ZRevRangeWithScores(r.formatKey("finders"), 0, -1) + tx.HGetAllMap(r.formatKey("exchange", r.CoinName)) return nil }) @@ -982,6 +985,10 @@ func (r *RedisClient) CollectStats(smallWindow time.Duration, maxBlocks, maxPaym stats["miners"] = miners stats["minersTotal"] = len(miners) stats["hashrate"] = totalHashrate + + exchangedata, _ := cmds[13].(*redis.StringStringMapCmd).Result() + stats["exchangedata"] = exchangedata + return stats, nil } @@ -1583,3 +1590,38 @@ func (r *RedisClient) NumberStratumWorker(count int) { return nil }) } + +func (r *RedisClient) StoreExchangeData(ExchangeData []map[string]interface{}) { + + tx := r.client.Multi() + defer tx.Close() + + log.Printf("ExchangeData: %s", ExchangeData) + + for _, coindata := range ExchangeData { + for key, value := range coindata { + + cmd := tx.HSet(r.formatKey("exchange", coindata["symbol"]), fmt.Sprintf("%v", key), fmt.Sprintf("%v", value)) + err := cmd.Err() + if err != nil { + log.Printf("Error while Storing %s : Key-%s , value-%s , Error : %v", coindata["symbol"], key, value, err) + } + + } + } + log.Printf("Writing Exchange Data ") + return +} + +func (r *RedisClient) GetExchangeData(coinsymbol string) (map[string]string, error) { + + cmd := r.client.HGetAllMap(r.formatKey("exchange", coinsymbol)) + + result, err := cmd.Result() + + if err != nil { + return nil, err + } + + return result, err +} diff --git a/www/app/controllers/application.js b/www/app/controllers/application.js index f001c30..f48c4e9 100644 --- a/www/app/controllers/application.js +++ b/www/app/controllers/application.js @@ -32,6 +32,18 @@ export default Ember.Controller.extend({ } }), + ethinr: Ember.computed('stats', { + get() { + return parseFloat(this.get('model.exchangedata.price_inr')); + } + }), + + ethusd: Ember.computed('stats', { + get() { + return parseFloat(this.get('model.exchangedata.current_price')); + } + }), + hashrate: Ember.computed('difficulty', { get() { return this.getWithDefault('difficulty', 0) / config.APP.BlockTime; diff --git a/www/app/templates/index.hbs b/www/app/templates/index.hbs index f39bc28..9d71c73 100644 --- a/www/app/templates/index.hbs +++ b/www/app/templates/index.hbs @@ -28,6 +28,7 @@
Network Hash Rate: {{format-hashrate stats.hashrate}}
Blockchain Height: {{format-number stats.height}}
Current Round Variance: {{format-number stats.roundVariance style='percent'}}
+
Current price: $ {{model.exchangedata.current_price}}