225 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 'use strict';
 | |
| 
 | |
| const arrayContains = require('./util').arrayContains;
 | |
| 
 | |
| const parseWarLog = (lineArray, war) => {
 | |
|   const stats = {
 | |
|     war: war,
 | |
|     clean: [],
 | |
|     budget: [],
 | |
|     points: [],
 | |
|     kills: [],
 | |
|     respawn: [],
 | |
|     revive: [],
 | |
|     flag: [],
 | |
|     transport: [],
 | |
|     players: []
 | |
|   };
 | |
| 
 | |
|   const addPlayersIfNotExists = (inputPlayers) => {
 | |
|     inputPlayers.forEach(player => {
 | |
|       if (player && player.name && player.fraction && !arrayContains(stats.players, player)) {
 | |
|         player['warId'] = war._id;
 | |
|         stats.players.push(player);
 | |
|       }
 | |
|     })
 | |
|   };
 | |
| 
 | |
|   lineArray.forEach(line => {
 | |
|     /**
 | |
|      * KILLS
 | |
|      */
 | |
|     if (line.includes('Abschuss') && !line.includes('Fahrzeug')) {
 | |
|       stats.clean.push(line);
 | |
|       const shooterString = line.substring(line.lastIndexOf(' von: ') + 6, line.lastIndexOf('. :OPT LOG END'));
 | |
|       const shooter = getPlayerAndFractionFromString(shooterString);
 | |
|       const targetString = line.substring(line.lastIndexOf(' || ') + 4, line.lastIndexOf(' von:'));
 | |
|       const target = getPlayerAndFractionFromString(targetString);
 | |
| 
 | |
|       stats.kills.push({
 | |
|         war: war._id,
 | |
|         time: getDateTime(line.split(' ')[5]),
 | |
|         shooter: shooter ? shooter.name : null,
 | |
|         target: target ? target.name : null,
 | |
|         friendlyFire: target && shooter ? target.fraction === shooter.fraction : false
 | |
|       });
 | |
| 
 | |
|       addPlayersIfNotExists([shooter, target]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * BUDGET
 | |
|      */
 | |
|     if (line.includes('Budget')) {
 | |
|       stats.clean.push(line);
 | |
|       const budg = line.split(' ');
 | |
|       if (line.includes('Endbudget')) {
 | |
|         stats.war['endBudgetBlufor'] = transformMoneyString(budg[11]);
 | |
|         stats.war['endBudgetOpfor'] = transformMoneyString(budg[14]);
 | |
|       } else if (line.includes('Startbudget')) {
 | |
|         stats.war.date = new Date(budg[0].substr(0, budg[0].length - 1).split('/').join('-') + 'T22:00:00.000+02:00');
 | |
|         stats.war['budgetBlufor'] = transformMoneyString(budg[11]);
 | |
|         stats.war['budgetOpfor'] = transformMoneyString(budg[14]);
 | |
|       } else {
 | |
|         stats.budget.push(getBudgetEntry(budg, war._id));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * FLAG
 | |
|      */
 | |
|     if (line.includes('Fahne')) {
 | |
|       stats.clean.push(line);
 | |
|       const playerName = line.substring(line.lastIndexOf('t von ') + 6, line.lastIndexOf(' :OPT LOG END'));
 | |
|       const flagFraction = line.includes('NATO Flagge') ? 'BLUFOR' : 'OPFOR';
 | |
|       const capture = !!line.includes('Flagge erobert');
 | |
| 
 | |
|       stats.flag.push({
 | |
|         war: war._id,
 | |
|         time: getDateTime(line.split(' ')[5]),
 | |
|         player: playerName,
 | |
|         flagFraction: flagFraction,
 | |
|         capture: capture
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * POINTS
 | |
|      */
 | |
|     if (line.includes('Punkte')) {
 | |
|       stats.clean.push(line);
 | |
|       const pt = line.split(' ');
 | |
| 
 | |
|       if (line.includes('Endpunktestand')) {
 | |
|         stats.war['ptBlufor'] = parseInt(pt[11]);
 | |
|         stats.war['ptOpfor'] = parseInt(pt[14].slice(0, -1));
 | |
|       } else {
 | |
|         stats.points.push(getPointsEntry(pt, war._id))
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * RESPAWN
 | |
|      */
 | |
|     if (line.includes('Respawn')) {
 | |
|       stats.clean.push(line);
 | |
|       const resp = line.split(' ');
 | |
|       const playerName = line.substring(line.lastIndexOf('Spieler:') + 9, line.lastIndexOf('-') - 1);
 | |
|       stats.respawn.push(getRespawnEntry(resp, playerName, war._id));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * REVIVE
 | |
|      */
 | |
|     if (line.includes('Revive')) {
 | |
|       stats.clean.push(line);
 | |
|       const stabilized = !!line.includes('stabilisiert');
 | |
|       const medicName = line.substring(line.lastIndexOf('wurde von ') + 10,
 | |
|         line.lastIndexOf(stabilized ? ' stabilisiert' : ' wiederbelebt'));
 | |
|       const medic = getPlayerAndFractionFromString(medicName);
 | |
|       const patientName = line.substring(line.lastIndexOf('|| ') + 3, line.lastIndexOf(' wurde von'));
 | |
|       const patient = getPlayerAndFractionFromString(patientName);
 | |
| 
 | |
|       stats.revive.push({
 | |
|         war: war._id,
 | |
|         time: getDateTime(line.split(' ')[5]),
 | |
|         stabilized: stabilized,
 | |
|         medic: medic.name,
 | |
|         patient: patientName
 | |
|       });
 | |
| 
 | |
|       addPlayersIfNotExists([medic, patient]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * TRANSPORT
 | |
|      */
 | |
|     if (line.includes('Transport ||')) {
 | |
|       stats.clean.push(line);
 | |
|       const driverString = line.substring(line.lastIndexOf('wurde von ') + 10, line.lastIndexOf(' eingeflogen'));
 | |
|       const driver = getPlayerAndFractionFromString(driverString);
 | |
|       const passengerString = line.substring(line.lastIndexOf('|| ') + 3, line.lastIndexOf(' wurde von'));
 | |
|       const passenger = getPlayerAndFractionFromString(passengerString);
 | |
|       const distance = parseInt(line.substring(line.lastIndexOf('eingeflogen (') + 13, line.lastIndexOf('m)') - 1));
 | |
| 
 | |
|       stats.transport.push({
 | |
|         war: war._id,
 | |
|         time: getDateTime(line.split(' ')[5]),
 | |
|         driver: driver.name,
 | |
|         passenger: passenger.name,
 | |
|         distance: distance
 | |
|       });
 | |
| 
 | |
|       addPlayersIfNotExists([driver, passenger]);
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   for (let i = 0; i < stats.players.length; i++) {
 | |
|     const playerName = stats.players[i].name;
 | |
|     stats.players[i]['respawn'] = stats.respawn.filter(res => res.player === playerName).length;
 | |
|     stats.players[i]['kill'] = stats.kills.filter(kill => kill.shooter === playerName && !kill.friendlyFire).length;
 | |
|     stats.players[i]['friendlyFire'] = stats.kills.filter(kill => kill.shooter === playerName && kill.friendlyFire).length;
 | |
|     stats.players[i]['death'] = stats.kills.filter(kill => kill.target === playerName).length;
 | |
|     stats.players[i]['revive'] = stats.revive.filter(rev => rev.medic === playerName && !rev.stabilized).length;
 | |
|     stats.players[i]['flagTouch'] = stats.flag.filter(flag => flag.player === playerName).length;
 | |
|   }
 | |
| 
 | |
|   stats.war.playersBlufor = stats.players.filter(player => player.fraction === 'BLUFOR').length;
 | |
|   stats.war.playersOpfor = stats.players.filter(player => player.fraction === 'OPFOR').length;
 | |
| 
 | |
|   return stats;
 | |
| };
 | |
| 
 | |
| const getRespawnEntry = (respawn, playerName, warId) => {
 | |
|   return {
 | |
|     war: warId,
 | |
|     time: getDateTime(respawn[5]),
 | |
|     player: playerName
 | |
|   }
 | |
| };
 | |
| 
 | |
| const getPointsEntry = (pt, warId) => {
 | |
|   return {
 | |
|     warId: warId,
 | |
|     time: getDateTime(pt[5]),
 | |
|     ptBlufor: parseInt(pt[12]),
 | |
|     ptOpfor: parseInt(pt[15].slice(0, -1))
 | |
|   }
 | |
| };
 | |
| 
 | |
| const getBudgetEntry = (budg, warId) => {
 | |
|   return {
 | |
|     warId: warId,
 | |
|     time: getDateTime(budg[5]),
 | |
|     fraction: budg[9] === 'NATO' ? 'BLUFOR' : 'OPFOR',
 | |
|     oldBudget: transformMoneyString(budg[11]),
 | |
|     newBudget: transformMoneyString(budg[14])
 | |
|   }
 | |
| };
 | |
| 
 | |
| const getPlayerAndFractionFromString = (nameAndFractionString) => {
 | |
|   const nameArray = nameAndFractionString.split(' ');
 | |
|   const fraction = nameArray[nameArray.length - 1] !== '(ENEMY)' ? nameArray[nameArray.length - 1] === '(WEST)' ? 'BLUFOR' : 'OPFOR' : undefined;
 | |
|   const name = nameAndFractionString.substring(0, nameAndFractionString.indexOf(nameArray[nameArray.length - 1]) - 1);
 | |
|   // do not return player for 'Selbstverschulden'
 | |
|   if (name && name !== 'Error: No unit') {
 | |
|     return {name: name, fraction: fraction};
 | |
|   }
 | |
| };
 | |
| 
 | |
| const transformMoneyString = (budgetString) => {
 | |
|   if (!budgetString.includes('e+')) {
 | |
|     return parseInt(budgetString);
 | |
|   }
 | |
|   const budget = budgetString.split('e+');
 | |
|   return Math.round(parseFloat(budget[0]) * Math.pow(10, parseInt(budget[1])));
 | |
| 
 | |
| };
 | |
| 
 | |
| const getDateTime = (timeString) => {
 | |
|   const timeZone = 'Z';
 | |
|   return new Date('1999-01-01T0' + timeString + timeZone);
 | |
| };
 | |
| 
 | |
| module.exports = parseWarLog;
 |