1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
import * as maps from './maps/maps';
import * as metadata from '../data/95fb1cdb/metadata.json';
const POPULAR_THRESHOLD = 1.0; // percent
const report = require('../data/95fb1cdb/report.json')
.filter((entry) => entry.Actor != undefined); // bad data from API downtime
const reports = new Map();
const totalPicks = new Map();
const top10Relevancy = new Map();
const topPicks = new Map();
const topWins = new Map();
const topRareWins = new Map();
const topEpicWins = new Map();
const topLegendaryWins = new Map();
const topLeveledUp = new Map();
const topLeveledDown = new Map();
const topUnpopularWins = new Map();
let totalMatches = 0;
let actors = [];
const modes = metadata.config.api.modes;
for(let mode of modes) {
const relevancy = (entry) => (entry.Count / totalPicks.get(mode)) * entry.Winner;
const playersPerMatch = maps.playersPerMatch(mode);
reports.set(mode, report.filter((entry) => entry.Mode == mode));
totalPicks.set(mode, report.map((entry) => entry.Count).reduce((agg, cur) => agg + cur, 0));
totalMatches += totalPicks.get(mode) / maps.playersPerMatch(mode);
top10Relevancy.set(mode, reports.get(mode)
.sort((entry1, entry2) => relevancy(entry2) - relevancy(entry1))
.slice(0, 10));
topPicks.set(mode, reports.get(mode).sort((entry1, entry2) => entry2.Count - entry1.Count)[0]);
topWins.set(mode, reports.get(mode)
.filter((entry) => 100 * playersPerMatch * entry.Count / totalPicks.get(mode) > POPULAR_THRESHOLD)
.sort((entry1, entry2) => entry2.Winner - entry1.Winner)[0]);
topUnpopularWins.set(mode, reports.get(mode)
.filter((entry) => 100 * playersPerMatch * entry.Count / totalPicks.get(mode) <= POPULAR_THRESHOLD)
.sort((entry1, entry2) => entry2.Winner - entry1.Winner)[0]);
topRareWins.set(mode, reports.get(mode)
.filter((entry) => maps.getTalentRarity(entry.Talent) == 'Rare' && 100 * playersPerMatch * entry.Count / totalPicks.get(mode))
.sort((entry1, entry2) => entry2.Winner - entry1.Winner)[0]);
topEpicWins.set(mode, reports.get(mode)
.filter((entry) => maps.getTalentRarity(entry.Talent) == 'Epic' && 100 * playersPerMatch * entry.Count / totalPicks.get(mode))
.sort((entry1, entry2) => entry2.Winner - entry1.Winner)[0]);
topLegendaryWins.set(mode, reports.get(mode)
.filter((entry) => maps.getTalentRarity(entry.Talent) == 'Legendary' && 100 * playersPerMatch * entry.Count / totalPicks.get(mode))
.sort((entry1, entry2) => entry2.Winner - entry1.Winner)[0]);
topLeveledUp.set(mode, reports.get(mode).sort((entry1, entry2) => {
if (!entry1.Level) return 1;
if (!entry2.Level) return -1;
return entry1.Level < entry2.Level ? 1 : -1;
})[0]);
topLeveledDown.set(mode, reports.get(mode).sort((entry1, entry2) => {
if (!entry1.Level) return 1;
if (!entry2.Level) return -1;
return entry1.Level < entry2.Level ? -1 : 1;
})[0]);
if (actors.length == 0) {
actors = [...new Set(reports.get(mode).map((entry) => entry.Actor))];
}
}
export default {
getReport(mode) {
return reports.get(mode);
},
getTotalPicks(mode) {
return totalPicks.get(mode);
},
getTopPick(mode) {
return topPicks.get(mode);
},
getTop10Picks(mode) {
return top10Relevancy.get(mode);
},
getHighestLevelAvg(mode) {
return topLeveledUp.get(mode);
},
getLowestLevelAvg(mode) {
return topLeveledDown.get(mode);
},
getTopWin(mode) {
return topWins.get(mode);
},
getTopUnpopularWin(mode) {
return topUnpopularWins.get(mode);
},
getTopRareWins(mode) {
return topRareWins.get(mode);
},
getTopEpicWins(mode) {
return topEpicWins.get(mode);
},
getTopLegendaryWins(mode) {
return topLegendaryWins.get(mode);
},
getBestUnpopular(mode) {
return topUnpopular.get(mode);
},
getActors() {
return actors;
},
getModes() {
return modes;
},
getTotalMatches() {
return totalMatches;
},
getLastUpdate() {
return metadata.lastUpdate;
},
};
|