@firestone-hs/bgs-global-stats 1.0.49 → 1.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/duos/hourly/rows.js +1 -1
- package/dist/duos/hourly/rows.js.map +1 -1
- package/dist/internal-model.d.ts +2 -3
- package/dist/internal-model.js.map +1 -1
- package/dist/model-cards.d.ts +8 -18
- package/dist/model-cards.js.map +1 -1
- package/dist/solo/aggregate-daily/cards/_build-aggregated-stats.js +2 -1
- package/dist/solo/aggregate-daily/cards/_build-aggregated-stats.js.map +1 -1
- package/dist/solo/aggregate-daily/cards/s3-saver.d.ts +1 -1
- package/dist/solo/aggregate-daily/cards/s3-saver.js +7 -3
- package/dist/solo/aggregate-daily/cards/s3-saver.js.map +1 -1
- package/dist/solo/aggregate-daily/cards/stats-builder.js +30 -32
- package/dist/solo/aggregate-daily/cards/stats-builder.js.map +1 -1
- package/dist/solo/aggregate-hourly/config.d.ts +1 -0
- package/dist/solo/aggregate-hourly/config.js +2 -1
- package/dist/solo/aggregate-hourly/config.js.map +1 -1
- package/dist/solo/final-stats/cards/_build-aggregated-stats.js +54 -33
- package/dist/solo/final-stats/cards/_build-aggregated-stats.js.map +1 -1
- package/dist/solo/final-stats/cards/s3-saver.d.ts +2 -2
- package/dist/solo/final-stats/cards/s3-saver.js +13 -4
- package/dist/solo/final-stats/cards/s3-saver.js.map +1 -1
- package/dist/solo/final-stats/cards/stats-builder.js +39 -70
- package/dist/solo/final-stats/cards/stats-builder.js.map +1 -1
- package/dist/solo/hourly/_build-battlegrounds-hero-stats.js +1 -1
- package/dist/solo/hourly/_build-battlegrounds-hero-stats.js.map +1 -1
- package/dist/solo/hourly/cards/card-stats-builder.js +15 -13
- package/dist/solo/hourly/cards/card-stats-builder.js.map +1 -1
- package/dist/solo/hourly/cards/card-stats.js +4 -0
- package/dist/solo/hourly/cards/card-stats.js.map +1 -1
- package/dist/solo/hourly/rows.js +1 -1
- package/dist/solo/hourly/rows.js.map +1 -1
- package/package.json +1 -1
package/dist/duos/hourly/rows.js
CHANGED
|
@@ -52,7 +52,7 @@ const readRowsFromS3 = async (startDate) => {
|
|
|
52
52
|
.on('end', () => {
|
|
53
53
|
const finalResult = result.filter((row) => !!row);
|
|
54
54
|
console.log('stream end', result.length, finalResult.length);
|
|
55
|
-
console.log('parsing
|
|
55
|
+
console.log('parsing', parseErrors, '/', totalParsed);
|
|
56
56
|
resolve(finalResult);
|
|
57
57
|
});
|
|
58
58
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rows.js","sourceRoot":"","sources":["../../../src/duos/hourly/rows.ts"],"names":[],"mappings":"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","sourcesContent":["import { S3Multipart } from '@firestone-hs/aws-lambda-utils';\r\nimport { AllCardsService, CardIds } from '@firestone-hs/reference-data';\r\nimport { S3 as S3AWS } from 'aws-sdk';\r\nimport SecretsManager, { GetSecretValueRequest, GetSecretValueResponse } from 'aws-sdk/clients/secretsmanager';\r\nimport { Connection, createPool } from 'mysql';\r\nimport { Readable } from 'stream';\r\nimport { normalizeHeroCardId } from '../../common/util-functions';\r\nimport { InternalBgsRow } from '../../internal-model';\r\nimport { STATS_BUCKET, WORKING_ROWS_FILE, s3 } from './_build-battlegrounds-hero-stats';\r\n\r\nexport const readRowsFromS3 = async (startDate: string): Promise<readonly InternalBgsRow[]> => {\r\n\treturn new Promise<readonly InternalBgsRow[]>((resolve, reject) => {\r\n\t\tconst workingRowsFile = `${WORKING_ROWS_FILE.replace('%time%', startDate)}`;\r\n\t\tconsole.debug('reading rows from s3', workingRowsFile);\r\n\t\tlet parseErrors = 0;\r\n\t\tlet totalParsed = 0;\r\n\t\tconst stream: Readable = s3.readStream(STATS_BUCKET, workingRowsFile);\r\n\t\tconst result: InternalBgsRow[] = [];\r\n\t\tlet previousString = '';\r\n\t\tlet emptyRowsInARow = 0;\r\n\t\tstream\r\n\t\t\t.on('data', (chunk) => {\r\n\t\t\t\tconst str = Buffer.from(chunk).toString('utf-8');\r\n\t\t\t\tconst newStr = previousString + str;\r\n\t\t\t\tconst split = newStr.split('\\n');\r\n\t\t\t\tconst rows: readonly InternalBgsRow[] = split.slice(0, split.length - 1).map((row) => {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tconst result: InternalBgsRow = JSON.parse(row);\r\n\t\t\t\t\t\ttotalParsed++;\r\n\t\t\t\t\t\treturn result;\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t// logger.warn('could not parse row', row);\r\n\t\t\t\t\t\tparseErrors++;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tpreviousString = split[split.length - 1];\r\n\t\t\t\tresult.push(...rows);\r\n\r\n\t\t\t\t// Do this to avoid errors in case the chunks are small compared to the row sizes\r\n\t\t\t\tif (result.length === 0 && rows.length === 0) {\r\n\t\t\t\t\temptyRowsInARow++;\r\n\t\t\t\t} else {\r\n\t\t\t\t\temptyRowsInARow = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (emptyRowsInARow > 50) {\r\n\t\t\t\t\tconsole.error(newStr);\r\n\t\t\t\t\tconsole.error(split);\r\n\t\t\t\t\tthrow new Error('Could not parse any row');\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.on('end', () => {\r\n\t\t\t\tconst finalResult = result.filter((row) => !!row);\r\n\t\t\t\tconsole.log('stream end', result.length, finalResult.length);\r\n\t\t\t\tconsole.log('parsing errors', parseErrors, 'and successes', totalParsed);\r\n\t\t\t\tresolve(finalResult);\r\n\t\t\t});\r\n\t});\r\n};\r\n\r\nexport const saveRowsOnS3 = async (startDate: Date, endDate: Date, allCards: AllCardsService) => {\r\n\tconsole.log('will export rows to S3', startDate, endDate);\r\n\tconst secretRequest: GetSecretValueRequest = {\r\n\t\tSecretId: 'rds-connection',\r\n\t};\r\n\tconst secret: SecretInfo = await getSecret(secretRequest);\r\n\tconst pool = createPool({\r\n\t\tconnectionLimit: 1,\r\n\t\thost: secret.hostReadOnly,\r\n\t\tuser: secret.username,\r\n\t\tpassword: secret.password,\r\n\t\tdatabase: 'replay_summary',\r\n\t\tport: secret.port,\r\n\t});\r\n\r\n\ttry {\r\n\t\tawait performRowProcessIngPool(pool, startDate, endDate, allCards);\r\n\t} finally {\r\n\t\tpool.end((err) => {\r\n\t\t\tconsole.log('ending pool', err);\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst performRowProcessIngPool = async (pool: any, startDate: Date, endDate: Date, allCards: AllCardsService) => {\r\n\treturn new Promise<void>((resolve) => {\r\n\t\tpool.getConnection(async (err, connection) => {\r\n\t\t\tif (err) {\r\n\t\t\t\tconsole.log('error with connection', err);\r\n\t\t\t\tthrow new Error('Could not connect to DB');\r\n\t\t\t} else {\r\n\t\t\t\tawait performRowsProcessing(connection, startDate, endDate, allCards);\r\n\t\t\t\tconnection.release();\r\n\t\t\t}\r\n\t\t\tresolve();\r\n\t\t});\r\n\t});\r\n};\r\n\r\nconst performRowsProcessing = async (\r\n\tconnection: Connection,\r\n\tstartDate: Date,\r\n\tendDate: Date,\r\n\tallCards: AllCardsService,\r\n) => {\r\n\tconst multipartUpload = new S3Multipart(new S3AWS());\r\n\tconst workingRowsFile = `${WORKING_ROWS_FILE.replace('%time%', startDate.toISOString())}`;\r\n\tawait multipartUpload.initMultipart('static.zerotoheroes.com', workingRowsFile, 'application/json');\r\n\tconsole.log('multipart upload init', workingRowsFile);\r\n\r\n\treturn new Promise<void>((resolve) => {\r\n\t\tconst queryStr = `\r\n\t\t\tSELECT * FROM bgs_run_stats_duo\r\n\t\t\tWHERE creationDate >= ?\r\n\t\t\tAND creationDate < ?\r\n\t\t`;\r\n\t\tconsole.log('running query', queryStr);\r\n\t\tconst query = connection.query(queryStr, [startDate, endDate]);\r\n\r\n\t\tlet rowsToProcess = [];\r\n\t\tlet rowCount = 0;\r\n\t\tquery\r\n\t\t\t.on('error', (err) => {\r\n\t\t\t\tconsole.error('error while fetching rows', err);\r\n\t\t\t})\r\n\t\t\t.on('fields', (fields) => {\r\n\t\t\t\tconsole.log('fields', fields);\r\n\t\t\t})\r\n\t\t\t.on('result', async (row) => {\r\n\t\t\t\trowsToProcess.push(row);\r\n\t\t\t\tif (rowsToProcess.length > 20000 && !multipartUpload.processing) {\r\n\t\t\t\t\tconnection.pause();\r\n\t\t\t\t\t// console.log('before upload', rowsToProcess.length);\r\n\t\t\t\t\tconst toUpload = rowsToProcess;\r\n\t\t\t\t\trowsToProcess = [];\r\n\t\t\t\t\t// console.log('will upload', toUpload.length, 'rows');\r\n\t\t\t\t\tconst uploaded = await processRows(toUpload, multipartUpload, allCards);\r\n\t\t\t\t\trowCount += uploaded;\r\n\t\t\t\t\tconsole.log('processed rows', uploaded, '/', toUpload.length, rowCount);\r\n\t\t\t\t\tconnection.resume();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.on('end', async () => {\r\n\t\t\t\tconsole.log('end');\r\n\t\t\t\tconst toUpload = rowsToProcess;\r\n\t\t\t\trowsToProcess = [];\r\n\t\t\t\t// console.log('will upload', toUpload.length, 'rows');\r\n\t\t\t\tconst uploaded = await processRows(toUpload, multipartUpload, allCards);\r\n\t\t\t\trowCount += uploaded;\r\n\t\t\t\tconsole.log('processed rows', uploaded, rowCount);\r\n\t\t\t\t// connection.resume();\r\n\t\t\t\tawait multipartUpload.completeMultipart();\r\n\t\t\t\tresolve();\r\n\t\t\t});\r\n\t});\r\n};\r\n\r\nconst processRows = async (\r\n\trows: readonly InternalBgsRow[],\r\n\tmultipartUpload: S3Multipart,\r\n\tallCards: AllCardsService,\r\n) => {\r\n\tconst validRows = rows\r\n\t\t// .filter((row) => row.heroCardId.startsWith('TB_BaconShop_') || row.heroCardId.startsWith('BG'))\r\n\t\t.filter(\r\n\t\t\t(row) =>\r\n\t\t\t\trow.heroCardId !== CardIds.ArannaStarseeker_ArannaUnleashedToken &&\r\n\t\t\t\trow.heroCardId !== CardIds.QueenAzshara_NagaQueenAzsharaToken,\r\n\t\t)\r\n\t\t.filter((row) => !!row.playerRank && !!row.tribes?.length)\r\n\t\t.map((row) => {\r\n\t\t\tconst result: InternalBgsRow = {\r\n\t\t\t\t...row,\r\n\t\t\t\theroCardId: normalizeHeroCardId(row.heroCardId, allCards),\r\n\t\t\t\ttribesExpanded: row.tribes.split(',').map((tribe) => parseInt(tribe)),\r\n\t\t\t\theroesOptionsExpanded:\r\n\t\t\t\t\trow.heroesOptions?.split(',').map((hero) => normalizeHeroCardId(hero, allCards)) ?? [],\r\n\t\t\t};\r\n\t\t\tdelete (result as any).reviewId;\r\n\t\t\tdelete (result as any).tribes;\r\n\t\t\treturn result;\r\n\t\t});\r\n\tif (validRows.length > 0) {\r\n\t\t// console.log('\\t', 'uploading', validRows.length, 'rows');\r\n\t\tawait multipartUpload.uploadPart(validRows.map((r) => JSON.stringify(r)).join('\\n'));\r\n\t}\r\n\treturn validRows.length;\r\n};\r\n\r\nconst getSecret = (secretRequest: GetSecretValueRequest) => {\r\n\tconst secretsManager = new SecretsManager({ region: 'us-west-2' });\r\n\treturn new Promise<SecretInfo>((resolve) => {\r\n\t\tsecretsManager.getSecretValue(secretRequest, (err, data: GetSecretValueResponse) => {\r\n\t\t\tconst secretInfo: SecretInfo = JSON.parse(data.SecretString);\r\n\t\t\tresolve(secretInfo);\r\n\t\t});\r\n\t});\r\n};\r\n\r\ninterface SecretInfo {\r\n\treadonly username: string;\r\n\treadonly password: string;\r\n\treadonly host: string;\r\n\treadonly hostReadOnly: string;\r\n\treadonly port: number;\r\n\treadonly dbClusterIdentifier: string;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"rows.js","sourceRoot":"","sources":["../../../src/duos/hourly/rows.ts"],"names":[],"mappings":"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","sourcesContent":["import { S3Multipart } from '@firestone-hs/aws-lambda-utils';\r\nimport { AllCardsService, CardIds } from '@firestone-hs/reference-data';\r\nimport { S3 as S3AWS } from 'aws-sdk';\r\nimport SecretsManager, { GetSecretValueRequest, GetSecretValueResponse } from 'aws-sdk/clients/secretsmanager';\r\nimport { Connection, createPool } from 'mysql';\r\nimport { Readable } from 'stream';\r\nimport { normalizeHeroCardId } from '../../common/util-functions';\r\nimport { InternalBgsRow } from '../../internal-model';\r\nimport { STATS_BUCKET, WORKING_ROWS_FILE, s3 } from './_build-battlegrounds-hero-stats';\r\n\r\nexport const readRowsFromS3 = async (startDate: string): Promise<readonly InternalBgsRow[]> => {\r\n\treturn new Promise<readonly InternalBgsRow[]>((resolve, reject) => {\r\n\t\tconst workingRowsFile = `${WORKING_ROWS_FILE.replace('%time%', startDate)}`;\r\n\t\tconsole.debug('reading rows from s3', workingRowsFile);\r\n\t\tlet parseErrors = 0;\r\n\t\tlet totalParsed = 0;\r\n\t\tconst stream: Readable = s3.readStream(STATS_BUCKET, workingRowsFile);\r\n\t\tconst result: InternalBgsRow[] = [];\r\n\t\tlet previousString = '';\r\n\t\tlet emptyRowsInARow = 0;\r\n\t\tstream\r\n\t\t\t.on('data', (chunk) => {\r\n\t\t\t\tconst str = Buffer.from(chunk).toString('utf-8');\r\n\t\t\t\tconst newStr = previousString + str;\r\n\t\t\t\tconst split = newStr.split('\\n');\r\n\t\t\t\tconst rows: readonly InternalBgsRow[] = split.slice(0, split.length - 1).map((row) => {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tconst result: InternalBgsRow = JSON.parse(row);\r\n\t\t\t\t\t\ttotalParsed++;\r\n\t\t\t\t\t\treturn result;\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t// logger.warn('could not parse row', row);\r\n\t\t\t\t\t\tparseErrors++;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tpreviousString = split[split.length - 1];\r\n\t\t\t\tresult.push(...rows);\r\n\r\n\t\t\t\t// Do this to avoid errors in case the chunks are small compared to the row sizes\r\n\t\t\t\tif (result.length === 0 && rows.length === 0) {\r\n\t\t\t\t\temptyRowsInARow++;\r\n\t\t\t\t} else {\r\n\t\t\t\t\temptyRowsInARow = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (emptyRowsInARow > 50) {\r\n\t\t\t\t\tconsole.error(newStr);\r\n\t\t\t\t\tconsole.error(split);\r\n\t\t\t\t\tthrow new Error('Could not parse any row');\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.on('end', () => {\r\n\t\t\t\tconst finalResult = result.filter((row) => !!row);\r\n\t\t\t\tconsole.log('stream end', result.length, finalResult.length);\r\n\t\t\t\tconsole.log('parsing', parseErrors, '/', totalParsed);\r\n\t\t\t\tresolve(finalResult);\r\n\t\t\t});\r\n\t});\r\n};\r\n\r\nexport const saveRowsOnS3 = async (startDate: Date, endDate: Date, allCards: AllCardsService) => {\r\n\tconsole.log('will export rows to S3', startDate, endDate);\r\n\tconst secretRequest: GetSecretValueRequest = {\r\n\t\tSecretId: 'rds-connection',\r\n\t};\r\n\tconst secret: SecretInfo = await getSecret(secretRequest);\r\n\tconst pool = createPool({\r\n\t\tconnectionLimit: 1,\r\n\t\thost: secret.hostReadOnly,\r\n\t\tuser: secret.username,\r\n\t\tpassword: secret.password,\r\n\t\tdatabase: 'replay_summary',\r\n\t\tport: secret.port,\r\n\t});\r\n\r\n\ttry {\r\n\t\tawait performRowProcessIngPool(pool, startDate, endDate, allCards);\r\n\t} finally {\r\n\t\tpool.end((err) => {\r\n\t\t\tconsole.log('ending pool', err);\r\n\t\t});\r\n\t}\r\n};\r\n\r\nconst performRowProcessIngPool = async (pool: any, startDate: Date, endDate: Date, allCards: AllCardsService) => {\r\n\treturn new Promise<void>((resolve) => {\r\n\t\tpool.getConnection(async (err, connection) => {\r\n\t\t\tif (err) {\r\n\t\t\t\tconsole.log('error with connection', err);\r\n\t\t\t\tthrow new Error('Could not connect to DB');\r\n\t\t\t} else {\r\n\t\t\t\tawait performRowsProcessing(connection, startDate, endDate, allCards);\r\n\t\t\t\tconnection.release();\r\n\t\t\t}\r\n\t\t\tresolve();\r\n\t\t});\r\n\t});\r\n};\r\n\r\nconst performRowsProcessing = async (\r\n\tconnection: Connection,\r\n\tstartDate: Date,\r\n\tendDate: Date,\r\n\tallCards: AllCardsService,\r\n) => {\r\n\tconst multipartUpload = new S3Multipart(new S3AWS());\r\n\tconst workingRowsFile = `${WORKING_ROWS_FILE.replace('%time%', startDate.toISOString())}`;\r\n\tawait multipartUpload.initMultipart('static.zerotoheroes.com', workingRowsFile, 'application/json');\r\n\tconsole.log('multipart upload init', workingRowsFile);\r\n\r\n\treturn new Promise<void>((resolve) => {\r\n\t\tconst queryStr = `\r\n\t\t\tSELECT * FROM bgs_run_stats_duo\r\n\t\t\tWHERE creationDate >= ?\r\n\t\t\tAND creationDate < ?\r\n\t\t`;\r\n\t\tconsole.log('running query', queryStr);\r\n\t\tconst query = connection.query(queryStr, [startDate, endDate]);\r\n\r\n\t\tlet rowsToProcess = [];\r\n\t\tlet rowCount = 0;\r\n\t\tquery\r\n\t\t\t.on('error', (err) => {\r\n\t\t\t\tconsole.error('error while fetching rows', err);\r\n\t\t\t})\r\n\t\t\t.on('fields', (fields) => {\r\n\t\t\t\tconsole.log('fields', fields);\r\n\t\t\t})\r\n\t\t\t.on('result', async (row) => {\r\n\t\t\t\trowsToProcess.push(row);\r\n\t\t\t\tif (rowsToProcess.length > 20000 && !multipartUpload.processing) {\r\n\t\t\t\t\tconnection.pause();\r\n\t\t\t\t\t// console.log('before upload', rowsToProcess.length);\r\n\t\t\t\t\tconst toUpload = rowsToProcess;\r\n\t\t\t\t\trowsToProcess = [];\r\n\t\t\t\t\t// console.log('will upload', toUpload.length, 'rows');\r\n\t\t\t\t\tconst uploaded = await processRows(toUpload, multipartUpload, allCards);\r\n\t\t\t\t\trowCount += uploaded;\r\n\t\t\t\t\tconsole.log('processed rows', uploaded, '/', toUpload.length, rowCount);\r\n\t\t\t\t\tconnection.resume();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.on('end', async () => {\r\n\t\t\t\tconsole.log('end');\r\n\t\t\t\tconst toUpload = rowsToProcess;\r\n\t\t\t\trowsToProcess = [];\r\n\t\t\t\t// console.log('will upload', toUpload.length, 'rows');\r\n\t\t\t\tconst uploaded = await processRows(toUpload, multipartUpload, allCards);\r\n\t\t\t\trowCount += uploaded;\r\n\t\t\t\tconsole.log('processed rows', uploaded, rowCount);\r\n\t\t\t\t// connection.resume();\r\n\t\t\t\tawait multipartUpload.completeMultipart();\r\n\t\t\t\tresolve();\r\n\t\t\t});\r\n\t});\r\n};\r\n\r\nconst processRows = async (\r\n\trows: readonly InternalBgsRow[],\r\n\tmultipartUpload: S3Multipart,\r\n\tallCards: AllCardsService,\r\n) => {\r\n\tconst validRows = rows\r\n\t\t// .filter((row) => row.heroCardId.startsWith('TB_BaconShop_') || row.heroCardId.startsWith('BG'))\r\n\t\t.filter(\r\n\t\t\t(row) =>\r\n\t\t\t\trow.heroCardId !== CardIds.ArannaStarseeker_ArannaUnleashedToken &&\r\n\t\t\t\trow.heroCardId !== CardIds.QueenAzshara_NagaQueenAzsharaToken,\r\n\t\t)\r\n\t\t.filter((row) => !!row.playerRank && !!row.tribes?.length)\r\n\t\t.map((row) => {\r\n\t\t\tconst result: InternalBgsRow = {\r\n\t\t\t\t...row,\r\n\t\t\t\theroCardId: normalizeHeroCardId(row.heroCardId, allCards),\r\n\t\t\t\ttribesExpanded: row.tribes.split(',').map((tribe) => parseInt(tribe)),\r\n\t\t\t\theroesOptionsExpanded:\r\n\t\t\t\t\trow.heroesOptions?.split(',').map((hero) => normalizeHeroCardId(hero, allCards)) ?? [],\r\n\t\t\t};\r\n\t\t\tdelete (result as any).reviewId;\r\n\t\t\tdelete (result as any).tribes;\r\n\t\t\treturn result;\r\n\t\t});\r\n\tif (validRows.length > 0) {\r\n\t\t// console.log('\\t', 'uploading', validRows.length, 'rows');\r\n\t\tawait multipartUpload.uploadPart(validRows.map((r) => JSON.stringify(r)).join('\\n'));\r\n\t}\r\n\treturn validRows.length;\r\n};\r\n\r\nconst getSecret = (secretRequest: GetSecretValueRequest) => {\r\n\tconst secretsManager = new SecretsManager({ region: 'us-west-2' });\r\n\treturn new Promise<SecretInfo>((resolve) => {\r\n\t\tsecretsManager.getSecretValue(secretRequest, (err, data: GetSecretValueResponse) => {\r\n\t\t\tconst secretInfo: SecretInfo = JSON.parse(data.SecretString);\r\n\t\t\tresolve(secretInfo);\r\n\t\t});\r\n\t});\r\n};\r\n\r\ninterface SecretInfo {\r\n\treadonly username: string;\r\n\treadonly password: string;\r\n\treadonly host: string;\r\n\treadonly hostReadOnly: string;\r\n\treadonly port: number;\r\n\treadonly dbClusterIdentifier: string;\r\n}\r\n"]}
|
package/dist/internal-model.d.ts
CHANGED
|
@@ -48,7 +48,6 @@ export interface InternalBgsCardStat {
|
|
|
48
48
|
readonly totalOther: number;
|
|
49
49
|
readonly averagePlacementOther: number;
|
|
50
50
|
readonly turnStats: readonly InternalBgsCardTurnStat[];
|
|
51
|
-
readonly heroStats: readonly InternalBgsCardHeroStat[];
|
|
52
51
|
}
|
|
53
52
|
export interface InternalBgsCardHeroStat {
|
|
54
53
|
readonly heroCardId: string;
|
|
@@ -58,9 +57,9 @@ export interface InternalBgsCardHeroStat {
|
|
|
58
57
|
}
|
|
59
58
|
export interface InternalBgsCardTurnStat {
|
|
60
59
|
readonly turn: number;
|
|
61
|
-
readonly
|
|
60
|
+
readonly totalPlayed: number;
|
|
62
61
|
readonly averagePlacement: number;
|
|
63
|
-
readonly
|
|
62
|
+
readonly totalOther: number;
|
|
64
63
|
readonly averagePlacementOther: number;
|
|
65
64
|
}
|
|
66
65
|
export interface InternalBgsGlobalTrinketStat {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-model.js","sourceRoot":"","sources":["../src/internal-model.ts"],"names":[],"mappings":"","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\n\r\n// bgs_run_stats and bgs_run_stats_duo\r\nexport interface InternalBgsRow {\r\n\treadonly id: number;\r\n\treadonly reviewId: string;\r\n\treadonly creationDate: Date;\r\n\treadonly buildNumber: number;\r\n\treadonly rating: number;\r\n\t// Normalized once it goes out of the \"rows.ts\" process\r\n\treadonly heroCardId: string;\r\n\treadonly playerRank: number;\r\n\t/** @deprecated */\r\n\treadonly tribes: string;\r\n\treadonly tribesExpanded: readonly Race[];\r\n\t/** @deprecated */\r\n\treadonly combatWinrate: string;\r\n\t// readonly combatWinrateExpanded: readonly { turn: number; winrate: number }[];\r\n\t/** @deprecated */\r\n\treadonly warbandStats: string;\r\n\t// readonly warbandStatsExpanded: readonly { turn: number; totalStats: number }[];\r\n\treadonly darkmoonPrizes: boolean;\r\n\treadonly quests: boolean;\r\n\treadonly bgsHeroQuests: string;\r\n\treadonly bgsQuestsCompletedTimings: string;\r\n\treadonly bgsQuestsDifficulties: string;\r\n\treadonly bgsHeroQuestRewards: string;\r\n\treadonly bgsAnomalies: string;\r\n\treadonly bgsTrinkets: string;\r\n\treadonly bgsTrinketsOptions: string;\r\n\t/** @deprecated */\r\n\treadonly heroesOptions: string;\r\n\treadonly heroesOptionsExpanded: readonly string[];\r\n\treadonly playedCards: string;\r\n\treadonly playedCardsExpanded: readonly { cardId: string; turn: number }[];\r\n}\r\n\r\nimport { MmrPercentile, WithMmrAndTimePeriod } from './models';\r\n\r\nexport interface InternalBgsTrinketStats {\r\n\treadonly lastUpdateDate: Date;\r\n\treadonly mmrPercentiles: readonly MmrPercentile[];\r\n\treadonly dataPoints: number;\r\n\treadonly trinketStats: readonly WithMmrAndTimePeriod<InternalBgsGlobalTrinketStat>[];\r\n}\r\n\r\nexport interface InternalBgsCardStats {\r\n\treadonly lastUpdateDate: Date;\r\n\treadonly mmrPercentiles: readonly MmrPercentile[];\r\n\treadonly dataPoints: number;\r\n\treadonly cardStats: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[];\r\n}\r\n\r\nexport interface InternalBgsCardStat {\r\n\treadonly cardId: string;\r\n\treadonly totalPlayed: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly totalOther: number;\r\n\treadonly averagePlacementOther: number;\r\n\treadonly turnStats: readonly InternalBgsCardTurnStat[];\r\n\
|
|
1
|
+
{"version":3,"file":"internal-model.js","sourceRoot":"","sources":["../src/internal-model.ts"],"names":[],"mappings":"","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\n\r\n// bgs_run_stats and bgs_run_stats_duo\r\nexport interface InternalBgsRow {\r\n\treadonly id: number;\r\n\treadonly reviewId: string;\r\n\treadonly creationDate: Date;\r\n\treadonly buildNumber: number;\r\n\treadonly rating: number;\r\n\t// Normalized once it goes out of the \"rows.ts\" process\r\n\treadonly heroCardId: string;\r\n\treadonly playerRank: number;\r\n\t/** @deprecated */\r\n\treadonly tribes: string;\r\n\treadonly tribesExpanded: readonly Race[];\r\n\t/** @deprecated */\r\n\treadonly combatWinrate: string;\r\n\t// readonly combatWinrateExpanded: readonly { turn: number; winrate: number }[];\r\n\t/** @deprecated */\r\n\treadonly warbandStats: string;\r\n\t// readonly warbandStatsExpanded: readonly { turn: number; totalStats: number }[];\r\n\treadonly darkmoonPrizes: boolean;\r\n\treadonly quests: boolean;\r\n\treadonly bgsHeroQuests: string;\r\n\treadonly bgsQuestsCompletedTimings: string;\r\n\treadonly bgsQuestsDifficulties: string;\r\n\treadonly bgsHeroQuestRewards: string;\r\n\treadonly bgsAnomalies: string;\r\n\treadonly bgsTrinkets: string;\r\n\treadonly bgsTrinketsOptions: string;\r\n\t/** @deprecated */\r\n\treadonly heroesOptions: string;\r\n\treadonly heroesOptionsExpanded: readonly string[];\r\n\treadonly playedCards: string;\r\n\treadonly playedCardsExpanded: readonly { cardId: string; turn: number }[];\r\n}\r\n\r\nimport { MmrPercentile, WithMmrAndTimePeriod } from './models';\r\n\r\nexport interface InternalBgsTrinketStats {\r\n\treadonly lastUpdateDate: Date;\r\n\treadonly mmrPercentiles: readonly MmrPercentile[];\r\n\treadonly dataPoints: number;\r\n\treadonly trinketStats: readonly WithMmrAndTimePeriod<InternalBgsGlobalTrinketStat>[];\r\n}\r\n\r\nexport interface InternalBgsCardStats {\r\n\treadonly lastUpdateDate: Date;\r\n\treadonly mmrPercentiles: readonly MmrPercentile[];\r\n\treadonly dataPoints: number;\r\n\treadonly cardStats: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[];\r\n}\r\n\r\nexport interface InternalBgsCardStat {\r\n\treadonly cardId: string;\r\n\treadonly totalPlayed: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly totalOther: number;\r\n\treadonly averagePlacementOther: number;\r\n\treadonly turnStats: readonly InternalBgsCardTurnStat[];\r\n\t// Not tested yet, there are some error in heroStats.turnStats.totalOther, which is always 0\r\n\t// readonly heroStats: readonly InternalBgsCardHeroStat[];\r\n}\r\n\r\nexport interface InternalBgsCardHeroStat {\r\n\treadonly heroCardId: string;\r\n\treadonly totalPlayedWithHero: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly turnStats: readonly InternalBgsCardTurnStat[];\r\n}\r\n\r\nexport interface InternalBgsCardTurnStat {\r\n\treadonly turn: number;\r\n\treadonly totalPlayed: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly totalOther: number;\r\n\treadonly averagePlacementOther: number;\r\n}\r\n\r\nexport interface InternalBgsGlobalTrinketStat {\r\n\treadonly trinketCardId: string;\r\n\treadonly dataPoints: number;\r\n\treadonly totalOffered: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly heroStats: readonly InternalBgsTrinketHeroStat[];\r\n}\r\n\r\nexport interface InternalBgsTrinketHeroStat {\r\n\treadonly heroCardId: string;\r\n\treadonly dataPoints: number;\r\n\treadonly averagePlacement: number;\r\n}\r\n"]}
|
package/dist/model-cards.d.ts
CHANGED
|
@@ -10,33 +10,23 @@ export interface BgsCardStat {
|
|
|
10
10
|
readonly totalPlayed: number;
|
|
11
11
|
readonly averagePlacement: number;
|
|
12
12
|
readonly averagePlacementOther: number;
|
|
13
|
-
readonly averagePlacementAtMmr: readonly {
|
|
14
|
-
mmr: number;
|
|
15
|
-
placement: number;
|
|
16
|
-
}[];
|
|
17
|
-
readonly averagePlacementAtMmrOther: readonly {
|
|
18
|
-
mmr: number;
|
|
19
|
-
placement: number;
|
|
20
|
-
}[];
|
|
21
13
|
readonly turnStats: readonly BgsCardTurnStat[];
|
|
22
|
-
readonly heroStats: readonly BgsCardHeroStat[];
|
|
23
14
|
}
|
|
24
15
|
export interface BgsCardHeroStat {
|
|
25
16
|
readonly heroCardId: string;
|
|
26
17
|
readonly totalPlayedWithHero: number;
|
|
27
18
|
readonly averagePlacement: number;
|
|
28
|
-
readonly averagePlacementAtMmr: readonly {
|
|
29
|
-
mmr: number;
|
|
30
|
-
placement: number;
|
|
31
|
-
}[];
|
|
32
19
|
readonly turnStats: readonly BgsCardTurnStat[];
|
|
33
20
|
}
|
|
34
21
|
export interface BgsCardTurnStat {
|
|
35
22
|
readonly turn: number;
|
|
36
|
-
readonly
|
|
23
|
+
readonly totalPlayed: number;
|
|
37
24
|
readonly averagePlacement: number;
|
|
38
|
-
readonly
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
25
|
+
readonly totalOther: number;
|
|
26
|
+
readonly averagePlacementOther: number;
|
|
27
|
+
}
|
|
28
|
+
export interface PlacementAtMmr {
|
|
29
|
+
readonly mmr: number;
|
|
30
|
+
readonly totalPlayed: number;
|
|
31
|
+
readonly placement: number;
|
|
42
32
|
}
|
package/dist/model-cards.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-cards.js","sourceRoot":"","sources":["../src/model-cards.ts"],"names":[],"mappings":"","sourcesContent":["import { TimePeriod } from './models';\r\n\r\nexport interface BgsCardStats {\r\n\treadonly lastUpdateDate: Date;\r\n\treadonly dataPoints: number;\r\n\treadonly timePeriod: TimePeriod;\r\n\treadonly cardStats: readonly BgsCardStat[];\r\n}\r\n\r\nexport interface BgsCardStat {\r\n\treadonly cardId: string;\r\n\treadonly totalPlayed: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly averagePlacementOther: number;\r\n\
|
|
1
|
+
{"version":3,"file":"model-cards.js","sourceRoot":"","sources":["../src/model-cards.ts"],"names":[],"mappings":"","sourcesContent":["import { TimePeriod } from './models';\r\n\r\nexport interface BgsCardStats {\r\n\treadonly lastUpdateDate: Date;\r\n\treadonly dataPoints: number;\r\n\treadonly timePeriod: TimePeriod;\r\n\treadonly cardStats: readonly BgsCardStat[];\r\n}\r\n\r\nexport interface BgsCardStat {\r\n\treadonly cardId: string;\r\n\treadonly totalPlayed: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly averagePlacementOther: number;\r\n\t// readonly averagePlacementAtMmr: readonly PlacementAtMmr[];\r\n\t// readonly averagePlacementAtMmrOther: readonly PlacementAtMmr[];\r\n\treadonly turnStats: readonly BgsCardTurnStat[];\r\n\t// readonly heroStats: readonly BgsCardHeroStat[];\r\n}\r\n\r\nexport interface BgsCardHeroStat {\r\n\treadonly heroCardId: string;\r\n\treadonly totalPlayedWithHero: number;\r\n\treadonly averagePlacement: number;\r\n\t// readonly averagePlacementAtMmr: readonly PlacementAtMmr[];\r\n\t// readonly averagePlacementAtMmrOther: readonly PlacementAtMmr[];\r\n\treadonly turnStats: readonly BgsCardTurnStat[];\r\n}\r\n\r\nexport interface BgsCardTurnStat {\r\n\treadonly turn: number;\r\n\treadonly totalPlayed: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly totalOther: number;\r\n\treadonly averagePlacementOther: number;\r\n\t// readonly averagePlacementAtMmr: readonly PlacementAtMmr[];\r\n\t// readonly averagePlacementAtMmrOther: readonly PlacementAtMmr[];\r\n}\r\n\r\nexport interface PlacementAtMmr {\r\n\treadonly mmr: number;\r\n\treadonly totalPlayed: number;\r\n\treadonly placement: number;\r\n}\r\n"]}
|
|
@@ -34,7 +34,8 @@ exports.default = async (event, context) => {
|
|
|
34
34
|
.sort((a, b) => b.time - a.time)[0].date;
|
|
35
35
|
console.log('merging stats for day', dayToProcess, mmrPercentile);
|
|
36
36
|
const mergedStats = (0, stats_builder_1.buildCardStats)(hourlyData, allCards);
|
|
37
|
-
|
|
37
|
+
const totalGames = hourlyData.map((s) => s.dataPoints).reduce((a, b) => a + b, 0);
|
|
38
|
+
await (0, s3_saver_1.persistData)(mergedStats, dayToProcess, totalGames, lastUpdate, mmrPercentile);
|
|
38
39
|
}
|
|
39
40
|
};
|
|
40
41
|
const dispatchCatchUpEvents = async (context, numberOfDays) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_build-aggregated-stats.js","sourceRoot":"","sources":["../../../../src/solo/aggregate-daily/cards/_build-aggregated-stats.ts"],"names":[],"mappings":";;;;;;AAAA,qEAA2D;AAC3D,iEAA+D;AAE/D,sDAA0B;AAG1B,gEAA8E;AAC9E,yCAAyC;AACzC,mDAAiD;AAEjD,MAAM,QAAQ,GAAG,IAAI,gCAAe,EAAE,CAAC;AAC1B,QAAA,EAAE,GAAG,IAAI,qBAAE,EAAE,CAAC;AAC3B,MAAM,MAAM,GAAG,IAAI,iBAAG,CAAC,MAAM,EAAE,CAAC;AAEnB,QAAA,cAAc,GAAmC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAEnF,kBAAe,KAAK,EAAE,KAAK,EAAE,OAAgB,EAAgB,EAAE;;IAC9D,IAAI,KAAK,CAAC,OAAO,EAAE;QAClB,MAAM,qBAAqB,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO;KACP;IAED,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IAGnC,MAAM,YAAY,GACjB,MAAA,KAAK,CAAC,UAAU,mCAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrG,KAAK,MAAM,aAAa,IAAI,sBAAc,EAAE;QAC3C,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;QACzE,MAAM,UAAU,GAAoC,MAAM,IAAA,sCAA0B,EACnF,MAAM,EACN,YAAY,EACZ,aAAa,CACb,CAAC;QACF,MAAM,UAAU,GAAG,UAAU;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;YAChC,OAAO,EAAE,CAAC,CAAC,cAAc;YACzB,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;SAC1C,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;QAClE,MAAM,WAAW,GAAmC,IAAA,8BAAc,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACzF,MAAM,IAAA,sBAAW,EAAC,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"_build-aggregated-stats.js","sourceRoot":"","sources":["../../../../src/solo/aggregate-daily/cards/_build-aggregated-stats.ts"],"names":[],"mappings":"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","sourcesContent":["import { S3, sleep } from '@firestone-hs/aws-lambda-utils';\r\nimport { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { Context } from 'aws-lambda';\r\nimport AWS from 'aws-sdk';\r\nimport { InternalBgsCardStat, InternalBgsCardStats } from '../../../internal-model';\r\nimport { MmrPercentileFilter } from '../../../models';\r\nimport { loadHourlyDataFromS3ForDay } from '../../aggregate-hourly/s3-loader';\r\nimport { persistData } from './s3-saver';\r\nimport { buildCardStats } from './stats-builder';\r\n\r\nconst allCards = new AllCardsService();\r\nexport const s3 = new S3();\r\nconst lambda = new AWS.Lambda();\r\n\r\nexport const mmrPercentiles: readonly MmrPercentileFilter[] = [100, 50, 25, 10, 1];\r\n\r\nexport default async (event, context: Context): Promise<any> => {\r\n\tif (event.catchUp) {\r\n\t\tawait dispatchCatchUpEvents(context, +event.catchUp);\r\n\t\treturn;\r\n\t}\r\n\r\n\tawait allCards.initializeCardsDb();\r\n\r\n\t// By default, process yesterday\r\n\tconst dayToProcess =\r\n\t\tevent.targetDate ?? new Date(new Date().getTime() - 24 * 60 * 60 * 1000).toISOString().slice(0, 10);\r\n\tfor (const mmrPercentile of mmrPercentiles) {\r\n\t\tconsole.log('aggregating daily cards data', dayToProcess, mmrPercentile);\r\n\t\tconst hourlyData: readonly InternalBgsCardStats[] = await loadHourlyDataFromS3ForDay(\r\n\t\t\t'card',\r\n\t\t\tdayToProcess,\r\n\t\t\tmmrPercentile,\r\n\t\t);\r\n\t\tconst lastUpdate = hourlyData\r\n\t\t\t.map((d) => ({\r\n\t\t\t\tdate: new Date(d.lastUpdateDate),\r\n\t\t\t\tdateStr: d.lastUpdateDate,\r\n\t\t\t\ttime: new Date(d.lastUpdateDate).getTime(),\r\n\t\t\t}))\r\n\t\t\t.sort((a, b) => b.time - a.time)[0].date;\r\n\t\tconsole.log('merging stats for day', dayToProcess, mmrPercentile);\r\n\t\tconst mergedStats: readonly InternalBgsCardStat[] = buildCardStats(hourlyData, allCards);\r\n\t\tconst totalGames = hourlyData.map((s) => s.dataPoints).reduce((a, b) => a + b, 0);\r\n\t\tawait persistData(mergedStats, dayToProcess, totalGames, lastUpdate, mmrPercentile);\r\n\t}\r\n};\r\n\r\nconst dispatchCatchUpEvents = async (context: Context, numberOfDays: number) => {\r\n\t// Build a list of days for the last 30 days, in the format YYYY-MM-dd\r\n\tconst now = new Date();\r\n\tconst days = [];\r\n\tfor (let i = 0; i < numberOfDays; i++) {\r\n\t\tconst day = new Date(now.setDate(now.getDate() - 1));\r\n\t\tconst year = day.getFullYear();\r\n\t\tconst month = day.getMonth() + 1;\r\n\t\tconst dayOfMonth = day.getDate();\r\n\t\tdays.push(`${year}-${month}-${dayOfMonth}`);\r\n\t}\r\n\r\n\tfor (const targetDate of days) {\r\n\t\t// console.log('dispatching catch-up for date', targetDate);\r\n\t\tconst newEvent = {\r\n\t\t\ttargetDate: targetDate,\r\n\t\t};\r\n\t\tconst params = {\r\n\t\t\tFunctionName: context.functionName,\r\n\t\t\tInvocationType: 'Event',\r\n\t\t\tLogType: 'Tail',\r\n\t\t\tPayload: JSON.stringify(newEvent),\r\n\t\t};\r\n\t\t// console.log('\\tinvoking lambda', params);\r\n\t\tconst result = await lambda\r\n\t\t\t.invoke({\r\n\t\t\t\tFunctionName: context.functionName,\r\n\t\t\t\tInvocationType: 'Event',\r\n\t\t\t\tLogType: 'Tail',\r\n\t\t\t\tPayload: JSON.stringify(newEvent),\r\n\t\t\t})\r\n\t\t\t.promise();\r\n\t\t// console.log('\\tinvocation result', result);\r\n\t\tawait sleep(50);\r\n\t}\r\n};\r\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { InternalBgsCardStat } from '../../../internal-model';
|
|
2
2
|
import { MmrPercentileFilter } from '../../../models';
|
|
3
|
-
export declare const persistData: (mergedStats: readonly InternalBgsCardStat[], dayStartTime: string, lastUpdate: Date, mmrPercentile: MmrPercentileFilter) => Promise<void>;
|
|
3
|
+
export declare const persistData: (mergedStats: readonly InternalBgsCardStat[], dayStartTime: string, totalGames: number, lastUpdate: Date, mmrPercentile: MmrPercentileFilter) => Promise<void>;
|
|
@@ -5,17 +5,21 @@ const zlib_1 = require("zlib");
|
|
|
5
5
|
const config_1 = require("../../aggregate-hourly/config");
|
|
6
6
|
const _build_battlegrounds_hero_stats_1 = require("../../hourly/_build-battlegrounds-hero-stats");
|
|
7
7
|
const _build_aggregated_stats_1 = require("./_build-aggregated-stats");
|
|
8
|
-
const persistData = async (mergedStats, dayStartTime, lastUpdate, mmrPercentile) => {
|
|
8
|
+
const persistData = async (mergedStats, dayStartTime, totalGames, lastUpdate, mmrPercentile) => {
|
|
9
|
+
var _a, _b, _c;
|
|
9
10
|
const result = {
|
|
10
|
-
lastUpdateDate:
|
|
11
|
+
lastUpdateDate: lastUpdate,
|
|
11
12
|
mmrPercentiles: [],
|
|
12
|
-
dataPoints:
|
|
13
|
+
dataPoints: totalGames,
|
|
13
14
|
cardStats: mergedStats.map((stat) => ({
|
|
14
15
|
...stat,
|
|
15
16
|
mmrPercentile: mmrPercentile,
|
|
16
17
|
timePeriod: null,
|
|
17
18
|
})),
|
|
18
19
|
};
|
|
20
|
+
if (mmrPercentile === 100) {
|
|
21
|
+
console.debug('Bubble Gunner daily', (_c = (_b = (_a = result.cardStats.find((s) => s.cardId === 'BG31_149')) === null || _a === void 0 ? void 0 : _a.turnStats) === null || _b === void 0 ? void 0 : _b.find((t) => t.turn === 1)) === null || _c === void 0 ? void 0 : _c.totalPlayed, mmrPercentile);
|
|
22
|
+
}
|
|
19
23
|
await _build_aggregated_stats_1.s3.writeFile((0, zlib_1.gzipSync)(JSON.stringify(result)), _build_battlegrounds_hero_stats_1.STATS_BUCKET, config_1.DAILY_KEY_CARD.replace('%startDate%', dayStartTime).replace('%mmrPercentile%', `${mmrPercentile}`), 'application/json', 'gzip');
|
|
20
24
|
};
|
|
21
25
|
exports.persistData = persistData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-saver.js","sourceRoot":"","sources":["../../../../src/solo/aggregate-daily/cards/s3-saver.ts"],"names":[],"mappings":";;;AAAA,+BAAgC;AAGhC,0DAA+D;AAC/D,kGAA4E;AAC5E,uEAA+C;AAExC,MAAM,WAAW,GAAG,KAAK,EAC/B,WAA2C,EAC3C,YAAoB,EACpB,UAAgB,EAChB,aAAkC,EACjC,EAAE
|
|
1
|
+
{"version":3,"file":"s3-saver.js","sourceRoot":"","sources":["../../../../src/solo/aggregate-daily/cards/s3-saver.ts"],"names":[],"mappings":";;;AAAA,+BAAgC;AAGhC,0DAA+D;AAC/D,kGAA4E;AAC5E,uEAA+C;AAExC,MAAM,WAAW,GAAG,KAAK,EAC/B,WAA2C,EAC3C,YAAoB,EACpB,UAAkB,EAClB,UAAgB,EAChB,aAAkC,EACjC,EAAE;;IACH,MAAM,MAAM,GAAyB;QACpC,cAAc,EAAE,UAAU;QAC1B,cAAc,EAAE,EAAE;QAClB,UAAU,EAAE,UAAU;QACtB,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACrC,GAAG,IAAI;YACP,aAAa,EAAE,aAAa;YAC5B,UAAU,EAAE,IAAI;SAChB,CAAC,CAAC;KACH,CAAC;IAEF,IAAI,aAAa,KAAK,GAAG,EAAE;QAC1B,OAAO,CAAC,KAAK,CACZ,qBAAqB,EACrB,MAAA,MAAA,MAAA,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,0CAAE,SAAS,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,0CAAE,WAAW,EACxG,aAAa,CACb,CAAC;KACF;IACD,MAAM,4BAAE,CAAC,SAAS,CACjB,IAAA,eAAQ,EAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAChC,8CAAY,EACZ,uBAAc,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,aAAa,EAAE,CAAC,EAClG,kBAAkB,EAClB,MAAM,CACN,CAAC;AACH,CAAC,CAAC;AAhCW,QAAA,WAAW,eAgCtB","sourcesContent":["import { gzipSync } from 'zlib';\r\nimport { InternalBgsCardStat, InternalBgsCardStats } from '../../../internal-model';\r\nimport { MmrPercentileFilter } from '../../../models';\r\nimport { DAILY_KEY_CARD } from '../../aggregate-hourly/config';\r\nimport { STATS_BUCKET } from '../../hourly/_build-battlegrounds-hero-stats';\r\nimport { s3 } from './_build-aggregated-stats';\r\n\r\nexport const persistData = async (\r\n\tmergedStats: readonly InternalBgsCardStat[],\r\n\tdayStartTime: string,\r\n\ttotalGames: number,\r\n\tlastUpdate: Date,\r\n\tmmrPercentile: MmrPercentileFilter,\r\n) => {\r\n\tconst result: InternalBgsCardStats = {\r\n\t\tlastUpdateDate: lastUpdate,\r\n\t\tmmrPercentiles: [],\r\n\t\tdataPoints: totalGames,\r\n\t\tcardStats: mergedStats.map((stat) => ({\r\n\t\t\t...stat,\r\n\t\t\tmmrPercentile: mmrPercentile,\r\n\t\t\ttimePeriod: null,\r\n\t\t})),\r\n\t};\r\n\t// console.log('persisting data', stat.dataPoints, stat.heroStats?.length);\r\n\tif (mmrPercentile === 100) {\r\n\t\tconsole.debug(\r\n\t\t\t'Bubble Gunner daily',\r\n\t\t\tresult.cardStats.find((s) => s.cardId === 'BG31_149')?.turnStats?.find((t) => t.turn === 1)?.totalPlayed,\r\n\t\t\tmmrPercentile,\r\n\t\t);\r\n\t}\r\n\tawait s3.writeFile(\r\n\t\tgzipSync(JSON.stringify(result)),\r\n\t\tSTATS_BUCKET,\r\n\t\tDAILY_KEY_CARD.replace('%startDate%', dayStartTime).replace('%mmrPercentile%', `${mmrPercentile}`),\r\n\t\t'application/json',\r\n\t\t'gzip',\r\n\t);\r\n};\r\n"]}
|
|
@@ -10,14 +10,25 @@ const buildCardStats = (hourlyData, allCards) => {
|
|
|
10
10
|
exports.buildCardStats = buildCardStats;
|
|
11
11
|
const buildSingleCardStat = (data, allCards) => {
|
|
12
12
|
const ref = data[0];
|
|
13
|
-
const totalPlayed = data
|
|
14
|
-
|
|
13
|
+
const totalPlayed = data
|
|
14
|
+
.filter((d) => d.averagePlacement != null && d.totalPlayed != null)
|
|
15
|
+
.map((d) => d.totalPlayed)
|
|
16
|
+
.reduce((a, b) => a + b, 0);
|
|
17
|
+
const totalPlacement = data
|
|
18
|
+
.filter((d) => d.averagePlacement != null && d.totalPlayed != null)
|
|
19
|
+
.map((d) => d.totalPlayed * d.averagePlacement)
|
|
20
|
+
.reduce((a, b) => a + b, 0);
|
|
15
21
|
const averagePlacement = totalPlacement / totalPlayed;
|
|
16
|
-
const totalOther = data
|
|
17
|
-
|
|
22
|
+
const totalOther = data
|
|
23
|
+
.filter((d) => d.averagePlacementOther != null && d.totalOther != null)
|
|
24
|
+
.map((d) => d.totalOther)
|
|
25
|
+
.reduce((a, b) => a + b, 0);
|
|
26
|
+
const totalPlacementOther = data
|
|
27
|
+
.filter((d) => d.averagePlacementOther != null && d.totalOther != null)
|
|
28
|
+
.map((d) => d.totalOther * d.averagePlacementOther)
|
|
29
|
+
.reduce((a, b) => a + b, 0);
|
|
18
30
|
const averagePlacementOther = totalPlacementOther / totalOther;
|
|
19
31
|
const turnStats = buildTurnStats(data);
|
|
20
|
-
const heroStats = buildHeroStats(data);
|
|
21
32
|
const result = {
|
|
22
33
|
cardId: ref.cardId,
|
|
23
34
|
totalPlayed: totalPlayed,
|
|
@@ -25,50 +36,37 @@ const buildSingleCardStat = (data, allCards) => {
|
|
|
25
36
|
totalOther: totalOther,
|
|
26
37
|
averagePlacementOther: averagePlacementOther,
|
|
27
38
|
turnStats: turnStats,
|
|
28
|
-
heroStats: heroStats,
|
|
29
39
|
};
|
|
30
40
|
return result;
|
|
31
41
|
};
|
|
32
|
-
const buildHeroStats = (data) => {
|
|
33
|
-
const allHeroStats = data.flatMap((d) => d.heroStats);
|
|
34
|
-
const groupedByHero = (0, aws_lambda_utils_1.groupByFunction)((data) => data.heroCardId)(allHeroStats);
|
|
35
|
-
return Object.keys(groupedByHero).map((heroCardId) => {
|
|
36
|
-
const relevantData = groupedByHero[heroCardId];
|
|
37
|
-
const totalPlayed = relevantData.map((d) => d.totalPlayedWithHero).reduce((a, b) => a + b, 0);
|
|
38
|
-
const totalPlacement = relevantData
|
|
39
|
-
.map((d) => d.totalPlayedWithHero * d.averagePlacement)
|
|
40
|
-
.reduce((a, b) => a + b, 0);
|
|
41
|
-
const averagePlacement = totalPlacement / totalPlayed;
|
|
42
|
-
const turnStats = buildTurnStats(relevantData);
|
|
43
|
-
const heroResult = {
|
|
44
|
-
heroCardId: heroCardId,
|
|
45
|
-
totalPlayedWithHero: totalPlayed,
|
|
46
|
-
averagePlacement: averagePlacement,
|
|
47
|
-
turnStats: turnStats,
|
|
48
|
-
};
|
|
49
|
-
return heroResult;
|
|
50
|
-
});
|
|
51
|
-
};
|
|
52
42
|
const buildTurnStats = (data) => {
|
|
53
43
|
const allTurnStats = data.flatMap((d) => d.turnStats);
|
|
54
44
|
const groupedByTurn = (0, aws_lambda_utils_1.groupByFunction)((data) => data.turn)(allTurnStats);
|
|
55
45
|
return Object.keys(groupedByTurn).map((turn) => {
|
|
56
46
|
const relevantData = groupedByTurn[turn];
|
|
57
|
-
const totalPlayed = relevantData
|
|
47
|
+
const totalPlayed = relevantData
|
|
48
|
+
.filter((d) => d.averagePlacement != null && d.totalPlayed != null)
|
|
49
|
+
.map((d) => d.totalPlayed)
|
|
50
|
+
.reduce((a, b) => a + b, 0);
|
|
58
51
|
const totalPlacement = relevantData
|
|
59
|
-
.
|
|
52
|
+
.filter((d) => d.averagePlacement != null && d.totalPlayed != null)
|
|
53
|
+
.map((d) => d.totalPlayed * d.averagePlacement)
|
|
60
54
|
.reduce((a, b) => a + b, 0);
|
|
61
55
|
const averagePlacement = totalPlacement / totalPlayed;
|
|
62
|
-
const totalPlayerAtTurnOther = relevantData
|
|
56
|
+
const totalPlayerAtTurnOther = relevantData
|
|
57
|
+
.filter((d) => d.averagePlacementOther != null && d.totalOther != null)
|
|
58
|
+
.map((d) => d.totalOther)
|
|
59
|
+
.reduce((a, b) => a + b, 0);
|
|
63
60
|
const totalPlacementOther = relevantData
|
|
64
|
-
.
|
|
61
|
+
.filter((d) => d.averagePlacementOther != null && d.totalOther != null)
|
|
62
|
+
.map((d) => d.totalOther * d.averagePlacementOther)
|
|
65
63
|
.reduce((a, b) => a + b, 0);
|
|
66
64
|
const averagePlacementOther = totalPlacementOther / totalPlayerAtTurnOther;
|
|
67
65
|
const turnResult = {
|
|
68
66
|
turn: parseInt(turn),
|
|
69
|
-
|
|
67
|
+
totalPlayed: totalPlayed,
|
|
70
68
|
averagePlacement: averagePlacement,
|
|
71
|
-
|
|
69
|
+
totalOther: totalPlayerAtTurnOther,
|
|
72
70
|
averagePlacementOther: averagePlacementOther,
|
|
73
71
|
};
|
|
74
72
|
return turnResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats-builder.js","sourceRoot":"","sources":["../../../../src/solo/aggregate-daily/cards/stats-builder.ts"],"names":[],"mappings":";;;AAAA,qEAAiE;
|
|
1
|
+
{"version":3,"file":"stats-builder.js","sourceRoot":"","sources":["../../../../src/solo/aggregate-daily/cards/stats-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { groupByFunction } from '@firestone-hs/aws-lambda-utils';\r\nimport { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { InternalBgsCardStat, InternalBgsCardStats, InternalBgsCardTurnStat } from '../../../internal-model';\r\nimport { WithMmrAndTimePeriod } from '../../../models';\r\n\r\n// These should all be for a single MMR\r\nexport const buildCardStats = (\r\n\thourlyData: readonly InternalBgsCardStats[],\r\n\tallCards: AllCardsService,\r\n): readonly InternalBgsCardStat[] => {\r\n\tconst allCardStats: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[] = hourlyData.flatMap(\r\n\t\t(data) => data.cardStats,\r\n\t);\r\n\tconst groupedByCard = groupByFunction((data: WithMmrAndTimePeriod<InternalBgsCardStat>) => data.cardId)(\r\n\t\tallCardStats,\r\n\t);\r\n\treturn Object.keys(groupedByCard).map((cardId) => buildSingleCardStat(groupedByCard[cardId], allCards));\r\n};\r\n\r\nconst buildSingleCardStat = (\r\n\tdata: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[],\r\n\tallCards: AllCardsService,\r\n): InternalBgsCardStat => {\r\n\tconst ref = data[0];\r\n\r\n\tconst totalPlayed = data\r\n\t\t.filter((d) => d.averagePlacement != null && d.totalPlayed != null)\r\n\t\t.map((d) => d.totalPlayed)\r\n\t\t.reduce((a, b) => a + b, 0);\r\n\tconst totalPlacement = data\r\n\t\t.filter((d) => d.averagePlacement != null && d.totalPlayed != null)\r\n\t\t.map((d) => d.totalPlayed * d.averagePlacement)\r\n\t\t.reduce((a, b) => a + b, 0);\r\n\tconst averagePlacement = totalPlacement / totalPlayed;\r\n\r\n\tconst totalOther = data\r\n\t\t.filter((d) => d.averagePlacementOther != null && d.totalOther != null)\r\n\t\t.map((d) => d.totalOther)\r\n\t\t.reduce((a, b) => a + b, 0);\r\n\tconst totalPlacementOther = data\r\n\t\t.filter((d) => d.averagePlacementOther != null && d.totalOther != null)\r\n\t\t.map((d) => d.totalOther * d.averagePlacementOther)\r\n\t\t.reduce((a, b) => a + b, 0);\r\n\tconst averagePlacementOther = totalPlacementOther / totalOther;\r\n\r\n\tconst turnStats: readonly InternalBgsCardTurnStat[] = buildTurnStats(data);\r\n\t// const heroStats: readonly InternalBgsCardHeroStat[] = buildHeroStats(data);\r\n\r\n\tconst result: InternalBgsCardStat = {\r\n\t\tcardId: ref.cardId,\r\n\t\ttotalPlayed: totalPlayed,\r\n\t\taveragePlacement: averagePlacement,\r\n\t\ttotalOther: totalOther,\r\n\t\taveragePlacementOther: averagePlacementOther,\r\n\t\tturnStats: turnStats,\r\n\t\t// heroStats: heroStats,\r\n\t};\r\n\treturn result;\r\n};\r\n\r\n// const buildHeroStats = (\r\n// \tdata: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[],\r\n// ): readonly InternalBgsCardHeroStat[] => {\r\n// \tconst allHeroStats = data.flatMap((d) => d.heroStats);\r\n// \tconst groupedByHero = groupByFunction((data: InternalBgsCardHeroStat) => data.heroCardId)(allHeroStats);\r\n// \treturn Object.keys(groupedByHero).map((heroCardId) => {\r\n// \t\tconst relevantData = groupedByHero[heroCardId];\r\n// \t\tconst totalPlayed = relevantData.map((d) => d.totalPlayedWithHero).reduce((a, b) => a + b, 0);\r\n// \t\tconst totalPlacement = relevantData\r\n// \t\t\t.map((d) => d.totalPlayedWithHero * d.averagePlacement)\r\n// \t\t\t.reduce((a, b) => a + b, 0);\r\n// \t\tconst averagePlacement = totalPlacement / totalPlayed;\r\n// \t\tconst turnStats = buildTurnStats(relevantData);\r\n// \t\tconst heroResult: InternalBgsCardHeroStat = {\r\n// \t\t\theroCardId: heroCardId,\r\n// \t\t\ttotalPlayedWithHero: totalPlayed,\r\n// \t\t\taveragePlacement: averagePlacement,\r\n// \t\t\tturnStats: turnStats,\r\n// \t\t};\r\n// \t\treturn heroResult;\r\n// \t});\r\n// };\r\n\r\nconst buildTurnStats = (\r\n\tdata: readonly { turnStats: readonly InternalBgsCardTurnStat[] }[],\r\n): readonly InternalBgsCardTurnStat[] => {\r\n\tconst allTurnStats = data.flatMap((d) => d.turnStats);\r\n\tconst groupedByTurn = groupByFunction((data: InternalBgsCardTurnStat) => data.turn)(allTurnStats);\r\n\treturn Object.keys(groupedByTurn).map((turn) => {\r\n\t\tconst relevantData = groupedByTurn[turn];\r\n\r\n\t\tconst totalPlayed = relevantData\r\n\t\t\t.filter((d) => d.averagePlacement != null && d.totalPlayed != null)\r\n\t\t\t.map((d) => d.totalPlayed)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacement = relevantData\r\n\t\t\t.filter((d) => d.averagePlacement != null && d.totalPlayed != null)\r\n\t\t\t.map((d) => d.totalPlayed * d.averagePlacement)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst averagePlacement = totalPlacement / totalPlayed;\r\n\r\n\t\tconst totalPlayerAtTurnOther = relevantData\r\n\t\t\t.filter((d) => d.averagePlacementOther != null && d.totalOther != null)\r\n\t\t\t.map((d) => d.totalOther)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacementOther = relevantData\r\n\t\t\t.filter((d) => d.averagePlacementOther != null && d.totalOther != null)\r\n\t\t\t.map((d) => d.totalOther * d.averagePlacementOther)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst averagePlacementOther = totalPlacementOther / totalPlayerAtTurnOther;\r\n\t\tconst turnResult: InternalBgsCardTurnStat = {\r\n\t\t\tturn: parseInt(turn),\r\n\t\t\ttotalPlayed: totalPlayed,\r\n\t\t\taveragePlacement: averagePlacement,\r\n\t\t\ttotalOther: totalPlayerAtTurnOther,\r\n\t\t\taveragePlacementOther: averagePlacementOther,\r\n\t\t};\r\n\t\treturn turnResult;\r\n\t});\r\n};\r\n"]}
|
|
@@ -6,4 +6,5 @@ export declare const DAILY_KEY_QUEST: string;
|
|
|
6
6
|
export declare const STAT_KEY_TRINKET: string;
|
|
7
7
|
export declare const DAILY_KEY_TRINKET: string;
|
|
8
8
|
export declare const STAT_KEY_CARD: string;
|
|
9
|
+
export declare const STAT_KEY_CARD_WITH_MMR: string;
|
|
9
10
|
export declare const DAILY_KEY_CARD: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DAILY_KEY_CARD = exports.STAT_KEY_CARD = exports.DAILY_KEY_TRINKET = exports.STAT_KEY_TRINKET = exports.DAILY_KEY_QUEST = exports.STAT_KEY_QUEST = exports.STAT_KEY_PERCENTILE = exports.DAILY_KEY_HERO = exports.STAT_KEY_HERO = void 0;
|
|
3
|
+
exports.DAILY_KEY_CARD = exports.STAT_KEY_CARD_WITH_MMR = exports.STAT_KEY_CARD = exports.DAILY_KEY_TRINKET = exports.STAT_KEY_TRINKET = exports.DAILY_KEY_QUEST = exports.STAT_KEY_QUEST = exports.STAT_KEY_PERCENTILE = exports.DAILY_KEY_HERO = exports.STAT_KEY_HERO = void 0;
|
|
4
4
|
const _build_battlegrounds_hero_stats_1 = require("../hourly/_build-battlegrounds-hero-stats");
|
|
5
5
|
exports.STAT_KEY_HERO = `${_build_battlegrounds_hero_stats_1.STATS_KEY_PREFIX}/hero-stats/mmr-%mmrPercentile%/%timePeriod%/overview-from-hourly.gz.json`;
|
|
6
6
|
exports.DAILY_KEY_HERO = `${_build_battlegrounds_hero_stats_1.STATS_KEY_PREFIX}/hero-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;
|
|
@@ -10,5 +10,6 @@ exports.DAILY_KEY_QUEST = `${_build_battlegrounds_hero_stats_1.STATS_KEY_PREFIX}
|
|
|
10
10
|
exports.STAT_KEY_TRINKET = `${_build_battlegrounds_hero_stats_1.STATS_KEY_PREFIX}/trinket-stats/%timePeriod%/overview-from-hourly.gz.json`;
|
|
11
11
|
exports.DAILY_KEY_TRINKET = `${_build_battlegrounds_hero_stats_1.STATS_KEY_PREFIX}/trinket-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;
|
|
12
12
|
exports.STAT_KEY_CARD = `${_build_battlegrounds_hero_stats_1.STATS_KEY_PREFIX}/card-stats/%timePeriod%/overview-from-hourly.gz.json`;
|
|
13
|
+
exports.STAT_KEY_CARD_WITH_MMR = `${_build_battlegrounds_hero_stats_1.STATS_KEY_PREFIX}/card-stats/mmr-%mmrPercentile%/%timePeriod%/overview-from-hourly.gz.json`;
|
|
13
14
|
exports.DAILY_KEY_CARD = `${_build_battlegrounds_hero_stats_1.STATS_KEY_PREFIX}/card-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;
|
|
14
15
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/solo/aggregate-hourly/config.ts"],"names":[],"mappings":";;;AAAA,+FAA6E;AAEhE,QAAA,aAAa,GAAG,GAAG,kDAAgB,2EAA2E,CAAC;AAC/G,QAAA,cAAc,GAAG,GAAG,kDAAgB,2DAA2D,CAAC;AAChG,QAAA,mBAAmB,GAAG,GAAG,kDAAgB,kDAAkD,CAAC;AAC5F,QAAA,cAAc,GAAG,GAAG,kDAAgB,4EAA4E,CAAC;AACjH,QAAA,eAAe,GAAG,GAAG,kDAAgB,4DAA4D,CAAC;AAClG,QAAA,gBAAgB,GAAG,GAAG,kDAAgB,0DAA0D,CAAC;AACjG,QAAA,iBAAiB,GAAG,GAAG,kDAAgB,8DAA8D,CAAC;AACtG,QAAA,aAAa,GAAG,GAAG,kDAAgB,uDAAuD,CAAC;AAC3F,QAAA,cAAc,GAAG,GAAG,kDAAgB,2DAA2D,CAAC","sourcesContent":["import { STATS_KEY_PREFIX } from '../hourly/_build-battlegrounds-hero-stats';\r\n\r\nexport const STAT_KEY_HERO = `${STATS_KEY_PREFIX}/hero-stats/mmr-%mmrPercentile%/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const DAILY_KEY_HERO = `${STATS_KEY_PREFIX}/hero-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;\r\nexport const STAT_KEY_PERCENTILE = `${STATS_KEY_PREFIX}/hero-stats/%timePeriod%/mmr-percentiles.gz.json`;\r\nexport const STAT_KEY_QUEST = `${STATS_KEY_PREFIX}/quest-stats/mmr-%mmrPercentile%/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const DAILY_KEY_QUEST = `${STATS_KEY_PREFIX}/quest-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;\r\nexport const STAT_KEY_TRINKET = `${STATS_KEY_PREFIX}/trinket-stats/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const DAILY_KEY_TRINKET = `${STATS_KEY_PREFIX}/trinket-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;\r\nexport const STAT_KEY_CARD = `${STATS_KEY_PREFIX}/card-stats/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const DAILY_KEY_CARD = `${STATS_KEY_PREFIX}/card-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;\r\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/solo/aggregate-hourly/config.ts"],"names":[],"mappings":";;;AAAA,+FAA6E;AAEhE,QAAA,aAAa,GAAG,GAAG,kDAAgB,2EAA2E,CAAC;AAC/G,QAAA,cAAc,GAAG,GAAG,kDAAgB,2DAA2D,CAAC;AAChG,QAAA,mBAAmB,GAAG,GAAG,kDAAgB,kDAAkD,CAAC;AAC5F,QAAA,cAAc,GAAG,GAAG,kDAAgB,4EAA4E,CAAC;AACjH,QAAA,eAAe,GAAG,GAAG,kDAAgB,4DAA4D,CAAC;AAClG,QAAA,gBAAgB,GAAG,GAAG,kDAAgB,0DAA0D,CAAC;AACjG,QAAA,iBAAiB,GAAG,GAAG,kDAAgB,8DAA8D,CAAC;AACtG,QAAA,aAAa,GAAG,GAAG,kDAAgB,uDAAuD,CAAC;AAC3F,QAAA,sBAAsB,GAAG,GAAG,kDAAgB,2EAA2E,CAAC;AACxH,QAAA,cAAc,GAAG,GAAG,kDAAgB,2DAA2D,CAAC","sourcesContent":["import { STATS_KEY_PREFIX } from '../hourly/_build-battlegrounds-hero-stats';\r\n\r\nexport const STAT_KEY_HERO = `${STATS_KEY_PREFIX}/hero-stats/mmr-%mmrPercentile%/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const DAILY_KEY_HERO = `${STATS_KEY_PREFIX}/hero-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;\r\nexport const STAT_KEY_PERCENTILE = `${STATS_KEY_PREFIX}/hero-stats/%timePeriod%/mmr-percentiles.gz.json`;\r\nexport const STAT_KEY_QUEST = `${STATS_KEY_PREFIX}/quest-stats/mmr-%mmrPercentile%/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const DAILY_KEY_QUEST = `${STATS_KEY_PREFIX}/quest-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;\r\nexport const STAT_KEY_TRINKET = `${STATS_KEY_PREFIX}/trinket-stats/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const DAILY_KEY_TRINKET = `${STATS_KEY_PREFIX}/trinket-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;\r\nexport const STAT_KEY_CARD = `${STATS_KEY_PREFIX}/card-stats/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const STAT_KEY_CARD_WITH_MMR = `${STATS_KEY_PREFIX}/card-stats/mmr-%mmrPercentile%/%timePeriod%/overview-from-hourly.gz.json`;\r\nexport const DAILY_KEY_CARD = `${STATS_KEY_PREFIX}/card-stats/mmr-%mmrPercentile%/daily/%startDate%.gz.json`;\r\n"]}
|
|
@@ -17,48 +17,69 @@ const allTimePeriod = ['all-time', 'past-three', 'past-seven', 'last-patch'];
|
|
|
17
17
|
exports.mmrPercentiles = [100, 50, 25, 10, 1];
|
|
18
18
|
exports.default = async (event, context) => {
|
|
19
19
|
await allCards.initializeCardsDb();
|
|
20
|
-
if (
|
|
20
|
+
if (event.timePeriod == null) {
|
|
21
21
|
await dispatchEvents(context);
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
24
|
const cleanup = (0, aws_lambda_utils_1.logBeforeTimeout)(context);
|
|
25
25
|
const timePeriod = event.timePeriod;
|
|
26
|
-
|
|
26
|
+
const mmrPercentile = event.mmrPercentile;
|
|
27
|
+
console.log('aggregating cards data', timePeriod, mmrPercentile);
|
|
27
28
|
const patchInfo = await (0, aws_lambda_utils_1.getLastBattlegroundsPatch)();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
29
|
+
if (mmrPercentile == null) {
|
|
30
|
+
const allHourlyData = (await Promise.all(exports.mmrPercentiles.map((mmrPercentile) => (0, s3_loader_1.loadHourlyDataWithDaysFromS3)('card', timePeriod, mmrPercentile, patchInfo)))).flat();
|
|
31
|
+
const lastUpdate = allHourlyData
|
|
32
|
+
.map((d) => ({
|
|
33
|
+
date: new Date(d.lastUpdateDate),
|
|
34
|
+
dateStr: d.lastUpdateDate,
|
|
35
|
+
time: new Date(d.lastUpdateDate).getTime(),
|
|
36
|
+
}))
|
|
37
|
+
.sort((a, b) => b.time - a.time)[0].date;
|
|
38
|
+
const mergedStats = (0, stats_builder_1.buildCardStats)(allHourlyData, allCards);
|
|
39
|
+
const totalGames = allHourlyData.map((s) => s.dataPoints).reduce((a, b) => a + b, 0);
|
|
40
|
+
await (0, s3_saver_1.persistData)(mergedStats, mmrPercentile, timePeriod, totalGames, lastUpdate);
|
|
41
|
+
cleanup();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const hourlyDataForMmr = await (0, s3_loader_1.loadHourlyDataWithDaysFromS3)('card', timePeriod, mmrPercentile, patchInfo);
|
|
45
|
+
console.debug('games played', hourlyDataForMmr.map((s) => s.dataPoints));
|
|
46
|
+
const lastUpdate = hourlyDataForMmr
|
|
47
|
+
.map((d) => ({
|
|
48
|
+
date: new Date(d.lastUpdateDate),
|
|
49
|
+
dateStr: d.lastUpdateDate,
|
|
50
|
+
time: new Date(d.lastUpdateDate).getTime(),
|
|
51
|
+
}))
|
|
52
|
+
.sort((a, b) => b.time - a.time)[0].date;
|
|
53
|
+
const mergedStatsForMmr = (0, stats_builder_1.buildCardStats)(hourlyDataForMmr, allCards);
|
|
54
|
+
const totalGames = hourlyDataForMmr.map((s) => s.dataPoints).reduce((a, b) => a + b, 0);
|
|
55
|
+
await (0, s3_saver_1.persistData)(mergedStatsForMmr, mmrPercentile, timePeriod, totalGames, lastUpdate);
|
|
56
|
+
cleanup();
|
|
57
|
+
}
|
|
40
58
|
};
|
|
41
59
|
const dispatchEvents = async (context) => {
|
|
42
|
-
console.log('dispatching events');
|
|
43
60
|
for (const timePeriod of allTimePeriod) {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
61
|
+
for (const mmrPercentile of [null, ...exports.mmrPercentiles]) {
|
|
62
|
+
console.log('dispatching event', timePeriod, mmrPercentile);
|
|
63
|
+
const newEvent = {
|
|
64
|
+
timePeriod: timePeriod,
|
|
65
|
+
mmrPercentile: mmrPercentile,
|
|
66
|
+
};
|
|
67
|
+
const params = {
|
|
68
|
+
FunctionName: context.functionName,
|
|
69
|
+
InvocationType: 'Event',
|
|
70
|
+
LogType: 'Tail',
|
|
71
|
+
Payload: JSON.stringify(newEvent),
|
|
72
|
+
};
|
|
73
|
+
const result = await lambda
|
|
74
|
+
.invoke({
|
|
75
|
+
FunctionName: context.functionName,
|
|
76
|
+
InvocationType: 'Event',
|
|
77
|
+
LogType: 'Tail',
|
|
78
|
+
Payload: JSON.stringify(newEvent),
|
|
79
|
+
})
|
|
80
|
+
.promise();
|
|
81
|
+
await (0, aws_lambda_utils_1.sleep)(50);
|
|
82
|
+
}
|
|
62
83
|
}
|
|
63
84
|
};
|
|
64
85
|
//# sourceMappingURL=_build-aggregated-stats.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_build-aggregated-stats.js","sourceRoot":"","sources":["../../../../src/solo/final-stats/cards/_build-aggregated-stats.ts"],"names":[],"mappings":";;;;;;AAAA,qEAAwG;AACxG,iEAA+D;AAE/D,sDAA0B;AAI1B,gEAAgF;AAChF,yCAAyC;AACzC,mDAAiD;AAEjD,MAAM,QAAQ,GAAG,IAAI,gCAAe,EAAE,CAAC;AAC1B,QAAA,EAAE,GAAG,IAAI,qBAAE,EAAE,CAAC;AAC3B,MAAM,MAAM,GAAG,IAAI,iBAAG,CAAC,MAAM,EAAE,CAAC;AAEhC,MAAM,aAAa,GAA0B,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AACvF,QAAA,cAAc,GAAmC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAEnF,kBAAe,KAAK,EAAE,KAAK,EAAE,OAAgB,EAAgB,EAAE;IAC9D,MAAM,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IAEnC,IAAI,
|
|
1
|
+
{"version":3,"file":"_build-aggregated-stats.js","sourceRoot":"","sources":["../../../../src/solo/final-stats/cards/_build-aggregated-stats.ts"],"names":[],"mappings":"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","sourcesContent":["import { S3, getLastBattlegroundsPatch, logBeforeTimeout, sleep } from '@firestone-hs/aws-lambda-utils';\r\nimport { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { Context } from 'aws-lambda';\r\nimport AWS from 'aws-sdk';\r\nimport { InternalBgsCardStats } from '../../../internal-model';\r\nimport { BgsCardStat } from '../../../model-cards';\r\nimport { MmrPercentileFilter, TimePeriod } from '../../../models';\r\nimport { loadHourlyDataWithDaysFromS3 } from '../../aggregate-hourly/s3-loader';\r\nimport { persistData } from './s3-saver';\r\nimport { buildCardStats } from './stats-builder';\r\n\r\nconst allCards = new AllCardsService();\r\nexport const s3 = new S3();\r\nconst lambda = new AWS.Lambda();\r\n\r\nconst allTimePeriod: readonly TimePeriod[] = ['all-time', 'past-three', 'past-seven', 'last-patch'];\r\nexport const mmrPercentiles: readonly MmrPercentileFilter[] = [100, 50, 25, 10, 1];\r\n\r\nexport default async (event, context: Context): Promise<any> => {\r\n\tawait allCards.initializeCardsDb();\r\n\r\n\tif (event.timePeriod == null) {\r\n\t\tawait dispatchEvents(context);\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst cleanup = logBeforeTimeout(context);\r\n\tconst timePeriod: TimePeriod = event.timePeriod;\r\n\tconst mmrPercentile: MmrPercentileFilter | null = event.mmrPercentile;\r\n\r\n\tconsole.log('aggregating cards data', timePeriod, mmrPercentile);\r\n\t// Build the list of files based on the timeframe, and load all of these\r\n\tconst patchInfo = await getLastBattlegroundsPatch();\r\n\r\n\t// Legacy\r\n\tif (mmrPercentile == null) {\r\n\t\tconst allHourlyData: readonly InternalBgsCardStats[] = (\r\n\t\t\tawait Promise.all(\r\n\t\t\t\tmmrPercentiles.map((mmrPercentile) =>\r\n\t\t\t\t\tloadHourlyDataWithDaysFromS3('card', timePeriod, mmrPercentile, patchInfo),\r\n\t\t\t\t),\r\n\t\t\t)\r\n\t\t).flat();\r\n\t\tconst lastUpdate = allHourlyData\r\n\t\t\t.map((d) => ({\r\n\t\t\t\tdate: new Date(d.lastUpdateDate),\r\n\t\t\t\tdateStr: d.lastUpdateDate,\r\n\t\t\t\ttime: new Date(d.lastUpdateDate).getTime(),\r\n\t\t\t}))\r\n\t\t\t.sort((a, b) => b.time - a.time)[0].date;\r\n\t\tconst mergedStats: readonly BgsCardStat[] = buildCardStats(allHourlyData, allCards);\r\n\t\tconst totalGames = allHourlyData.map((s) => s.dataPoints).reduce((a, b) => a + b, 0);\r\n\t\tawait persistData(mergedStats, mmrPercentile, timePeriod, totalGames, lastUpdate);\r\n\t\tcleanup();\r\n\t}\r\n\t// Split by MMR in each file\r\n\telse {\r\n\t\tconst hourlyDataForMmr = await loadHourlyDataWithDaysFromS3('card', timePeriod, mmrPercentile, patchInfo);\r\n\t\tconsole.debug(\r\n\t\t\t'games played',\r\n\t\t\thourlyDataForMmr.map((s) => s.dataPoints),\r\n\t\t);\r\n\t\tconst lastUpdate = hourlyDataForMmr\r\n\t\t\t.map((d) => ({\r\n\t\t\t\tdate: new Date(d.lastUpdateDate),\r\n\t\t\t\tdateStr: d.lastUpdateDate,\r\n\t\t\t\ttime: new Date(d.lastUpdateDate).getTime(),\r\n\t\t\t}))\r\n\t\t\t.sort((a, b) => b.time - a.time)[0].date;\r\n\t\tconst mergedStatsForMmr: readonly BgsCardStat[] = buildCardStats(hourlyDataForMmr, allCards);\r\n\t\tconst totalGames = hourlyDataForMmr.map((s) => s.dataPoints).reduce((a, b) => a + b, 0);\r\n\t\tawait persistData(mergedStatsForMmr, mmrPercentile, timePeriod, totalGames, lastUpdate);\r\n\t\tcleanup();\r\n\t}\r\n};\r\n\r\nconst dispatchEvents = async (context: Context) => {\r\n\tfor (const timePeriod of allTimePeriod) {\r\n\t\tfor (const mmrPercentile of [null, ...mmrPercentiles]) {\r\n\t\t\tconsole.log('dispatching event', timePeriod, mmrPercentile);\r\n\t\t\tconst newEvent = {\r\n\t\t\t\ttimePeriod: timePeriod,\r\n\t\t\t\tmmrPercentile: mmrPercentile,\r\n\t\t\t};\r\n\t\t\tconst params = {\r\n\t\t\t\tFunctionName: context.functionName,\r\n\t\t\t\tInvocationType: 'Event',\r\n\t\t\t\tLogType: 'Tail',\r\n\t\t\t\tPayload: JSON.stringify(newEvent),\r\n\t\t\t};\r\n\t\t\t// console.log('\\tinvoking lambda', params);\r\n\t\t\tconst result = await lambda\r\n\t\t\t\t.invoke({\r\n\t\t\t\t\tFunctionName: context.functionName,\r\n\t\t\t\t\tInvocationType: 'Event',\r\n\t\t\t\t\tLogType: 'Tail',\r\n\t\t\t\t\tPayload: JSON.stringify(newEvent),\r\n\t\t\t\t})\r\n\t\t\t\t.promise();\r\n\t\t\t// console.log('\\tinvocation result', result);\r\n\t\t\tawait sleep(50);\r\n\t\t}\r\n\t}\r\n};\r\n"]}
|