Browse Source

Block finders

master
yuriy0803 5 years ago
parent
commit
c96ef0346c
  1. 20
      api/server.go
  2. 15
      storage/redis.go
  3. 1
      www/app/router.js
  4. 17
      www/app/routes/finders.js
  5. 42
      www/app/styles/app.css
  6. 5
      www/app/templates/application.hbs
  7. 28
      www/app/templates/finders.hbs

20
api/server.go

@ -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", "*")

15
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"`

1
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');
});

17
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);
}
});

42
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;
}

5
www/app/templates/application.hbs

@ -36,6 +36,11 @@
<i class="fa fa-users"></i> Miners
{{/link-to}}
{{/active-li}}
{{#active-li currentWhen='finders'}}
{{#link-to 'finders'}}
<i class="fa fa-diamond"></i> Finders
{{/link-to}}
{{/active-li}}
{{#active-li currentWhen='help' }}
{{#link-to 'help'}}
<i class="fa fa-rocket"></i> Help

28
www/app/templates/finders.hbs

@ -0,0 +1,28 @@
<div class="jumbotron">
<div class="container">
<strong>Miners on the list:</strong> <span class="label label-info">{{model.findersTotal}}</span>
</div>
</div>
<div class="container">
{{#if model.finders}}
<h4>Block finders</h4>
<table class="table table-condensed table-striped">
<thead>
<tr>
<th>Miner</th>
<th>Blocks</th>
</tr>
</thead>
<tbody>
{{#each model.finders as |f|}}
<tr>
<td>{{#link-to 'account' f.address class='hash'}}{{f.address}}{{/link-to}}</td>
<td>{{format-number f.blocks}}</td>
</tr>
{{/each}}
</tbody>
</table>
{{else}}
<h3>No blocks yet</h3>
{{/if}}
</div>
Loading…
Cancel
Save