From c96ef0346c86b486021ee50bc786fece943fe7e1 Mon Sep 17 00:00:00 2001 From: yuriy0803 <68668177+yuriy0803@users.noreply.github.com> Date: Mon, 1 Mar 2021 22:36:45 +0100 Subject: [PATCH] Block finders --- api/server.go | 32 ++++++++++++++++++----- storage/redis.go | 15 +++++++++++ www/app/router.js | 1 + www/app/routes/finders.js | 17 +++++++++++++ www/app/styles/app.css | 42 ------------------------------- www/app/templates/application.hbs | 5 ++++ www/app/templates/finders.hbs | 28 +++++++++++++++++++++ 7 files changed, 92 insertions(+), 48 deletions(-) create mode 100644 www/app/routes/finders.js create mode 100644 www/app/templates/finders.hbs diff --git a/api/server.go b/api/server.go index 3b0ad92..06ec0f8 100644 --- a/api/server.go +++ b/api/server.go @@ -2,7 +2,7 @@ package api import ( "encoding/json" - "fmt" + "fmt" "log" "net/http" "sort" @@ -12,7 +12,7 @@ import ( "time" "github.com/gorilla/mux" - "github.com/robfig/cron" + "github.com/robfig/cron" "github.com/yuriy0803/open-etc-pool-friends/storage" "github.com/yuriy0803/open-etc-pool-friends/util" @@ -101,7 +101,7 @@ func (s *ApiServer) Start() { } } }() - + go func() { c := cron.New() @@ -165,6 +165,7 @@ func (s *ApiServer) collectMinerCharts(login string, hash int64, largeHash int64 func (s *ApiServer) listen() { r := mux.NewRouter() + r.HandleFunc("/api/finders", s.FindersIndex) r.HandleFunc("/api/stats", s.StatsIndex) r.HandleFunc("/api/miners", s.MinersIndex) r.HandleFunc("/api/blocks", s.BlocksIndex) @@ -213,6 +214,25 @@ func (s *ApiServer) collectStats() { log.Printf("Stats collection finished %s", time.Since(start)) } +func (s *ApiServer) FindersIndex(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Cache-Control", "no-cache") + w.WriteHeader(http.StatusOK) + + reply := make(map[string]interface{}) + stats := s.getStats() + if stats != nil { + reply["now"] = util.MakeTimestamp() + reply["finders"] = stats["finders"] + } + + err := json.NewEncoder(w).Encode(reply) + if err != nil { + log.Println("Error serializing API response: ", err) + } +} + func (s *ApiServer) StatsIndex(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.Header().Set("Access-Control-Allow-Origin", "*") @@ -230,7 +250,7 @@ func (s *ApiServer) StatsIndex(w http.ResponseWriter, r *http.Request) { if stats != nil { reply["now"] = util.MakeTimestamp() reply["stats"] = stats["stats"] - reply["poolCharts"] = stats["poolCharts"] + reply["poolCharts"] = stats["poolCharts"] reply["hashrate"] = stats["hashrate"] reply["minersTotal"] = stats["minersTotal"] reply["maturedTotal"] = stats["maturedTotal"] @@ -349,8 +369,8 @@ func (s *ApiServer) AccountIndex(w http.ResponseWriter, r *http.Request) { stats[key] = value } stats["pageSize"] = s.config.Payments - stats["minerCharts"], err = s.backend.GetMinerCharts(s.config.MinerChartsNum, login) - stats["paymentCharts"], err = s.backend.GetPaymentCharts(login) + stats["minerCharts"], err = s.backend.GetMinerCharts(s.config.MinerChartsNum, login) + stats["paymentCharts"], err = s.backend.GetPaymentCharts(login) reply = &Entry{stats: stats, updatedAt: now} s.miners[login] = reply } diff --git a/storage/redis.go b/storage/redis.go index 3605a67..7186bb3 100644 --- a/storage/redis.go +++ b/storage/redis.go @@ -923,6 +923,7 @@ func (r *RedisClient) CollectStats(smallWindow time.Duration, maxBlocks, maxPaym tx.HGet(r.formatKey("paymentsTotal"), "all") tx.ZRevRangeWithScores(r.formatKey("payments", "all"), 0, maxPayments-1) tx.LLen(r.formatKey("lastshares")) + tx.ZRevRangeWithScores(r.formatKey("finders"), 0, -1) return nil }) @@ -949,6 +950,9 @@ func (r *RedisClient) CollectStats(smallWindow time.Duration, maxBlocks, maxPaym stats["payments"] = payments stats["paymentsTotal"], _ = cmds[9].(*redis.StringCmd).Int64() + finders := convertFindersResults(cmds[12].(*redis.ZSliceCmd)) + stats["finders"] = finders + totalHashrate, miners := convertMinersStats(window, cmds[1].(*redis.ZSliceCmd)) stats["miners"] = miners stats["minersTotal"] = len(miners) @@ -1264,6 +1268,17 @@ func convertPaymentsResults(raw *redis.ZSliceCmd) []map[string]interface{} { return result } +func convertFindersResults(raw *redis.ZSliceCmd) []map[string]interface{} { + var result []map[string]interface{} + for _, v := range raw.Val() { + miner := make(map[string]interface{}) + miner["blocks"] = int64(v.Score) + miner["address"] = v.Member.(string) + result = append(result, miner) + } + return result +} + /* Timestamp int64 `json:"x"` TimeFormat string `json:"timeFormat"` diff --git a/www/app/router.js b/www/app/router.js index 1da5c8d..ec24c28 100644 --- a/www/app/router.js +++ b/www/app/router.js @@ -20,6 +20,7 @@ Router.map(function() { this.route('help'); this.route('payments'); this.route('miners'); + this.route('finders'); this.route('about'); this.route('chart'); }); diff --git a/www/app/routes/finders.js b/www/app/routes/finders.js new file mode 100644 index 0000000..51c076e --- /dev/null +++ b/www/app/routes/finders.js @@ -0,0 +1,17 @@ +import Ember from 'ember'; +import config from '../config/environment'; + +export default Ember.Route.extend({ + model: function() { + var url = config.APP.ApiUrl + 'api/finders'; + return Ember.$.getJSON(url).then(function(data) { + data.findersTotal = data.finders.length; + return data; + }); + }, + + setupController: function(controller, model) { + this._super(controller, model); + Ember.run.later(this, this.refresh, 5000); + } +}); \ No newline at end of file diff --git a/www/app/styles/app.css b/www/app/styles/app.css index effff3e..a42ed45 100644 --- a/www/app/styles/app.css +++ b/www/app/styles/app.css @@ -34,48 +34,6 @@ body { body > .container { padding: 0px 15px 0; } - -/* doesn't work -------- */ -#coin_calculator iframe form{ - border:none !important; - border-radius: 0px !important; - background-color: transparent !important; -} - -/* Menu CSS Stuff */ - -.navbar-fixed-bottom .navbar-collapse, .navbar-fixed-top .navbar-collapse { - max-height: unset; -} - -.navbar-collapse.in{ - overflow: visible; -} - - - -h1 { - font-size: 36px; - line-height: 42px; -} - -h2 { - font-size: 24px; - line-height: 32px; -} - -h1, h2, h3, h4, h5, h6 { - color: #fff; - margin: 0px 0px 15px 0px; - font-weight: 400; - font-family: 'Poppins', sans-serif; -} - -.modal-title{ - color:#333; -} - - .container .text-muted { margin: 20px 0; } diff --git a/www/app/templates/application.hbs b/www/app/templates/application.hbs index f1e2b6b..e49501c 100644 --- a/www/app/templates/application.hbs +++ b/www/app/templates/application.hbs @@ -36,6 +36,11 @@ Miners {{/link-to}} {{/active-li}} + {{#active-li currentWhen='finders'}} + {{#link-to 'finders'}} + Finders + {{/link-to}} + {{/active-li}} {{#active-li currentWhen='help' }} {{#link-to 'help'}} Help diff --git a/www/app/templates/finders.hbs b/www/app/templates/finders.hbs new file mode 100644 index 0000000..dd263d3 --- /dev/null +++ b/www/app/templates/finders.hbs @@ -0,0 +1,28 @@ +
+
+ Miners on the list: {{model.findersTotal}} +
+
+
+ {{#if model.finders}} +

Block finders

+ + + + + + + + + {{#each model.finders as |f|}} + + + + + {{/each}} + +
MinerBlocks
{{#link-to 'account' f.address class='hash'}}{{f.address}}{{/link-to}}{{format-number f.blocks}}
+ {{else}} +

No blocks yet

+ {{/if}} +
\ No newline at end of file