diff --git a/server/routes/players.js b/server/routes/players.js index 3ec0610..fd2bd23 100644 --- a/server/routes/players.js +++ b/server/routes/players.js @@ -26,92 +26,100 @@ campaignPlayer.route('/ranking/:campaignId') const warIds = wars.map((obj) => { return obj._id; }); - PlayerModel.find({warId: {'$in': warIds}}, (err, items) => { - if (err) return next(err); - if (!items || items.length === 0) { - const err = new Error('No players for given campaignId'); - err.status = codes.notfound; - return next(err); - } - - const rankingItems = []; - - // check only first player to have valid steamUUID - then decide if tracked by name or by ID - const usesUUID = isSteamUUID(items[0].steamUUID); - - new Set(items.map(usesUUID ? (x) => x.steamUUID : (x) => x.name)) - .forEach((player) => { - const playerInstances = items.filter( - usesUUID ? (p) => p.steamUUID === player : (p) => p.name === player); - const resItem = { - name: usesUUID ? playerInstances[playerInstances.length - 1].name : player, - kill: 0, - vehicleLight: 0, - vehicleHeavy: 0, - vehicleAir: 0, - death: 0, - friendlyFire: 0, - revive: 0, - respawn: 0, - flagTouch: 0, - travelDistance: 0, - driverDistance: 0, - }; - for (let i = 0; i < playerInstances.length; i++) { - const player = playerInstances[i]; - resItem.kill += player.kill; - resItem.death += player.death; - resItem.friendlyFire += player.friendlyFire; - resItem.vehicleLight += player.vehicleLight; - resItem.vehicleHeavy += player.vehicleHeavy; - resItem.vehicleAir += player.vehicleAir; - resItem.revive += player.revive; - resItem.respawn += player.respawn; - resItem.flagTouch += player.flagTouch; - if (player.travelDistance) { - resItem.travelDistance += Math.round(player.travelDistance / 1000); // meters -> km - } - if (player.driverDistance) { - resItem.driverDistance += Math.round(player.driverDistance / 1000); // meters -> km - } - } - resItem.warCount = playerInstances.length; - resItem.fraction = playerInstances[playerInstances.length - 1].fraction; - rankingItems.push(resItem); - }); - - const getSortedField = (fieldName) => { - let num = 1; - const filteredSortResult = rankingItems.map((item) => { - return { - name: item.name, - fraction: item.fraction, - [fieldName]: item[fieldName], - }; - }) - .sort((a, b) => b[fieldName] - a[fieldName]); - const res = JSON.parse(JSON.stringify(filteredSortResult)); - for (const entity of res) { - entity.num = num++; + WarModel.findOne({campaign: req.params.campaignId}, {}, {sort: {'date': -1}}, (err, latestWar) => { + PlayerModel.find({warId: {'$in': warIds}}, (err, items) => { + if (err) return next(err); + if (!items || items.length === 0) { + const err = new Error('No players for given campaignId'); + err.status = codes.notfound; + return next(err); } - return res; - }; - res.locals.items = { - kill: getSortedField('kill'), - death: getSortedField('death'), - friendlyFire: getSortedField('friendlyFire'), - vehicleLight: getSortedField('vehicleLight'), - vehicleHeavy: getSortedField('vehicleHeavy'), - vehicleAir: getSortedField('vehicleAir'), - revive: getSortedField('revive'), - respawn: getSortedField('respawn'), - flagTouch: getSortedField('flagTouch'), - travelDistance: getSortedField('travelDistance'), - driverDistance: getSortedField('driverDistance'), - warCount: getSortedField('warCount'), - }; - next(); + const rankingItems = []; + + // check only first player to have valid steamUUID - then decide if tracked by name or by ID + const usesUUID = isSteamUUID(items[0].steamUUID); + + new Set(items.map(usesUUID ? (x) => x.steamUUID : (x) => x.name)) + .forEach((player) => { + const playerInstances = items.filter( + usesUUID ? (p) => p.steamUUID === player : (p) => p.name === player); + const resItem = { + name: usesUUID ? playerInstances[playerInstances.length - 1].name : player, + kill: 0, + vehicleLight: 0, + vehicleHeavy: 0, + vehicleAir: 0, + death: 0, + friendlyFire: 0, + revive: 0, + respawn: 0, + flagTouch: 0, + travelDistance: 0, + driverDistance: 0, + }; + for (let i = 0; i < playerInstances.length; i++) { + const player = playerInstances[i]; + resItem.kill += player.kill; + resItem.death += player.death; + resItem.friendlyFire += player.friendlyFire; + resItem.vehicleLight += player.vehicleLight; + resItem.vehicleHeavy += player.vehicleHeavy; + resItem.vehicleAir += player.vehicleAir; + resItem.revive += player.revive; + resItem.respawn += player.respawn; + resItem.flagTouch += player.flagTouch; + if (player.travelDistance) { + resItem.travelDistance += Math.round(player.travelDistance / 1000); // meters -> km + } + if (player.driverDistance) { + resItem.driverDistance += Math.round(player.driverDistance / 1000); // meters -> km + } + } + resItem.warCount = playerInstances.length; + + const latestPlayerFraction = playerInstances[playerInstances.length - 1].fraction; + resItem.fraction = + (latestPlayerFraction === 'OPFOR') ? + latestWar.fractionMappingOpfor : + latestWar.fractionMappingBlufor; + + rankingItems.push(resItem); + }); + + const getSortedField = (fieldName) => { + let num = 1; + const filteredSortResult = rankingItems.map((item) => { + return { + name: item.name, + fraction: item.fraction, + [fieldName]: item[fieldName], + }; + }) + .sort((a, b) => b[fieldName] - a[fieldName]); + const res = JSON.parse(JSON.stringify(filteredSortResult)); + for (const entity of res) { + entity.num = num++; + } + return res; + }; + + res.locals.items = { + kill: getSortedField('kill'), + death: getSortedField('death'), + friendlyFire: getSortedField('friendlyFire'), + vehicleLight: getSortedField('vehicleLight'), + vehicleHeavy: getSortedField('vehicleHeavy'), + vehicleAir: getSortedField('vehicleAir'), + revive: getSortedField('revive'), + respawn: getSortedField('respawn'), + flagTouch: getSortedField('flagTouch'), + travelDistance: getSortedField('travelDistance'), + driverDistance: getSortedField('driverDistance'), + warCount: getSortedField('warCount'), + }; + next(); + }); }); }); }) diff --git a/static/src/app/statistic/campaign/highscore/highscore.component.html b/static/src/app/statistic/campaign/highscore/highscore.component.html index 6992cc8..05aae0e 100644 --- a/static/src/app/statistic/campaign/highscore/highscore.component.html +++ b/static/src/app/statistic/campaign/highscore/highscore.component.html @@ -28,7 +28,7 @@ {{'stats.highscore.header.name' | translate}} + [style.color]="fractionHelpers.getFractionColor(element['fraction'])"> {{element.name}} diff --git a/static/src/app/statistic/campaign/highscore/highscore.component.ts b/static/src/app/statistic/campaign/highscore/highscore.component.ts index 26d5509..944d3b0 100644 --- a/static/src/app/statistic/campaign/highscore/highscore.component.ts +++ b/static/src/app/statistic/campaign/highscore/highscore.component.ts @@ -1,11 +1,11 @@ import {Component, OnInit} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {PlayerService} from '../../../services/logs/player.service'; -import {Fraction} from '../../../utils/fraction.enum'; import {FormControl} from '@angular/forms'; import {Observable} from 'rxjs/Observable'; import {Player} from '../../../models/model-interfaces'; import {PlayerUtils} from '../../../utils/player-utils'; +import {FractionHelpers} from '../../../utils/global.helpers'; @Component({ @@ -25,7 +25,7 @@ export class StatisticHighScoreComponent implements OnInit { playerAttributeDisplayNames = PlayerUtils.attributeDisplayNames.slice(2, PlayerUtils.attributeDisplayNames.length); - readonly fraction = Fraction; + readonly fractionHelpers = FractionHelpers; constructor(private route: ActivatedRoute, private playerService: PlayerService) { diff --git a/static/src/app/statistic/war/fraction-stats/fraction-stats.component.ts b/static/src/app/statistic/war/fraction-stats/fraction-stats.component.ts index 493ef30..c24543d 100644 --- a/static/src/app/statistic/war/fraction-stats/fraction-stats.component.ts +++ b/static/src/app/statistic/war/fraction-stats/fraction-stats.component.ts @@ -1,6 +1,5 @@ import {Component, ElementRef, Input, OnChanges, OnInit, SimpleChanges, ViewChild} from '@angular/core'; import {ChartUtils} from '../../../utils/chart-utils'; -import {Fraction} from '../../../utils/fraction.enum'; import {War} from '../../../models/model-interfaces'; import {TranslateService} from '@ngx-translate/core'; import {FractionHelpers} from '../../../utils/global.helpers'; @@ -79,14 +78,14 @@ export class FractionStatsComponent implements OnInit, OnChanges { this.fractionNameOpfor = FractionHelpers.getFractionName(this.war, 'OPFOR'); this.colorScheme = { domain: [ - FractionHelpers.getFractionColor(this.war, 'BLUFOR'), - FractionHelpers.getFractionColor(this.war, 'OPFOR'), - FractionHelpers.getFractionColor(this.war, 'BLUFOR', 'LIGHT'), - FractionHelpers.getFractionColor(this.war, 'OPFOR', 'LIGHT'), - FractionHelpers.getFractionColor(this.war, 'BLUFOR', 'DARK'), - FractionHelpers.getFractionColor(this.war, 'OPFOR', 'DARK'), - FractionHelpers.getFractionColor(this.war, 'BLUFOR', 'GREY'), - FractionHelpers.getFractionColor(this.war, 'OPFOR', 'GREY'), + FractionHelpers.getFractionColor('BLUFOR', this.war), + FractionHelpers.getFractionColor('OPFOR', this.war), + FractionHelpers.getFractionColor('BLUFOR', this.war, 'LIGHT'), + FractionHelpers.getFractionColor('OPFOR', this.war, 'LIGHT'), + FractionHelpers.getFractionColor('BLUFOR', this.war, 'DARK'), + FractionHelpers.getFractionColor('OPFOR', this.war, 'DARK'), + FractionHelpers.getFractionColor('BLUFOR', this.war, 'GREY'), + FractionHelpers.getFractionColor('OPFOR', this.war, 'GREY'), ] }; diff --git a/static/src/app/statistic/war/scoreboard/scoreboard.component.html b/static/src/app/statistic/war/scoreboard/scoreboard.component.html index 02fa4e2..74f4d40 100644 --- a/static/src/app/statistic/war/scoreboard/scoreboard.component.html +++ b/static/src/app/statistic/war/scoreboard/scoreboard.component.html @@ -8,7 +8,7 @@ {{tableHead[0].head | translate}} + [style.color]="fractionHelpers.getFractionColor(element['fraction'],war)"> {{element.name}} diff --git a/static/src/app/statistic/war/war-header/war-header.component.html b/static/src/app/statistic/war/war-header/war-header.component.html index 3767cd1..1bcb15f 100644 --- a/static/src/app/statistic/war/war-header/war-header.component.html +++ b/static/src/app/statistic/war/war-header/war-header.component.html @@ -2,12 +2,12 @@

{{'stats.scoreboard.standings' | translate}}

- {{fractionHelpers.getFractionName(war, 'BLUFOR')}} {{war.ptBlufor}} | - {{war.ptOpfor}} {{fractionHelpers.getFractionName(war, 'OPFOR')}} @@ -15,12 +15,12 @@

{{'stats.scoreboard.participants' | translate}}

- {{fractionHelpers.getFractionName(war, 'BLUFOR')}} {{war.playersBlufor}} vs - {{war.playersOpfor}} {{fractionHelpers.getFractionName(war, 'OPFOR')}} diff --git a/static/src/app/statistic/war/war-header/war-header.component.ts b/static/src/app/statistic/war/war-header/war-header.component.ts index 024769e..25cb8c8 100644 --- a/static/src/app/statistic/war/war-header/war-header.component.ts +++ b/static/src/app/statistic/war/war-header/war-header.component.ts @@ -67,8 +67,8 @@ export class WarHeaderComponent implements OnInit { this.colorScheme = { domain: [ - FractionHelpers.getFractionColor(war, 'OPFOR'), - FractionHelpers.getFractionColor(war, 'BLUFOR') + FractionHelpers.getFractionColor('OPFOR', war), + FractionHelpers.getFractionColor('BLUFOR', war) ] }; diff --git a/static/src/app/utils/global.helpers.ts b/static/src/app/utils/global.helpers.ts index 9f8c8cf..aaa346f 100644 --- a/static/src/app/utils/global.helpers.ts +++ b/static/src/app/utils/global.helpers.ts @@ -13,8 +13,15 @@ export const CSSHelpers = { }; export const FractionHelpers = { - getFractionColor: (war: War, fraction, style?) => { - switch (fraction === 'BLUFOR' ? war.fractionMappingBlufor : war.fractionMappingOpfor) { + getFractionColor: (fraction, war?: War, style?) => { + let switchInput; + if (war) { + switchInput = (fraction === 'BLUFOR' ? war.fractionMappingBlufor : war.fractionMappingOpfor); + } else { + switchInput = fraction; + } + + switch (switchInput) { case Fraction.ARF: switch (style) { case 'LIGHT':