From 35f6ac04b3455fa82aa8a2d149d6ccf02294e6f1 Mon Sep 17 00:00:00 2001 From: Florian Hartwich Date: Sat, 21 Oct 2017 12:11:32 +0200 Subject: [PATCH] Finish parse tool --- api/models/war.js | 32 +++++- api/routes/wars.js | 16 +-- api/tools/log-parse-tool.js | 199 ++++++++++++++++++++---------------- 3 files changed, 150 insertions(+), 97 deletions(-) diff --git a/api/models/war.js b/api/models/war.js index b89bcae..d059d44 100644 --- a/api/models/war.js +++ b/api/models/war.js @@ -10,19 +10,16 @@ const WarSchema = new Schema({ }, date: { type: Date, - required: true }, ptBlufor: { type: Number, get: v => Math.round(v), set: v => Math.round(v), - required: true }, ptOpfor: { type: Number, get: v => Math.round(v), set: v => Math.round(v), - required: true }, playersBlufor: { type: Number, @@ -38,8 +35,33 @@ const WarSchema = new Schema({ }, campaign: { type: mongoose.Schema.Types.ObjectId, - ref: 'Campaign' - } + ref: 'Campaign', + required: true + }, + budgetBlufor: { + type: Number, + get: v => Math.round(v), + set: v => Math.round(v), + default: 0 + }, + budgetOpfor: { + type: Number, + get: v => Math.round(v), + set: v => Math.round(v), + default: 0 + }, + endBudgetBlufor: { + type: Number, + get: v => Math.round(v), + set: v => Math.round(v), + default: 0 + }, + endBudgetOpfor: { + type: Number, + get: v => Math.round(v), + set: v => Math.round(v), + default: 0 + }, }, { collection: 'war', timestamps: {createdAt: 'timestamp'} diff --git a/api/routes/wars.js b/api/routes/wars.js index 33866b2..b041145 100644 --- a/api/routes/wars.js +++ b/api/routes/wars.js @@ -64,20 +64,24 @@ wars.route('/') .post(apiAuthenticationMiddleware, checkMT, upload.single('log'), (req, res, next) => { let body = req.body; - const war = new WarModel(body); + const bodyWar = new WarModel(body); if (req.file) { + // bodyWar.save((err, war) => { + // if (err) { + // return next(err); + // } fs.readFile(req.file.buffer, (file, err) => { if (err) { return next(err); } + const lineArray = file.toString().split("\n"); - parseWarLog(lineArray, {}); - + res.locals.items = parseWarLog(lineArray, bodyWar); + res.locals.processed = true; + next(); }); - res.locals.processed = true; - return next(); - + // }) } else { const err = new Error('no Logfile provided'); err.status = codes.wrongmediasend; diff --git a/api/tools/log-parse-tool.js b/api/tools/log-parse-tool.js index 77d6f2b..7bf0ef0 100644 --- a/api/tools/log-parse-tool.js +++ b/api/tools/log-parse-tool.js @@ -1,38 +1,45 @@ -"use strict"; +'use strict'; const arrayContains = require('./util').arrayContains; const parseWarLog = (lineArray, war) => { - const clean = []; - const budget = []; - const points = []; - const kills = []; - const respawn = []; - const revive = []; - const flag = []; - const transport = []; - const players = []; + const stats = { + war: war, + clean: [], + budget: [], + points: [], + kills: [], + respawn: [], + revive: [], + flag: [], + transport: [], + players: [] + }; + const addPlayersIfNotExists = (inputPlayers) => { inputPlayers.forEach(player => { - if (player && player.name !== 'Error: No unit' && !arrayContains(players, player)) { - player['warId'] = 'asd78zr3h8szfd7'; - players.push(player); + if (player && !arrayContains(stats.players, player)) { + player['warId'] = war._id; + stats.players.push(player); } }) }; lineArray.forEach(line => { - if (line.includes("Abschuss") && !line.includes('Fahrzeug')) { - clean.push(line); - const shooterString = line.substring(line.lastIndexOf(" von: ") + 6, line.lastIndexOf(". :OPT LOG END")); + /** + * 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 targetString = line.substring(line.lastIndexOf(' || ') + 4, line.lastIndexOf(' von:')); const target = getPlayerAndFractionFromString(targetString); - kills.push({ - warId: 'asdfaew34tg', - time: getDateTime(line.split(" ")[5]), + 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 @@ -41,65 +48,80 @@ const parseWarLog = (lineArray, war) => { addPlayersIfNotExists([shooter, target]); } - if (line.includes("Budget")) { - clean.push(line); - const budg = line.split(" "); - if (line.includes("Endbudget")) { - war["endBudgetBlufor"] = transformMoneyString(budg[11]); - war['endBudgetOpfor'] = transformMoneyString(budg[14]); - } else if (line.includes("Startbudget")) { - war["budgetBlufor"] = transformMoneyString(budg[11]); - war["budgetOpfor"] = transformMoneyString(budg[14]); + /** + * 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['budgetBlufor'] = transformMoneyString(budg[11]); + stats.war['budgetOpfor'] = transformMoneyString(budg[14]); } else { - budget.push(getBudgetEntry(budg)); + stats.budget.push(getBudgetEntry(budg, war._id)); } } - if (line.includes("Fahne")) { - clean.push(line); - const playerName = line.substring(line.lastIndexOf("t von ") + 6, line.lastIndexOf(" :OPT LOG END")); + /** + * 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'); - flag.push({ - warId: 'sdf89uiz786', - time: getDateTime(line.split(" ")[5]), + stats.flag.push({ + war: war._id, + time: getDateTime(line.split(' ')[5]), player: playerName, flagFraction: flagFraction, capture: capture }); } - if (line.includes("Punkte")) { - clean.push(line); - const pt = line.split(" "); + /** + * POINTS + */ + if (line.includes('Punkte')) { + stats.clean.push(line); + const pt = line.split(' '); - if (line.includes("Endpunktestand")) { - war['ptBlufor'] = parseInt(pt[11]); - war['ptOpfor'] = parseInt(pt[14].slice(0, -1)); + if (line.includes('Endpunktestand')) { + stats.war['ptBlufor'] = parseInt(pt[11]); + stats.war['ptOpfor'] = parseInt(pt[14].slice(0, -1)); } else { - points.push(getPointsEntry(pt)) + stats.points.push(getPointsEntry(pt, war._id)) } } - if (line.includes("Respawn")) { - clean.push(line); - const resp = line.split(" "); - const playerName = line.substring(line.lastIndexOf("Spieler:") + 9, line.lastIndexOf("-") - 1); - respawn.push(getRespawnEntry(resp, playerName)); + /** + * 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)); } - if (line.includes("Revive")) { - clean.push(line); + /** + * 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 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 patientName = line.substring(line.lastIndexOf('|| ') + 3, line.lastIndexOf(' wurde von')); const patient = getPlayerAndFractionFromString(patientName); - revive.push({ - warId: 'asfddf', - time: getDateTime(line.split(" ")[5]), + stats.revive.push({ + war: war._id, + time: getDateTime(line.split(' ')[5]), stabilized: stabilized, medic: medic.name, patient: patientName @@ -108,17 +130,20 @@ const parseWarLog = (lineArray, war) => { addPlayersIfNotExists([medic, patient]); } - if (line.includes("Transport ||")) { - clean.push(line); - const driverString = line.substring(line.lastIndexOf("wurde von ") + 10, line.lastIndexOf(" eingeflogen")); + /** + * 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 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)); + const distance = parseInt(line.substring(line.lastIndexOf('eingeflogen (') + 13, line.lastIndexOf('m)') - 1)); - transport.push({ - war: "blablub7z8", - time: getDateTime(line.split(" ")[5]), + stats.transport.push({ + war: war._id, + time: getDateTime(line.split(' ')[5]), driver: driver.name, passenger: passenger.name, distance: distance @@ -128,60 +153,62 @@ const parseWarLog = (lineArray, war) => { } }); - players.forEach(player => console.log(player)) - console.log(players.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; }; -function getRespawnEntry(respawn, playerName) { +const getRespawnEntry = (respawn, playerName, warId) => { return { - war: "1234567", + war: warId, time: getDateTime(respawn[5]), player: playerName } -} +}; -function getPointsEntry(pt) { +const getPointsEntry = (pt, warId) => { return { - warId: "123-xyz-123", + warId: warId, time: getDateTime(pt[5]), ptBlufor: parseInt(pt[12]), ptOpfor: parseInt(pt[15].slice(0, -1)) } -} +}; -function getBudgetEntry(budg) { +const getBudgetEntry = (budg, warId) => { return { - warId: "123-xyz-123", + warId: warId, time: getDateTime(budg[5]), - fraction: budg[9] === "NATO" ? "BLUFOR" : "OPFOR", + fraction: budg[9] === 'NATO' ? 'BLUFOR' : 'OPFOR', oldBudget: transformMoneyString(budg[11]), newBudget: transformMoneyString(budg[14]) } -} +}; -function getPlayerAndFractionFromString(nameAndFractionString) { - const nameArray = nameAndFractionString.split(" "); - const fraction = nameArray[nameArray.length - 1] === "(WEST)" ? "BLUFOR" : "OPFOR"; +const getPlayerAndFractionFromString = (nameAndFractionString) => { + const nameArray = nameAndFractionString.split(' '); + const fraction = nameArray[nameArray.length - 1] === '(WEST)' ? 'BLUFOR' : 'OPFOR'; const name = nameAndFractionString.substring(0, nameAndFractionString.indexOf(nameArray[nameArray.length - 1]) - 1); - // do not return player for "Selbstverschulden" - if (name) { + // do not return player for 'Selbstverschulden' + if (name || name === 'Error: No unit') { return {name: name, fraction: fraction}; } -} +}; const transformMoneyString = (budgetString) => { - if (!budgetString.includes("e+")) { + if (!budgetString.includes('e+')) { return parseInt(budgetString); } - const budget = budgetString.split("e+"); + const budget = budgetString.split('e+'); return Math.round(parseFloat(budget[0]) * Math.pow(10, parseInt(budget[1]))); }; -function getDateTime(timeString) { +const getDateTime = (timeString) => { const timeZone = 'Z'; - return new Date("1999-01-01T0" + timeString + timeZone); -} + return new Date('1999-01-01T0' + timeString + timeZone); +}; module.exports = parseWarLog;