diff --git a/server/models/logs/player-count.js b/server/models/logs/player-count.js new file mode 100644 index 0000000..ee17850 --- /dev/null +++ b/server/models/logs/player-count.js @@ -0,0 +1,34 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const LogPlayerCountSchema = new Schema({ + war: { + type: mongoose.Schema.Types.ObjectId, + ref: 'War', + required: true, + }, + time: { + type: Date, + required: true, + }, + countBlufor: { + type: Number, + get: (v) => Math.round(v), + set: (v) => Math.round(v), + required: true, + }, + countOpfor: { + type: Number, + get: (v) => Math.round(v), + set: (v) => Math.round(v), + required: true, + }, +}, { + collection: 'logPlayerCount', +}); +// optional more indices +LogPlayerCountSchema.index({war: 1}); + +module.exports = mongoose.model('LogPlayerCount', LogPlayerCountSchema); diff --git a/server/routes/logs.js b/server/routes/logs.js index e277a41..6727365 100644 --- a/server/routes/logs.js +++ b/server/routes/logs.js @@ -15,6 +15,7 @@ const LogVehicleModel = require('../models/logs/vehicle'); const LogTransportModel = require('../models/logs/transport'); const LogFlagModel = require('../models/logs/flag'); const LogPointsModel = require('../models/logs/points'); +const LogPlayerCountModel = require('../models/logs/player-count'); const logsRouter = new express.Router(); @@ -45,6 +46,7 @@ logsRouter.route('/:warId') const vehicleObjects = LogVehicleModel.find(filter, {}, sort); const transportObjects = LogTransportModel.find(filter, {}, sort); const flagObjects = LogFlagModel.find(filter, {}, sort); + const playerCountObjects = LogPlayerCountModel.find(filter, {}, sort); const resources = { points: pointsObjects.exec.bind(pointsObjects), budget: budgetObjects.exec.bind(budgetObjects), @@ -54,6 +56,7 @@ logsRouter.route('/:warId') vehicle: killObjects.exec.bind(vehicleObjects), transport: transportObjects.exec.bind(transportObjects), flag: flagObjects.exec.bind(flagObjects), + playerCount: playerCountObjects.exec.bind(playerCountObjects), }; async.parallel(resources, (error, results) => { diff --git a/server/routes/wars.js b/server/routes/wars.js index 692e37f..993c99f 100644 --- a/server/routes/wars.js +++ b/server/routes/wars.js @@ -33,6 +33,7 @@ const LogTransportModel = require('../models/logs/transport'); const LogFlagModel = require('../models/logs/flag'); const LogBudgetModel = require('../models/logs/budget'); const LogPointsModel = require('../models/logs/points'); +const LogPlayerCountModel = require('../models/logs/player-count'); // util const genericPatch = require('./_generic').genericPatch; @@ -76,6 +77,8 @@ wars.route('/') if (err) { return next(err); } + + console.log(statsResult.playerCount) LogKillModel.create(statsResult.kills, () => { LogVehicleKillModel.create(statsResult.vehicles, () => { LogRespawnModel.create(statsResult.respawn, () => { @@ -83,28 +86,30 @@ wars.route('/') LogFlagModel.create(statsResult.flag, () => { LogBudgetModel.create(statsResult.budget, () => { LogTransportModel.create(statsResult.transport, () => { - LogPointsModel.create(statsResult.points, () => { - const folderName = resourceLocation.concat(war._id); - mkdirp(folderName, (err) => { - if (err) return next(err); + LogPlayerCountModel.create(statsResult.playerCount, () => { + LogPointsModel.create(statsResult.points, () => { + const folderName = resourceLocation.concat(war._id); + mkdirp(folderName, (err) => { + if (err) return next(err); - // save clean log file - const cleanFile = fs.createWriteStream(folderName + '/clean.log'); - statsResult.clean.forEach((cleanLine) => { - cleanFile.write(cleanLine + '\n\n'); + // save clean log file + const cleanFile = fs.createWriteStream(folderName + '/clean.log'); + statsResult.clean.forEach((cleanLine) => { + cleanFile.write(cleanLine + '\n\n'); + }); + cleanFile.end(); + + // save raw log file + const rawFile = fs.createWriteStream(folderName + '/war.log'); + lineArray.forEach((rawLine) => { + rawFile.write(rawLine + '\n'); + }); + rawFile.end(); + + res.status(codes.created); + res.locals.items = war; + next(); }); - cleanFile.end(); - - // save raw log file - const rawFile = fs.createWriteStream(folderName + '/war.log'); - lineArray.forEach((rawLine) => { - rawFile.write(rawLine + '\n'); - }); - rawFile.end(); - - res.status(codes.created); - res.locals.items = war; - next(); }); }); }); diff --git a/server/tools/log-parse-tool.js b/server/tools/log-parse-tool.js index 2152ab3..bdaaf63 100644 --- a/server/tools/log-parse-tool.js +++ b/server/tools/log-parse-tool.js @@ -23,6 +23,12 @@ const vehicleRegex = /(vehicle:\s(.*?)\))/; const categoryRegex = /(category:\s(.*?)\))/; +const bluforPlayerCountRegex = /NATO\s(\d*)/; + +const opforPlayerCountRegex = /CSAT\s(\d*)/; + +const timestampRegex= /LOG:\s(\d*:\d*:\d*)\s---/; + const parseWarLog = (lineArray, war) => { let flagBlufor = true; let flagOpfor = true; @@ -41,6 +47,7 @@ const parseWarLog = (lineArray, war) => { flag: [], transport: [], players: [], + playerCount: [], }; const VEHICLE_BLACKLIST = [ @@ -245,6 +252,19 @@ const parseWarLog = (lineArray, war) => { fraction: driver ? driver.fraction : 'NONE', distance: distance, }); + } else if (line.includes('(Spieleranzahl)')) { + stats.clean.push(line); + + const timestamp = (timestampRegex.exec(line))[1]; + const countBlufor = (bluforPlayerCountRegex.exec(line))[1]; + const countOpfor = (opforPlayerCountRegex.exec(line))[1]; + + stats.playerCount.push({ + war: war.id, + time: getFullTimeDate(war.date, timestamp), + countBlufor: countBlufor, + countOpfor: countOpfor, + }); } else if (line.includes('(Fraktionsuebersicht)') || line.includes('Fraktionsübersicht')) { /** * PLAYERS