From d10fc8e49a579efaf80c0a27d63fc7bd6c46481a Mon Sep 17 00:00:00 2001 From: HardiReady Date: Sat, 9 Jun 2018 19:17:38 +0200 Subject: [PATCH 1/6] resolve multi player names --- api/tools/log-parse-tool.js | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/api/tools/log-parse-tool.js b/api/tools/log-parse-tool.js index cf6e311..0a9d3dc 100644 --- a/api/tools/log-parse-tool.js +++ b/api/tools/log-parse-tool.js @@ -11,7 +11,7 @@ const VehicleClasses = Object.freeze({ UNKNOWN: 'Unbekannt', }); -const playerNameRegex = /^(.*?)\s\(/; +const playerNameRegex = /(^|,\s)(.*?)\s\(/g; const vehicleNameEndRegex = /\s\(\w+:/; @@ -279,18 +279,27 @@ const getBudgetEntry = (budg, warId, warDate) => { const getPlayerAndFractionFromString = (inputString) => { const playerNameRegexMatch = playerNameRegex.exec(inputString); const sideMatch = sideRegex.exec(inputString); - // const magazineMatch = magazineRegex.exec(inputString); - // const vehicleMatch = vehicleRegex.exec(inputString); + // SINGLE PLAYER NAME let name; if (playerNameRegexMatch && playerNameRegexMatch.length >= 2) { // NAME - name = playerNameRegexMatch[1]; + name = playerNameRegexMatch[2].trim(); + } + // ADDITIONAL PLAYER NAMES + let additionalPlayerMatch; + while ((additionalPlayerMatch = playerNameRegex.exec(inputString)) !== null) { + const addPlayer = additionalPlayerMatch[0].replace(/^,\s/, '').replace(/\s\($/, '').trim(); + if (name instanceof Array) { + name.push(addPlayer) + } else { + name = [name, addPlayer]; + } } + // PLAYER FRACTION let side; if (sideMatch && sideMatch.length >= 3) { - // SIDE side = sideMatch[2]; } else { const inputArray = inputString.split(WHITESPACE); @@ -299,6 +308,9 @@ const getPlayerAndFractionFromString = (inputString) => { } } + // const magazineMatch = magazineRegex.exec(inputString); + // const vehicleMatch = vehicleRegex.exec(inputString); + // if (magazineMatch && magazineMatch.length >= 3) { // MAGAZINE // console.log(magazineMatch[2]) @@ -320,9 +332,11 @@ const getPlayerAndFractionFromString = (inputString) => { undefined; } + console.log(name); + // do not return player for 'Error: No unit' if (name && name !== 'Error: No unit') { - return {name: name.trim(), fraction: fraction}; + return {name: name, fraction: fraction}; } }; From fc5eaf868a4971631bb00a3ed6d0e15c6b7b0b0d Mon Sep 17 00:00:00 2001 From: HardiReady Date: Sat, 9 Jun 2018 19:31:22 +0200 Subject: [PATCH 2/6] Save additional shopoters for vehicle kill --- api/models/logs/vehicle.js | 3 +++ api/tools/log-parse-tool.js | 13 ++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/api/models/logs/vehicle.js b/api/models/logs/vehicle.js index 704d96e..e360e00 100644 --- a/api/models/logs/vehicle.js +++ b/api/models/logs/vehicle.js @@ -16,6 +16,9 @@ const LogVehicleKillSchema = new Schema({ shooter: { type: String, }, + additionalShooter: { + type: [String], + }, target: { type: String, required: true, diff --git a/api/tools/log-parse-tool.js b/api/tools/log-parse-tool.js index 0a9d3dc..d24bb85 100644 --- a/api/tools/log-parse-tool.js +++ b/api/tools/log-parse-tool.js @@ -80,14 +80,21 @@ const parseWarLog = (lineArray, war) => { const targetString = line.substring(line.lastIndexOf(' --- Fahrzeug: ') + 15, line.lastIndexOf(' von:')); const target = getVehicleAndFractionFromString(targetString); if (target && shooter && target.fraction !== shooter.fraction) { - stats.vehicles.push({ + const vehicleKill = { war: war._id, time: getFullTimeDate(war.date, line.split(WHITESPACE)[5]), - shooter: shooter ? shooter.name : null, target: target ? target.name : null, fraction: shooter ? shooter.fraction : 'NONE', vehicleClass: target.vehicleClass, - }); + }; + if (shooter && shooter.name instanceof Array) { + vehicleKill.shooter = shooter.name[0]; + vehicleKill.additionalShooter = shooter.name.slice(1, shooter.name.length); + } else { + vehicleKill.shooter = shooter ? shooter.name : null + } + console.log(vehicleKill) + stats.vehicles.push(vehicleKill); } } else { const targetString = line.substring(line.lastIndexOf(' --- Einheit: ') + 14, line.lastIndexOf(' von:')); From 236e445ca09d3887d6ffba40a6ce134e87c2d208 Mon Sep 17 00:00:00 2001 From: HardiReady Date: Sat, 9 Jun 2018 19:33:22 +0200 Subject: [PATCH 3/6] Remove vehicle kill items from db on war delete --- api/routes/wars.js | 1 + 1 file changed, 1 insertion(+) diff --git a/api/routes/wars.js b/api/routes/wars.js index 65b04d2..cf57b6a 100644 --- a/api/routes/wars.js +++ b/api/routes/wars.js @@ -189,6 +189,7 @@ wars.route('/:id') // delete linked appearances PlayerModel.find({warId: item._id}).remove().exec(); LogKillModel.find({war: item._id}).remove().exec(); + LogVehicleKillModel.find({war: item._id}).remove().exec(); LogRespawnModel.find({war: item._id}).remove().exec(); LogReviveModel.find({war: item._id}).remove().exec(); LogFlagModel.find({war: item._id}).remove().exec(); From 13a6e0f15736d437a50b0fa60aa2d45a8b8f9e3a Mon Sep 17 00:00:00 2001 From: HardiReady Date: Sat, 9 Jun 2018 22:06:18 +0200 Subject: [PATCH 4/6] Apply vehicle kill to all multi shooters --- api/routes/campaigns.js | 1 + api/tools/log-parse-tool.js | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/api/routes/campaigns.js b/api/routes/campaigns.js index 573b74b..3155a88 100644 --- a/api/routes/campaigns.js +++ b/api/routes/campaigns.js @@ -64,6 +64,7 @@ campaigns.route('/:id') } WarModel.find({campaign: req.params.id}).remove().exec(); // TODO: remove all the war logs from fs here!!! + // TODO: remove all LOG entries from DB!!! res.locals.processed = true; next(); }); diff --git a/api/tools/log-parse-tool.js b/api/tools/log-parse-tool.js index d24bb85..86e1260 100644 --- a/api/tools/log-parse-tool.js +++ b/api/tools/log-parse-tool.js @@ -91,9 +91,8 @@ const parseWarLog = (lineArray, war) => { vehicleKill.shooter = shooter.name[0]; vehicleKill.additionalShooter = shooter.name.slice(1, shooter.name.length); } else { - vehicleKill.shooter = shooter ? shooter.name : null + vehicleKill.shooter = shooter ? shooter.name : null; } - console.log(vehicleKill) stats.vehicles.push(vehicleKill); } } else { @@ -224,15 +223,18 @@ const parseWarLog = (lineArray, war) => { // TODO: use vehicle class description from enum stats.players[i]['vehicleLight'] = stats.vehicles.filter( - (vehicle) => vehicle.shooter === playerName && vehicle.vehicleClass === 'LIGHT' && + (vehicle) => (vehicle.shooter === playerName || vehicle.additionalShooter.indexOf(playerName) > -1) && + vehicle.vehicleClass === 'LIGHT' && VEHICLE_BLACKLIST.indexOf(vehicle.target) < 0).length; stats.players[i]['vehicleHeavy'] = stats.vehicles.filter( - (vehicle) => vehicle.shooter === playerName && vehicle.vehicleClass === 'HEAVY' && + (vehicle) => (vehicle.shooter === playerName || vehicle.additionalShooter.indexOf(playerName) > -1) && + vehicle.vehicleClass === 'HEAVY' && VEHICLE_BLACKLIST.indexOf(vehicle.target) < 0).length; stats.players[i]['vehicleAir'] = stats.vehicles.filter( - (vehicle) => vehicle.shooter === playerName && vehicle.vehicleClass === 'AIR' && + (vehicle) => (vehicle.shooter === playerName || vehicle.additionalShooter.indexOf(playerName) > -1) && + vehicle.vehicleClass === 'AIR' && VEHICLE_BLACKLIST.indexOf(vehicle.target) < 0).length; stats.players[i]['friendlyFire'] = stats.kills.filter( @@ -298,7 +300,7 @@ const getPlayerAndFractionFromString = (inputString) => { while ((additionalPlayerMatch = playerNameRegex.exec(inputString)) !== null) { const addPlayer = additionalPlayerMatch[0].replace(/^,\s/, '').replace(/\s\($/, '').trim(); if (name instanceof Array) { - name.push(addPlayer) + name.push(addPlayer); } else { name = [name, addPlayer]; } From 646a7b3030c2e1ffdd8aaec4370239923fec0565 Mon Sep 17 00:00:00 2001 From: HardiReady Date: Sat, 9 Jun 2018 22:13:23 +0200 Subject: [PATCH 5/6] Update version # --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0dc3b8c..9a46c82 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "opt-cc", - "version": "1.7.5", + "version": "1.7.6", "author": "Florian Hartwich ", "private": true, "scripts": { From 7c67567002969ec5992ebaf52d1cd0cbaa5a0e9a Mon Sep 17 00:00:00 2001 From: HardiReady Date: Sun, 10 Jun 2018 19:34:29 +0200 Subject: [PATCH 6/6] Update docs for multi user vehicle kill --- api/apib/data_structures/_log.apib | 1 + api/tools/log-parse-tool.js | 2 -- docs/mongo-db-schema.odg | Bin 15615 -> 15869 bytes 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/api/apib/data_structures/_log.apib b/api/apib/data_structures/_log.apib index 752028e..7b44d5d 100644 --- a/api/apib/data_structures/_log.apib +++ b/api/apib/data_structures/_log.apib @@ -71,6 +71,7 @@ #LogVehicle (Log) ## Properties + shooter: `HardiReady` (string, required) - name of player who shot the vehicle ++ additionalShooter: [`[GNC]Paolo`, `Dominik`] (array[string], required) - additional crew members of shooter vehicle + target: `T-100` (string, required) - name of the vehicle + fraction: `BLUFOR` (enum, required) - fraction of the shooter + Members diff --git a/api/tools/log-parse-tool.js b/api/tools/log-parse-tool.js index 86e1260..661746b 100644 --- a/api/tools/log-parse-tool.js +++ b/api/tools/log-parse-tool.js @@ -341,8 +341,6 @@ const getPlayerAndFractionFromString = (inputString) => { undefined; } - console.log(name); - // do not return player for 'Error: No unit' if (name && name !== 'Error: No unit') { return {name: name, fraction: fraction}; diff --git a/docs/mongo-db-schema.odg b/docs/mongo-db-schema.odg index 200c170608aca461452577727b72db925e024365..0287454c3ab1cbecb10f0dff32445c2952faa328 100644 GIT binary patch delta 11811 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 UpK1Kd^!ei_L>VEq0)PAd4~&4=>i_@%