diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2018-05-22 14:07:25 +0200 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2018-12-13 16:59:39 +0100 |
| commit | 6382ed01e9db8f975b72c9c2c8db4013cd0156c2 (patch) | |
| tree | 0007030148e27fe9152ccb28a91c3497d62b27d8 /backend | |
| parent | 60186a7bb45a0063f605f8d4b05c2f08418733af (diff) | |
| download | brokentalents-6382ed01e9db8f975b72c9c2c8db4013cd0156c2.tar.gz brokentalents-6382ed01e9db8f975b72c9c2c8db4013cd0156c2.zip | |
Add metadata file to data
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/config-brawl.js | 60 | ||||
| -rw-r--r-- | backend/config.js | 1 | ||||
| -rw-r--r-- | backend/index.js | 12 |
3 files changed, 72 insertions, 1 deletions
diff --git a/backend/config-brawl.js b/backend/config-brawl.js new file mode 100644 index 0000000..dc13956 --- /dev/null +++ b/backend/config-brawl.js @@ -0,0 +1,60 @@ +#!/usr/bin/node + +const crypto = require('crypto'); + +const sha256 = (x) => crypto.createHash('sha256').update(x, 'utf8').digest('hex'); + +const hashSettings = (config) => sha256( + config.api.regions + + config.api.modes + + config.api.requestsPerInterval + + config.api.interval + + config.api.intervalUnit +).substring(0, 8); + +module.exports = { + api: { + baseUrl: 'https://api.dc01.gamelockerapp.com', + timeout: 3, + /* available: eu, na, sg, cn, sa, ea */ + regions: ['sg', 'eu', 'na'], + /* available: casual, 5v5_pvp_casual, ranked, 5v5_pvp_ranked, blitz_pvp_ranked, casual_aral */ + modes: ['blitz_pvp_ranked', 'casual_aral'], + /* available: 2, 3, 4, 5 */ + matchesPerRequest: 5, + /* How many equidistant requests to create + * matchesPerRequest * requestsPerInterval = sample size for that interval + * currently requestsPerInterval <= API key rate limit but should work if it isn't significantly higher + * rough estimate of upper limits (na/eu/sg, depends on region and time of day): + * blitz: 240 + * battle royale: 30 + * 3v3 casual: 30 + * 3v3 ranked: 100 + * 5v5 casual: 30 + * 5v5 ranked: 40 + * if filtering for multiple game modes, use the sum of the upper limits */ + requestsPerInterval: 50, + /* the size of a batch */ + interval: 1, + intervalUnit: 'hours', + /* How many batches to request per minute + * requestsPerInterval * intervalsPer Minute <= API key rate limit */ + intervalsPerMinute: 1, + }, + etl: { + /* attributes to be extracted and renamed from main API data */ + participant: [ ['Winner', ['attributes', 'stats', 'winner']] ], + roster: [ ], + match: [ ['Mode', ['attributes', 'gameMode']] ], + }, + reduce: { + /* criteria or 'filters' */ + group: ['Actor', 'Talent', 'Mode'], + /* stats */ + sum: ['Level', 'Winner'], + }, + file: { + pattern: (moment) => `./data/${hashSettings(module.exports)}/${moment.toISOString()}.json`, + reportPattern: () => `./data/${hashSettings(module.exports)}/report.json`, + }, +}; diff --git a/backend/config.js b/backend/config.js index eaed3f7..86deed6 100644 --- a/backend/config.js +++ b/backend/config.js @@ -56,5 +56,6 @@ module.exports = { file: { pattern: (moment) => `./data/${hashSettings(module.exports)}/${moment.toISOString()}.json`, reportPattern: () => `./data/${hashSettings(module.exports)}/report.json`, + metadataPattern: () => `./data/${hashSettings(module.exports)}/metadata.json`, }, }; diff --git a/backend/index.js b/backend/index.js index c8be64e..8480f28 100644 --- a/backend/index.js +++ b/backend/index.js @@ -3,6 +3,7 @@ const R = require('ramda'), Future = require('fluture'), moment = require('moment'), + fsPath = require('fs-path'), reduce = require('./reduce'), source = require('./source'), file = require('./file'), @@ -23,11 +24,20 @@ function main() { const hours = R.range(0, Math.floor(duration.asHours())); const laterMoments = R.map(later(start), hours); + const metadata = { + lastUpdate: moment().toISOString(), + config, + }; + const saveMetadata = (path, data) => + Future.node((cb) => fsPath.writeFile(path, JSON.stringify(data), cb)) + .map(() => data); + const futures = R.map(loadFTimestamped, laterMoments); Future.parallel(1, futures) .map(R.compose(deriveStatistics, aggregatePayloads, cleanPayloads, R.unnest)) .chain(saveFPayloads(config.file.reportPattern())) - .fork(console.error, (d) => console.log(JSON.stringify(d, null, 2))); + .chain((data) => saveMetadata(config.file.metadataPattern(), metadata)) + .fork(console.error, (d) => {}); } main(); |
