Compare commits

..

No commits in common. "03073f5436c95ca6fee54b5544d593628656f1b2" and "3c02c353e730773082297158676f7b03c4306946" have entirely different histories.

15 changed files with 39 additions and 156 deletions

2
.gitignore vendored
View File

@ -46,6 +46,7 @@ Thumbs.db
# Internal Data # Internal Data
/public/ /public/
mongodb-data/
server/resource/ server/resource/
server/apib/dredd/data/tmp-resource server/apib/dredd/data/tmp-resource
backup/ backup/
@ -58,3 +59,4 @@ backup/
.cache/motd.legal-displayed .cache/motd.legal-displayed
.profile .profile
.ssh/ .ssh/

Binary file not shown.

View File

@ -32,7 +32,6 @@ const LogBudgetSchema = new Schema({
}, },
}, { }, {
collection: 'logBudget', collection: 'logBudget',
versionKey: false,
}); });
// optional more indices // optional more indices
LogBudgetSchema.index({war: 1}); LogBudgetSchema.index({war: 1});

View File

@ -28,7 +28,6 @@ const LogFlagSchema = new Schema({
}, },
}, { }, {
collection: 'logFlag', collection: 'logFlag',
versionKey: false,
}); });
// optional more indices // optional more indices
LogFlagSchema.index({war: 1, player: 1}); LogFlagSchema.index({war: 1, player: 1});

View File

@ -40,7 +40,6 @@ const LogKillSchema = new Schema({
}, },
}, { }, {
collection: 'logKill', collection: 'logKill',
versionKey: false,
}); });
// optional more indices // optional more indices
LogKillSchema.index({war: 1, shooter: 1, target: 1}); LogKillSchema.index({war: 1, shooter: 1, target: 1});

View File

@ -27,7 +27,6 @@ const LogPlayerCountSchema = new Schema({
}, },
}, { }, {
collection: 'logPlayerCount', collection: 'logPlayerCount',
versionKey: false,
}); });
// optional more indices // optional more indices
LogPlayerCountSchema.index({war: 1}); LogPlayerCountSchema.index({war: 1});

View File

@ -32,7 +32,6 @@ const LogKillSchema = new Schema({
}, },
}, { }, {
collection: 'logPoints', collection: 'logPoints',
versionKey: false,
}); });
// optional more indices // optional more indices
LogKillSchema.index({war: 1, shooter: 1, target: 1}); LogKillSchema.index({war: 1, shooter: 1, target: 1});

View File

@ -19,7 +19,6 @@ const LogRespawnSchema = new Schema({
}, },
}, { }, {
collection: 'logRespawn', collection: 'logRespawn',
versionKey: false,
}); });
// optional more indices // optional more indices
LogRespawnSchema.index({war: 1, player: 1}); LogRespawnSchema.index({war: 1, player: 1});

View File

@ -32,7 +32,6 @@ const LogReviveSchema = new Schema({
}, },
}, { }, {
collection: 'logRevive', collection: 'logRevive',
versionKey: false,
}); });
// optional more indices // optional more indices
LogReviveSchema.index({war: 1, medic: 1}); LogReviveSchema.index({war: 1, medic: 1});

View File

@ -1,47 +0,0 @@
'use strict';
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const LogServerFpsSchema = new Schema({
war: {
type: mongoose.Schema.Types.ObjectId,
ref: 'War',
required: true,
},
entityName: {
type: String,
required: true,
},
singleAvgFps: {
type: Number,
get: (v) => Math.round(v),
set: (v) => Math.round(v),
required: true,
},
singleMinFps: {
type: Number,
get: (v) => Math.round(v),
set: (v) => Math.round(v),
required: true,
},
avgFps: [{
type: Number,
get: (v) => Math.round(v),
set: (v) => Math.round(v),
required: true,
}],
minFps: [{
type: Number,
get: (v) => Math.round(v),
set: (v) => Math.round(v),
required: true,
}],
}, {
collection: 'logServerFps',
versionKey: false,
});
// optional more indices
LogServerFpsSchema.index({war: 1});
module.exports = mongoose.model('LogServerFpsSchema', LogServerFpsSchema);

View File

@ -34,7 +34,6 @@ const LogTransportSchema = new Schema({
}, },
}, { }, {
collection: 'logTransport', collection: 'logTransport',
versionKey: false,
}); });
// optional more indices // optional more indices
LogTransportSchema.index({war: 1, driver: 1}); LogTransportSchema.index({war: 1, driver: 1});

View File

@ -41,7 +41,6 @@ const LogVehicleKillSchema = new Schema({
}, },
}, { }, {
collection: 'logVehicle', collection: 'logVehicle',
versionKey: false,
}); });
// optional more indices // optional more indices
LogVehicleKillSchema.index({war: 1, shooter: 1, target: 1}); LogVehicleKillSchema.index({war: 1, shooter: 1, target: 1});

View File

@ -82,11 +82,6 @@ const PlayerSchema = new Schema({
get: (v) => Math.round(v), get: (v) => Math.round(v),
set: (v) => Math.round(v), set: (v) => Math.round(v),
}, },
performance: {
type: mongoose.Schema.Types.ObjectId,
ref: 'LogServerFpsSchema',
required: true,
},
}, { }, {
collection: 'player', collection: 'player',
timestamps: {createdAt: 'timestamp'}, timestamps: {createdAt: 'timestamp'},

View File

@ -34,7 +34,6 @@ const LogFlagModel = require('../models/logs/flag');
const LogBudgetModel = require('../models/logs/budget'); const LogBudgetModel = require('../models/logs/budget');
const LogPointsModel = require('../models/logs/points'); const LogPointsModel = require('../models/logs/points');
const LogPlayerCountModel = require('../models/logs/player-count'); const LogPlayerCountModel = require('../models/logs/player-count');
const LogServerFpsModel = require('../models/logs/server-fps');
// util // util
const genericPatch = require('./_generic').genericPatch; const genericPatch = require('./_generic').genericPatch;
@ -60,20 +59,25 @@ wars.route('/')
}) })
.post(apiAuthenticationMiddleware, checkMT, upload.single('log'), (req, res, next) => { .post(apiAuthenticationMiddleware, checkMT, upload.single('log'), (req, res, next) => {
const body = req.body; const body = req.body;
const warBody = new WarModel(body); const warBody = new WarModel(body);
if (req.file) { if (req.file) {
fs.readFile(req.file.buffer, (file, err) => { fs.readFile(req.file.buffer, (file, err) => {
if (err) {
return next(err);
}
const lineArray = file.toString().split('\n');
const statsResult = parseWarLog(lineArray, warBody);
statsResult.war.save((err, war) => {
if (err) { if (err) {
return next(err); return next(err);
} }
const lineArray = file.toString().split('\n'); PlayerModel.create(statsResult.players, (err) => {
const statsResult = parseWarLog(lineArray, warBody);
statsResult.war.save((err, war) => {
if (err) { if (err) {
return next(err); return next(err);
} }
LogKillModel.create(statsResult.kills, () => { LogKillModel.create(statsResult.kills, () => {
LogVehicleKillModel.create(statsResult.vehicles, () => { LogVehicleKillModel.create(statsResult.vehicles, () => {
LogRespawnModel.create(statsResult.respawn, () => { LogRespawnModel.create(statsResult.respawn, () => {
@ -83,43 +87,27 @@ wars.route('/')
LogTransportModel.create(statsResult.transport, () => { LogTransportModel.create(statsResult.transport, () => {
LogPlayerCountModel.create(statsResult.playerCount, () => { LogPlayerCountModel.create(statsResult.playerCount, () => {
LogPointsModel.create(statsResult.points, () => { LogPointsModel.create(statsResult.points, () => {
LogServerFpsModel.create(statsResult.serverFps, (err, serverPerformanceEntries) => { const folderName = resourceLocation.concat(war._id);
serverPerformanceEntries.forEach((entry) => { mkdirp(folderName, (err) => {
const idx = statsResult.players if (err) return next(err);
.findIndex((player) => player.name === entry.entityName);
if (idx !== -1) { // save clean log file
const player = statsResult.players[idx]; const cleanFile = fs.createWriteStream(folderName + '/clean.log');
player['performance'] = entry._id; statsResult.clean.forEach((cleanLine) => {
statsResult.players[idx] = player; cleanFile.write(cleanLine + '\n\n');
}
}); });
PlayerModel.create(statsResult.players, (err) => { cleanFile.end();
if (err) {
return next(err);
}
const folderName = resourceLocation.concat(war._id);
mkdirp(folderName, (err) => {
if (err) return next(err);
// save clean log file // save raw log file
const cleanFile = fs.createWriteStream(folderName + '/clean.log'); const rawFile = fs.createWriteStream(folderName + '/war.log');
statsResult.clean.forEach((cleanLine) => { lineArray.forEach((rawLine) => {
cleanFile.write(cleanLine + '\n\n'); rawFile.write(rawLine + '\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();
});
}); });
rawFile.end();
res.status(codes.created);
res.locals.items = war;
next();
}); });
}); });
}); });
@ -132,13 +120,13 @@ wars.route('/')
}); });
}); });
}); });
} else { });
const err = new Error('no Logfile provided'); } else {
err.status = codes.wrongmediasend; const err = new Error('no Logfile provided');
next(err); err.status = codes.wrongmediasend;
} next(err);
} }
) })
.all( .all(
routerHandling.httpMethodNotAllowed routerHandling.httpMethodNotAllowed

View File

@ -27,15 +27,7 @@ const bluforPlayerCountRegex = /NATO\s(\d*)/;
const opforPlayerCountRegex = /CSAT\s(\d*)/; const opforPlayerCountRegex = /CSAT\s(\d*)/;
const timestampRegex = /LOG:\s(\d*:\d*:\d*)\s---/; const timestampRegex= /LOG:\s(\d*:\d*:\d*)\s---/;
const singleMinFpsRegex = /Single min\. FPS for (.*):\s(\d*.\d*)"/; // group1 = entity name, group2 = value
const singleAvgFpsRegex = /Single avg\. FPS for (.*):\s(\d*.\d*)"/; // group1 = entity name, group2 = value
const minFpsRegex = /Min\. FPS for (.*):\s\[(.*)\]"/; // group1 = entity name, group2 = comma separated values
const avgFpsRegex = /Avg\. FPS for (.*):\s\[(.*)\]"/; // group1 = entity name, group2 = comma separated values
const parseWarLog = (lineArray, war) => { const parseWarLog = (lineArray, war) => {
let flagBlufor = true; let flagBlufor = true;
@ -56,7 +48,6 @@ const parseWarLog = (lineArray, war) => {
transport: [], transport: [],
players: [], players: [],
playerCount: [], playerCount: [],
serverFps: [],
}; };
const VEHICLE_BLACKLIST = [ const VEHICLE_BLACKLIST = [
@ -274,43 +265,6 @@ const parseWarLog = (lineArray, war) => {
countBlufor: countBlufor, countBlufor: countBlufor,
countOpfor: countOpfor, countOpfor: countOpfor,
}); });
} else if (line.includes('(FPS)')) {
stats.clean.push(line);
const updateServerFpsLogEntry = (entityName, addKey, addValue) => {
const idx = stats.serverFps.findIndex((entry) => entry.entityName === entityName);
if (idx === -1) {
stats.serverFps.push({
war: war.id,
entityName: entityName,
[addKey]: addValue,
});
return;
}
const entity = stats.serverFps[idx];
entity[addKey] = addValue;
stats.serverFps[idx] = entity;
};
const singleMinMatch = singleMinFpsRegex.exec(line);
if (singleMinMatch) {
updateServerFpsLogEntry(singleMinMatch[1], 'singleMinFps', singleMinMatch[2]);
} else {
const singleAvgMatch = singleAvgFpsRegex.exec(line);
if (singleAvgMatch) {
updateServerFpsLogEntry(singleAvgMatch[1], 'singleAvgFps', singleAvgMatch[2]);
} else {
const minCollectionMatch = minFpsRegex.exec(line);
if (minCollectionMatch) {
updateServerFpsLogEntry(minCollectionMatch[1], 'minFps', minCollectionMatch[2].split(','));
} else {
const avgCollectionMatch = avgFpsRegex.exec(line);
if (avgCollectionMatch) {
updateServerFpsLogEntry(avgCollectionMatch[1], 'avgFps', avgCollectionMatch[2].split(','));
}
}
}
}
} else if (line.includes('(Fraktionsuebersicht)') || line.includes('Fraktionsübersicht')) { } else if (line.includes('(Fraktionsuebersicht)') || line.includes('Fraktionsübersicht')) {
/** /**
* PLAYERS * PLAYERS