@firestone-hs/bgs-global-stats 1.0.49 → 1.0.50
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/model-cards.d.ts +2 -0
- package/dist/model-cards.js.map +1 -1
- package/dist/solo/final-stats/cards/stats-builder.js +7 -0
- package/dist/solo/final-stats/cards/stats-builder.js.map +1 -1
- package/dist/solo/hourly/cards/card-stats-builder.js +3 -3
- package/dist/solo/hourly/cards/card-stats-builder.js.map +1 -1
- package/package.json +1 -1
package/dist/model-cards.d.ts
CHANGED
|
@@ -35,6 +35,8 @@ export interface BgsCardTurnStat {
|
|
|
35
35
|
readonly turn: number;
|
|
36
36
|
readonly totalPlayedAtTurn: number;
|
|
37
37
|
readonly averagePlacement: number;
|
|
38
|
+
readonly totalPlayedAtTurnOther: number;
|
|
39
|
+
readonly averagePlacementOther: number;
|
|
38
40
|
readonly averagePlacementAtMmr: readonly {
|
|
39
41
|
mmr: number;
|
|
40
42
|
placement: number;
|
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\treadonly averagePlacementAtMmr: readonly {\r\n\t\tmmr: number;\r\n\t\tplacement: number;\r\n\t}[];\r\n\treadonly averagePlacementAtMmrOther: readonly {\r\n\t\tmmr: number;\r\n\t\tplacement: number;\r\n\t}[];\r\n\treadonly turnStats: readonly BgsCardTurnStat[];\r\n\treadonly 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\treadonly averagePlacementAtMmr: readonly {\r\n\t\tmmr: number;\r\n\t\tplacement: number;\r\n\t}[];\r\n\treadonly turnStats: readonly BgsCardTurnStat[];\r\n}\r\n\r\nexport interface BgsCardTurnStat {\r\n\treadonly turn: number;\r\n\treadonly totalPlayedAtTurn: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly averagePlacementAtMmr: readonly {\r\n\t\tmmr: number;\r\n\t\tplacement: number;\r\n\t}[];\r\n}\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\treadonly averagePlacementAtMmr: readonly {\r\n\t\tmmr: number;\r\n\t\tplacement: number;\r\n\t}[];\r\n\treadonly averagePlacementAtMmrOther: readonly {\r\n\t\tmmr: number;\r\n\t\tplacement: number;\r\n\t}[];\r\n\treadonly turnStats: readonly BgsCardTurnStat[];\r\n\treadonly 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\treadonly averagePlacementAtMmr: readonly {\r\n\t\tmmr: number;\r\n\t\tplacement: number;\r\n\t}[];\r\n\treadonly turnStats: readonly BgsCardTurnStat[];\r\n}\r\n\r\nexport interface BgsCardTurnStat {\r\n\treadonly turn: number;\r\n\treadonly totalPlayedAtTurn: number;\r\n\treadonly averagePlacement: number;\r\n\treadonly totalPlayedAtTurnOther: number;\r\n\treadonly averagePlacementOther: number;\r\n\treadonly averagePlacementAtMmr: readonly {\r\n\t\tmmr: number;\r\n\t\tplacement: number;\r\n\t}[];\r\n}\r\n"]}
|
|
@@ -60,15 +60,22 @@ const buildTurnStats = (data) => {
|
|
|
60
60
|
return Object.keys(groupedByTurn).map((turn) => {
|
|
61
61
|
const relevantData = groupedByTurn[turn];
|
|
62
62
|
const totalPlayed = relevantData.map((d) => d.totalPlayedAtTurn).reduce((a, b) => a + b, 0);
|
|
63
|
+
const totalPlayedOther = relevantData.map((d) => d.totalPlayedAtTurnOther).reduce((a, b) => a + b, 0);
|
|
63
64
|
const totalPlacement = relevantData
|
|
64
65
|
.map((d) => d.totalPlayedAtTurn * d.averagePlacement)
|
|
65
66
|
.reduce((a, b) => a + b, 0);
|
|
67
|
+
const totalPlacementOther = relevantData
|
|
68
|
+
.map((d) => d.totalPlayedAtTurnOther * d.averagePlacementOther)
|
|
69
|
+
.reduce((a, b) => a + b, 0);
|
|
66
70
|
const averagePlacement = totalPlacement / totalPlayed;
|
|
71
|
+
const averagePlacementOther = totalPlacementOther / totalPlayedOther;
|
|
67
72
|
const averagePlacementAtMmr = [];
|
|
68
73
|
const turnResult = {
|
|
69
74
|
turn: parseInt(turn),
|
|
70
75
|
totalPlayedAtTurn: totalPlayed,
|
|
71
76
|
averagePlacement: averagePlacement,
|
|
77
|
+
totalPlayedAtTurnOther: totalPlayedOther,
|
|
78
|
+
averagePlacementOther: averagePlacementOther,
|
|
72
79
|
averagePlacementAtMmr: averagePlacementAtMmr,
|
|
73
80
|
};
|
|
74
81
|
return turnResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats-builder.js","sourceRoot":"","sources":["../../../../src/solo/final-stats/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 {\r\n\tInternalBgsCardHeroStat,\r\n\tInternalBgsCardStat,\r\n\tInternalBgsCardStats,\r\n\tInternalBgsCardTurnStat,\r\n} from '../../../internal-model';\r\nimport { BgsCardHeroStat, BgsCardStat, BgsCardTurnStat } from '../../../model-cards';\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 BgsCardStat[] => {\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): BgsCardStat => {\r\n\tconst ref = data[0];\r\n\tconst totalPlayed = data.map((d) => d.totalPlayed).reduce((a, b) => a + b, 0);\r\n\tconst totalPlacement = data.map((d) => d.totalPlayed * d.averagePlacement).reduce((a, b) => a + b, 0);\r\n\tconst totalOther = data.map((d) => d.totalOther).reduce((a, b) => a + b, 0);\r\n\tconst totalPlacementOther = data.map((d) => d.totalOther * d.averagePlacementOther).reduce((a, b) => a + b, 0);\r\n\tconst averagePlacement = totalPlacement / totalPlayed;\r\n\tconst averagePlacementOther = totalPlacementOther / totalOther;\r\n\tconst averagePlacementAtMmr: BgsCardStat['averagePlacementAtMmr'] = buildAveragePlacementAtMmr(data);\r\n\tconst averagePlacementAtMmrOther: BgsCardStat['averagePlacementAtMmrOther'] = buildAveragePlacementAtMmrOther(data);\r\n\tconst turnStats: readonly BgsCardTurnStat[] = buildTurnStats(data);\r\n\tconst heroStats: readonly BgsCardHeroStat[] = buildHeroStats(data);\r\n\r\n\tconst result: BgsCardStat = {\r\n\t\tcardId: ref.cardId,\r\n\t\ttotalPlayed: totalPlayed,\r\n\t\taveragePlacement: averagePlacement,\r\n\t\taveragePlacementOther: averagePlacementOther,\r\n\t\taveragePlacementAtMmr: averagePlacementAtMmr,\r\n\t\taveragePlacementAtMmrOther: averagePlacementAtMmrOther,\r\n\t\tturnStats: turnStats,\r\n\t\theroStats: heroStats,\r\n\t};\r\n\treturn result;\r\n};\r\n\r\nconst buildHeroStats = (data: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[]): readonly BgsCardHeroStat[] => {\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 averagePlacementAtMmr = [];\r\n\t\tconst turnStats = buildTurnStats(relevantData);\r\n\t\tconst heroResult: BgsCardHeroStat = {\r\n\t\t\theroCardId: heroCardId,\r\n\t\t\ttotalPlayedWithHero: totalPlayed,\r\n\t\t\taveragePlacement: averagePlacement,\r\n\t\t\taveragePlacementAtMmr: averagePlacementAtMmr,\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 BgsCardTurnStat[] => {\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\t\tconst totalPlayed = relevantData.map((d) => d.totalPlayedAtTurn).reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacement = relevantData\r\n\t\t\t.map((d) => d.totalPlayedAtTurn * d.averagePlacement)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst averagePlacement = totalPlacement / totalPlayed;\r\n\t\tconst averagePlacementAtMmr = [];\r\n\t\tconst turnResult: BgsCardTurnStat = {\r\n\t\t\tturn: parseInt(turn),\r\n\t\t\ttotalPlayedAtTurn: totalPlayed,\r\n\t\t\taveragePlacement: averagePlacement,\r\n\t\t\taveragePlacementAtMmr: averagePlacementAtMmr,\r\n\t\t};\r\n\t\treturn turnResult;\r\n\t});\r\n};\r\n\r\nconst buildAveragePlacementAtMmr = (\r\n\tdata: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[],\r\n): BgsCardStat['averagePlacementAtMmr'] => {\r\n\tconst groupedByMmr = groupByFunction((data: WithMmrAndTimePeriod<InternalBgsCardStat>) => data.mmrPercentile)(data);\r\n\tconst result: BgsCardStat['averagePlacementAtMmr'] = Object.keys(groupedByMmr).map((mmr) => {\r\n\t\tconst relevantData = groupedByMmr[mmr];\r\n\t\tconst totalPlayed = relevantData.map((d) => d.totalPlayed).reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacement = relevantData.map((d) => d.totalPlayed * d.averagePlacement).reduce((a, b) => a + b, 0);\r\n\t\tconst averagePlacement = totalPlacement / totalPlayed;\r\n\t\tconst mmrResult: { mmr: number; placement: number } = {\r\n\t\t\tmmr: parseInt(mmr),\r\n\t\t\tplacement: averagePlacement,\r\n\t\t};\r\n\t\treturn mmrResult;\r\n\t});\r\n\treturn result;\r\n};\r\n\r\nconst buildAveragePlacementAtMmrOther = (\r\n\tdata: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[],\r\n): BgsCardStat['averagePlacementAtMmrOther'] => {\r\n\tconst groupedByMmr = groupByFunction((data: WithMmrAndTimePeriod<InternalBgsCardStat>) => data.mmrPercentile)(data);\r\n\tconst result: BgsCardStat['averagePlacementAtMmrOther'] = Object.keys(groupedByMmr).map((mmr) => {\r\n\t\tconst relevantData = groupedByMmr[mmr];\r\n\t\tconst totalPlayed = relevantData.map((d) => d.totalOther).reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacement = relevantData\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 averagePlacement = totalPlacement / totalPlayed;\r\n\t\tconst mmrResult: { mmr: number; placement: number } = {\r\n\t\t\tmmr: parseInt(mmr),\r\n\t\t\tplacement: averagePlacement,\r\n\t\t};\r\n\t\treturn mmrResult;\r\n\t});\r\n\treturn result;\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"stats-builder.js","sourceRoot":"","sources":["../../../../src/solo/final-stats/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 {\r\n\tInternalBgsCardHeroStat,\r\n\tInternalBgsCardStat,\r\n\tInternalBgsCardStats,\r\n\tInternalBgsCardTurnStat,\r\n} from '../../../internal-model';\r\nimport { BgsCardHeroStat, BgsCardStat, BgsCardTurnStat } from '../../../model-cards';\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 BgsCardStat[] => {\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): BgsCardStat => {\r\n\tconst ref = data[0];\r\n\tconst totalPlayed = data.map((d) => d.totalPlayed).reduce((a, b) => a + b, 0);\r\n\tconst totalPlacement = data.map((d) => d.totalPlayed * d.averagePlacement).reduce((a, b) => a + b, 0);\r\n\tconst totalOther = data.map((d) => d.totalOther).reduce((a, b) => a + b, 0);\r\n\tconst totalPlacementOther = data.map((d) => d.totalOther * d.averagePlacementOther).reduce((a, b) => a + b, 0);\r\n\tconst averagePlacement = totalPlacement / totalPlayed;\r\n\tconst averagePlacementOther = totalPlacementOther / totalOther;\r\n\tconst averagePlacementAtMmr: BgsCardStat['averagePlacementAtMmr'] = buildAveragePlacementAtMmr(data);\r\n\tconst averagePlacementAtMmrOther: BgsCardStat['averagePlacementAtMmrOther'] = buildAveragePlacementAtMmrOther(data);\r\n\tconst turnStats: readonly BgsCardTurnStat[] = buildTurnStats(data);\r\n\tconst heroStats: readonly BgsCardHeroStat[] = buildHeroStats(data);\r\n\r\n\tconst result: BgsCardStat = {\r\n\t\tcardId: ref.cardId,\r\n\t\ttotalPlayed: totalPlayed,\r\n\t\taveragePlacement: averagePlacement,\r\n\t\taveragePlacementOther: averagePlacementOther,\r\n\t\taveragePlacementAtMmr: averagePlacementAtMmr,\r\n\t\taveragePlacementAtMmrOther: averagePlacementAtMmrOther,\r\n\t\tturnStats: turnStats,\r\n\t\theroStats: heroStats,\r\n\t};\r\n\treturn result;\r\n};\r\n\r\nconst buildHeroStats = (data: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[]): readonly BgsCardHeroStat[] => {\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 averagePlacementAtMmr = [];\r\n\t\tconst turnStats = buildTurnStats(relevantData);\r\n\t\tconst heroResult: BgsCardHeroStat = {\r\n\t\t\theroCardId: heroCardId,\r\n\t\t\ttotalPlayedWithHero: totalPlayed,\r\n\t\t\taveragePlacement: averagePlacement,\r\n\t\t\taveragePlacementAtMmr: averagePlacementAtMmr,\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 BgsCardTurnStat[] => {\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\t\tconst totalPlayed = relevantData.map((d) => d.totalPlayedAtTurn).reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlayedOther = relevantData.map((d) => d.totalPlayedAtTurnOther).reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacement = relevantData\r\n\t\t\t.map((d) => d.totalPlayedAtTurn * d.averagePlacement)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacementOther = relevantData\r\n\t\t\t.map((d) => d.totalPlayedAtTurnOther * d.averagePlacementOther)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst averagePlacement = totalPlacement / totalPlayed;\r\n\t\tconst averagePlacementOther = totalPlacementOther / totalPlayedOther;\r\n\t\tconst averagePlacementAtMmr = [];\r\n\t\tconst turnResult: BgsCardTurnStat = {\r\n\t\t\tturn: parseInt(turn),\r\n\t\t\ttotalPlayedAtTurn: totalPlayed,\r\n\t\t\taveragePlacement: averagePlacement,\r\n\t\t\ttotalPlayedAtTurnOther: totalPlayedOther,\r\n\t\t\taveragePlacementOther: averagePlacementOther,\r\n\t\t\taveragePlacementAtMmr: averagePlacementAtMmr,\r\n\t\t};\r\n\t\treturn turnResult;\r\n\t});\r\n};\r\n\r\nconst buildAveragePlacementAtMmr = (\r\n\tdata: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[],\r\n): BgsCardStat['averagePlacementAtMmr'] => {\r\n\tconst groupedByMmr = groupByFunction((data: WithMmrAndTimePeriod<InternalBgsCardStat>) => data.mmrPercentile)(data);\r\n\tconst result: BgsCardStat['averagePlacementAtMmr'] = Object.keys(groupedByMmr).map((mmr) => {\r\n\t\tconst relevantData = groupedByMmr[mmr];\r\n\t\tconst totalPlayed = relevantData.map((d) => d.totalPlayed).reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacement = relevantData.map((d) => d.totalPlayed * d.averagePlacement).reduce((a, b) => a + b, 0);\r\n\t\tconst averagePlacement = totalPlacement / totalPlayed;\r\n\t\tconst mmrResult: { mmr: number; placement: number } = {\r\n\t\t\tmmr: parseInt(mmr),\r\n\t\t\tplacement: averagePlacement,\r\n\t\t};\r\n\t\treturn mmrResult;\r\n\t});\r\n\treturn result;\r\n};\r\n\r\nconst buildAveragePlacementAtMmrOther = (\r\n\tdata: readonly WithMmrAndTimePeriod<InternalBgsCardStat>[],\r\n): BgsCardStat['averagePlacementAtMmrOther'] => {\r\n\tconst groupedByMmr = groupByFunction((data: WithMmrAndTimePeriod<InternalBgsCardStat>) => data.mmrPercentile)(data);\r\n\tconst result: BgsCardStat['averagePlacementAtMmrOther'] = Object.keys(groupedByMmr).map((mmr) => {\r\n\t\tconst relevantData = groupedByMmr[mmr];\r\n\t\tconst totalPlayed = relevantData.map((d) => d.totalOther).reduce((a, b) => a + b, 0);\r\n\t\tconst totalPlacement = relevantData\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 averagePlacement = totalPlacement / totalPlayed;\r\n\t\tconst mmrResult: { mmr: number; placement: number } = {\r\n\t\t\tmmr: parseInt(mmr),\r\n\t\t\tplacement: averagePlacement,\r\n\t\t};\r\n\t\treturn mmrResult;\r\n\t});\r\n\treturn result;\r\n};\r\n"]}
|
|
@@ -73,14 +73,14 @@ const buildTurnStats = (rows, otherRows) => {
|
|
|
73
73
|
return Object.keys(groupedByTurn)
|
|
74
74
|
.sort()
|
|
75
75
|
.map((turn) => {
|
|
76
|
-
var _a, _b;
|
|
77
76
|
const relevantRows = groupedByTurn[turn];
|
|
77
|
+
const relevantRowsOther = groupedByTurnOther[turn] || [];
|
|
78
78
|
const result = {
|
|
79
79
|
turn: parseInt(turn),
|
|
80
80
|
totalPlayedAtTurn: relevantRows.length,
|
|
81
81
|
averagePlacement: average(relevantRows.map((r) => r.playerRank)),
|
|
82
|
-
totalPlayedAtTurnOther:
|
|
83
|
-
averagePlacementOther: average(
|
|
82
|
+
totalPlayedAtTurnOther: relevantRowsOther.length || 0,
|
|
83
|
+
averagePlacementOther: average(relevantRowsOther.map((r) => r.playerRank) || []),
|
|
84
84
|
};
|
|
85
85
|
return result;
|
|
86
86
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-stats-builder.js","sourceRoot":"","sources":["../../../../src/solo/hourly/cards/card-stats-builder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"card-stats-builder.js","sourceRoot":"","sources":["../../../../src/solo/hourly/cards/card-stats-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { groupByFunction } from '@firestone-hs/aws-lambda-utils';\r\nimport { AllCardsService, CardIds } from '@firestone-hs/reference-data';\r\nimport {\r\n\tInternalBgsCardHeroStat,\r\n\tInternalBgsCardStat,\r\n\tInternalBgsCardTurnStat,\r\n\tInternalBgsRow,\r\n} from '../../../internal-model';\r\n\r\nexport const buildCardStatsForMmr = (\r\n\trows: readonly InternalBgsRow[],\r\n\tallCards: AllCardsService,\r\n): readonly InternalBgsCardStat[] => {\r\n\tconsole.debug('building card stats for', rows.length, 'rows');\r\n\tconst denormalized = rows.flatMap((row) => {\r\n\t\tconst cards = row.playedCardsExpanded;\r\n\t\treturn [\r\n\t\t\t...cards.map((card) => ({\r\n\t\t\t\t...row,\r\n\t\t\t\tplayedCardsExpanded: [\r\n\t\t\t\t\tallCards.getCard(card.cardId).isCoin\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...card,\r\n\t\t\t\t\t\t\t\tcardId: CardIds.TheCoinCore,\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: card,\r\n\t\t\t\t],\r\n\t\t\t})),\r\n\t\t];\r\n\t});\r\n\tconsole.debug('denormalized into', denormalized.length, 'rows');\r\n\tconst groupedByCardPlayed = groupByFunction((r: InternalBgsRow) => r.playedCardsExpanded[0].cardId)(denormalized);\r\n\treturn Object.keys(groupedByCardPlayed)\r\n\t\t.sort()\r\n\t\t.map((cardId) => {\r\n\t\t\tconst relevantRows = groupedByCardPlayed[cardId];\r\n\t\t\treturn buildStatsForSingleCard(relevantRows, denormalized);\r\n\t\t});\r\n};\r\n\r\n// All rows here belong to a single card\r\nconst buildStatsForSingleCard = (\r\n\trows: readonly InternalBgsRow[],\r\n\tallRows: readonly InternalBgsRow[],\r\n): InternalBgsCardStat => {\r\n\tconst ref = rows[0];\r\n\r\n\t// console.debug('building stats for', ref.playedCardsExpanded[0].cardId);\r\n\tconst relevantReviewIds = rows.map((r) => r.reviewId);\r\n\tconst otherRows = allRows.filter((r) => !relevantReviewIds.includes(r.reviewId));\r\n\t// console.debug('mapped other rows', ref.playedCardsExpanded[0].cardId, rows.length, otherRows.length);\r\n\tconst otherGroupedByReviewId = groupByFunction((r: InternalBgsRow) => r.reviewId)(otherRows);\r\n\t// console.debug('grouped other rows');\r\n\t// Keep only one row per reviewId\r\n\tconst finalOtherRows = Object.values(otherGroupedByReviewId).map((r) => r[0]);\r\n\t// console.debug('final other rows');\r\n\r\n\tconst averagePlacement = average(rows.map((r) => r.playerRank));\r\n\tconst averagePlacementOther = average(finalOtherRows.map((r) => r.playerRank));\r\n\t// console.debug('built averages', averagePlacement, averagePlacementOther);\r\n\tconst turnStats = buildTurnStats(rows, finalOtherRows);\r\n\t// console.debug('built turn stats');\r\n\tconst heroStats = buildHeroStats(rows, finalOtherRows);\r\n\t// console.debug('built hero stats');\r\n\r\n\tconst result: InternalBgsCardStat = {\r\n\t\tcardId: ref.playedCardsExpanded[0].cardId,\r\n\t\ttotalPlayed: rows.length,\r\n\t\taveragePlacement: averagePlacement,\r\n\t\ttotalOther: finalOtherRows.length,\r\n\t\taveragePlacementOther: averagePlacementOther,\r\n\t\tturnStats: turnStats,\r\n\t\theroStats: heroStats,\r\n\t};\r\n\treturn result;\r\n};\r\n\r\nconst buildHeroStats = (\r\n\trows: readonly InternalBgsRow[],\r\n\totherRows: readonly InternalBgsRow[],\r\n): readonly InternalBgsCardHeroStat[] => {\r\n\tconst groupedByHero = groupByFunction((r: InternalBgsRow) => r.heroCardId)(rows);\r\n\treturn Object.keys(groupedByHero)\r\n\t\t.sort()\r\n\t\t.map((heroCardId) => {\r\n\t\t\tconst relevantRows = groupedByHero[heroCardId];\r\n\t\t\tconst relevantOtherRows = otherRows.filter((r) => r.heroCardId === heroCardId);\r\n\t\t\tconst result: InternalBgsCardHeroStat = {\r\n\t\t\t\theroCardId: heroCardId,\r\n\t\t\t\ttotalPlayedWithHero: relevantRows.length,\r\n\t\t\t\taveragePlacement: average(relevantRows.map((r) => r.playerRank)),\r\n\t\t\t\tturnStats: buildTurnStats(relevantRows, relevantOtherRows),\r\n\t\t\t};\r\n\t\t\treturn result;\r\n\t\t});\r\n};\r\n\r\nconst buildTurnStats = (\r\n\trows: readonly InternalBgsRow[],\r\n\totherRows: readonly InternalBgsRow[],\r\n): readonly InternalBgsCardTurnStat[] => {\r\n\t// TODO: fix the other rows stuff\r\n\r\n\t// const relevantReviewIds = rows.map((r) => r.reviewId);\r\n\t// const otherRows = allRows.filter((r) => !relevantReviewIds.includes(r.reviewId));\r\n\t// console.debug('building stats for', ref.playedCardsExpanded[0].cardId, rows.length, otherRows.length);\r\n\t// const otherGroupedByReviewId = groupByFunction((r: InternalBgsRow) => r.reviewId)(otherRows);\r\n\t// // Keep only one row per reviewId\r\n\t// const finalOtherRows = Object.values(otherGroupedByReviewId).map((r) => r[0]);\r\n\r\n\tconst groupedByTurn = groupByFunction((r: InternalBgsRow) => r.playedCardsExpanded[0].turn)(rows);\r\n\tconst groupedByTurnOther = groupByFunction((r: InternalBgsRow) => r.playedCardsExpanded[0].turn)(otherRows);\r\n\treturn Object.keys(groupedByTurn)\r\n\t\t.sort()\r\n\t\t.map((turn) => {\r\n\t\t\tconst relevantRows = groupedByTurn[turn];\r\n\t\t\tconst relevantRowsOther = groupedByTurnOther[turn] || [];\r\n\t\t\tconst result: InternalBgsCardTurnStat = {\r\n\t\t\t\tturn: parseInt(turn),\r\n\t\t\t\ttotalPlayedAtTurn: relevantRows.length,\r\n\t\t\t\taveragePlacement: average(relevantRows.map((r) => r.playerRank)),\r\n\t\t\t\ttotalPlayedAtTurnOther: relevantRowsOther.length || 0,\r\n\t\t\t\taveragePlacementOther: average(relevantRowsOther.map((r) => r.playerRank) || []),\r\n\t\t\t};\r\n\t\t\treturn result;\r\n\t\t});\r\n};\r\n\r\nconst average = (data: readonly number[]): number => {\r\n\treturn data.reduce((a, b) => a + b, 0) / data.length;\r\n};\r\n"]}
|