Fix pools dominance chart
This commit is contained in:
		
							parent
							
								
									520e79aec4
								
							
						
					
					
						commit
						bbb0aea0d1
					
				| @ -11,6 +11,13 @@ import { MiningService } from '../../services/mining.service'; | ||||
| import { download } from '../../shared/graphs.utils'; | ||||
| import { ActivatedRoute } from '@angular/router'; | ||||
| 
 | ||||
| interface Hashrate { | ||||
|   timestamp: number; | ||||
|   avgHashRate: number; | ||||
|   share: number; | ||||
|   poolName: string; | ||||
| } | ||||
| 
 | ||||
| @Component({ | ||||
|   selector: 'app-hashrate-chart-pools', | ||||
|   templateUrl: './hashrate-chart-pools.component.html', | ||||
| @ -32,6 +39,7 @@ export class HashrateChartPoolsComponent implements OnInit { | ||||
|   miningWindowPreference: string; | ||||
|   radioGroupForm: UntypedFormGroup; | ||||
| 
 | ||||
|   hashrates: Hashrate[]; | ||||
|   chartOptions: EChartsOption = {}; | ||||
|   chartInitOptions = { | ||||
|     renderer: 'svg', | ||||
| @ -87,56 +95,9 @@ export class HashrateChartPoolsComponent implements OnInit { | ||||
|           return this.apiService.getHistoricalPoolsHashrate$(timespan) | ||||
|             .pipe( | ||||
|               tap((response) => { | ||||
|                 const hashrates = response.body; | ||||
|                 this.hashrates = response.body; | ||||
|                 // Prepare series (group all hashrates data point by pool)
 | ||||
|                 const grouped = {}; | ||||
|                 for (const hashrate of hashrates) { | ||||
|                   if (!grouped.hasOwnProperty(hashrate.poolName)) { | ||||
|                     grouped[hashrate.poolName] = []; | ||||
|                   } | ||||
|                   grouped[hashrate.poolName].push(hashrate); | ||||
|                 } | ||||
| 
 | ||||
|                 const series = []; | ||||
|                 const legends = []; | ||||
|                 for (const name in grouped) { | ||||
|                   series.push({ | ||||
|                     zlevel: 0, | ||||
|                     stack: 'Total', | ||||
|                     name: name, | ||||
|                     showSymbol: false, | ||||
|                     symbol: 'none', | ||||
|                     data: grouped[name].map((val) => [val.timestamp * 1000, val.share * 100]), | ||||
|                     type: 'line', | ||||
|                     lineStyle: { width: 0 }, | ||||
|                     areaStyle: { opacity: 1 }, | ||||
|                     smooth: true, | ||||
|                     color: poolsColor[name.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()], | ||||
|                     emphasis: { | ||||
|                       disabled: true, | ||||
|                       scale: false, | ||||
|                     }, | ||||
|                   }); | ||||
| 
 | ||||
|                   legends.push({ | ||||
|                     name: name, | ||||
|                     inactiveColor: 'rgb(110, 112, 121)', | ||||
|                     textStyle: { | ||||
|                       color: 'white', | ||||
|                     }, | ||||
|                     icon: 'roundRect', | ||||
|                     itemStyle: { | ||||
|                       color: poolsColor[name.replace(/[^a-zA-Z0-9]/g, "").toLowerCase()], | ||||
|                     }, | ||||
|                   }); | ||||
|                 } | ||||
| 
 | ||||
|                 this.prepareChartOptions({ | ||||
|                   legends: legends, | ||||
|                   series: series, | ||||
|                 }); | ||||
|                 this.isLoading = false; | ||||
| 
 | ||||
|                 const series = this.applyHashrates(); | ||||
|                 if (series.length === 0) { | ||||
|                   this.cd.markForCheck(); | ||||
|                   throw new Error(); | ||||
| @ -156,6 +117,69 @@ export class HashrateChartPoolsComponent implements OnInit { | ||||
|       ); | ||||
|   } | ||||
| 
 | ||||
|   applyHashrates(): any[] { | ||||
|     const times: { [time: number]: { hashrates: { [pool: string]: Hashrate } } } = {}; | ||||
|     const pools = {}; | ||||
|     for (const hashrate of this.hashrates) { | ||||
|       if (!times[hashrate.timestamp]) { | ||||
|         times[hashrate.timestamp] = { hashrates: {} }; | ||||
|       } | ||||
|       times[hashrate.timestamp].hashrates[hashrate.poolName] = hashrate; | ||||
|       if (!pools[hashrate.poolName]) { | ||||
|         pools[hashrate.poolName] = 0; | ||||
|       } | ||||
|       pools[hashrate.poolName] += hashrate.share; | ||||
|     } | ||||
| 
 | ||||
|     const sortedTimes = Object.keys(times).sort((a,b) => parseInt(a) - parseInt(b)).map(time => ({ time: parseInt(time), hashrates: times[time].hashrates })); | ||||
|     const sortedPools = Object.keys(pools).sort((a,b) => pools[b] - pools[a]); | ||||
| 
 | ||||
|     const series = []; | ||||
|     const legends = []; | ||||
|     for (const name of sortedPools) { | ||||
|       const data = sortedTimes.map(({ time, hashrates }) => { | ||||
|         return [time * 1000, (hashrates[name]?.share || 0) * 100]; | ||||
|       }); | ||||
|       series.push({ | ||||
|         zlevel: 0, | ||||
|         stack: 'Total', | ||||
|         name: name, | ||||
|         showSymbol: false, | ||||
|         symbol: 'none', | ||||
|         data, | ||||
|         type: 'line', | ||||
|         lineStyle: { width: 0 }, | ||||
|         areaStyle: { opacity: 1 }, | ||||
|         smooth: true, | ||||
|         color: poolsColor[name.replace(/[^a-zA-Z0-9]/g, '').toLowerCase()], | ||||
|         emphasis: { | ||||
|           disabled: true, | ||||
|           scale: false, | ||||
|         }, | ||||
|       }); | ||||
| 
 | ||||
|       legends.push({ | ||||
|         name: name, | ||||
|         inactiveColor: 'rgb(110, 112, 121)', | ||||
|         textStyle: { | ||||
|           color: 'white', | ||||
|         }, | ||||
|         icon: 'roundRect', | ||||
|         itemStyle: { | ||||
|           color: poolsColor[name.replace(/[^a-zA-Z0-9]/g, "").toLowerCase()], | ||||
|         }, | ||||
|       }); | ||||
|     } | ||||
| 
 | ||||
|     this.prepareChartOptions({ | ||||
|       legends: legends, | ||||
|       series: series, | ||||
|     }); | ||||
|     this.isLoading = false; | ||||
| 
 | ||||
|     return series; | ||||
|   } | ||||
| 
 | ||||
|   prepareChartOptions(data) { | ||||
|     let title: object; | ||||
|     if (data.series.length === 0) { | ||||
| @ -256,6 +280,7 @@ export class HashrateChartPoolsComponent implements OnInit { | ||||
|         }, | ||||
|       }], | ||||
|     }; | ||||
|     this.cd.markForCheck(); | ||||
|   } | ||||
| 
 | ||||
|   onChartInit(ec) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user