Add parser for basic events
|
@ -4,7 +4,7 @@ const cron = require('cron');
|
||||||
const async = require('async');
|
const async = require('async');
|
||||||
const {exec} = require('child_process');
|
const {exec} = require('child_process');
|
||||||
const UserModel = require('../models/user');
|
const UserModel = require('../models/user');
|
||||||
const signatureTool = require('../signature-tool/signature-tool');
|
const signatureTool = require('../tools/signature-tool');
|
||||||
|
|
||||||
const createAllSignatures = () => {
|
const createAllSignatures = () => {
|
||||||
console.log('\x1b[35m%s\x1b[0m', new Date().toLocaleString()
|
console.log('\x1b[35m%s\x1b[0m', new Date().toLocaleString()
|
||||||
|
|
|
@ -11,4 +11,18 @@ const sortCollectionBy = (collection, key) => {
|
||||||
return collection;
|
return collection;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const arrayContains = (arr, user) => {
|
||||||
|
let i = 0, count = arr.length, matchFound = false;
|
||||||
|
|
||||||
|
for(; i < count; i++) {
|
||||||
|
if (arr[i] === user) {
|
||||||
|
matchFound = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return matchFound;
|
||||||
|
};
|
||||||
|
|
||||||
exports.sortCollection = sortCollectionBy;
|
exports.sortCollection = sortCollectionBy;
|
||||||
|
exports.arrayContains = arrayContains;
|
||||||
|
|
|
@ -9,7 +9,7 @@ const codes = require('./http-codes');
|
||||||
|
|
||||||
const routerHandling = require('../middleware/router-handling');
|
const routerHandling = require('../middleware/router-handling');
|
||||||
const createAllSignatures = require('../cron-job/cron').createAllSignatures;
|
const createAllSignatures = require('../cron-job/cron').createAllSignatures;
|
||||||
const createSignature = require('../signature-tool/signature-tool');
|
const createSignature = require('../tools/signature-tool');
|
||||||
|
|
||||||
const command = express.Router();
|
const command = express.Router();
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,8 @@ const apiAuthenticationMiddleware = require('../middleware/auth-middleware');
|
||||||
const checkMT = require('../middleware/permission-check').checkMT;
|
const checkMT = require('../middleware/permission-check').checkMT;
|
||||||
const routerHandling = require('../middleware/router-handling');
|
const routerHandling = require('../middleware/router-handling');
|
||||||
|
|
||||||
|
const parseWarLog = require('../tools/log-parse-tool');
|
||||||
|
|
||||||
// Mongoose Model using mongoDB
|
// Mongoose Model using mongoDB
|
||||||
const CampaignModel = require('../models/campaign');
|
const CampaignModel = require('../models/campaign');
|
||||||
const WarModel = require('../models/war');
|
const WarModel = require('../models/war');
|
||||||
|
@ -62,69 +64,19 @@ wars.route('/')
|
||||||
|
|
||||||
.post(apiAuthenticationMiddleware, checkMT, upload.single('log'), (req, res, next) => {
|
.post(apiAuthenticationMiddleware, checkMT, upload.single('log'), (req, res, next) => {
|
||||||
let body = req.body;
|
let body = req.body;
|
||||||
let parts = body.date.split("-");
|
|
||||||
body.date = new Date(parseInt(parts[0], 10),
|
|
||||||
parseInt(parts[1], 10) - 1,
|
|
||||||
parseInt(parts[2], 10));
|
|
||||||
const war = new WarModel(body);
|
const war = new WarModel(body);
|
||||||
|
|
||||||
if (req.file) {
|
if (req.file) {
|
||||||
war.save((err, war) => {
|
fs.readFile(req.file.buffer, (file, err) => {
|
||||||
if (err) {
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
const folderName = __dirname + '/../resource/logs/' + war._id;
|
|
||||||
mkdirp(folderName, function (err) {
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return next(err);
|
return next(err);
|
||||||
}
|
}
|
||||||
fs.appendFile(folderName + '/war.log', new Buffer(req.file.buffer), (err) => {
|
const lineArray = file.toString().split("\n");
|
||||||
if (err) {
|
parseWarLog(lineArray, {});
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
exec(__dirname + '/../war-parser/run.sh ' + folderName + ' ' + war._id, (error, stdout) => {
|
|
||||||
if (error) {
|
|
||||||
return next(error);
|
|
||||||
}
|
|
||||||
exec(__dirname + '/../war-parser/clean.sh /../' + folderName + ' | tee ' + folderName + '/clean.log', (error) => {
|
|
||||||
if (error) {
|
|
||||||
return next(error);
|
|
||||||
}
|
|
||||||
let obj = JSON.parse(`${stdout}`);
|
|
||||||
for (let i = 0; i < obj.length; i++) {
|
|
||||||
if (!obj[i].fraction) {
|
|
||||||
obj.splice(i, 1);
|
|
||||||
} else if (obj[i].fraction === 'BLUFOR') {
|
|
||||||
war.playersBlufor++;
|
|
||||||
} else {
|
|
||||||
war.playersOpfor++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WarModel.findByIdAndUpdate(war._id, war, {new: true}, (err, item) => {
|
|
||||||
if (err) {
|
|
||||||
err.status = codes.wrongrequest;
|
|
||||||
}
|
|
||||||
else if (!item) {
|
|
||||||
err = new Error("item not found");
|
|
||||||
err.status = codes.notfound;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
PlayerModel.create(obj, function (err) {
|
|
||||||
if (err) {
|
|
||||||
return next(err);
|
|
||||||
}
|
|
||||||
res.status(codes.created);
|
|
||||||
res.locals.items = war;
|
|
||||||
return next();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
})
|
res.locals.processed = true;
|
||||||
|
return next();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
const err = new Error('no Logfile provided');
|
const err = new Error('no Logfile provided');
|
||||||
|
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
@ -0,0 +1,146 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const arrayContains = require('../middleware/util').arrayContains;
|
||||||
|
|
||||||
|
const parseWarLog = (lineArray, war) => {
|
||||||
|
const clean = [];
|
||||||
|
const budget = [];
|
||||||
|
const points = [];
|
||||||
|
const kills = [];
|
||||||
|
const respawn = [];
|
||||||
|
const revive = [];
|
||||||
|
const flag = [];
|
||||||
|
const transport = [];
|
||||||
|
const playerNames = [];
|
||||||
|
|
||||||
|
const addPlayerIfNotExists = (playerName) => {
|
||||||
|
if (playerName !== 'Error: No unit' && !arrayContains(playerNames, playerName)) {
|
||||||
|
playerNames.push(playerName);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
lineArray.forEach(line => {
|
||||||
|
if (line.includes("Abschuss")) {
|
||||||
|
clean.push(line);
|
||||||
|
// const kill = line.split(" ");
|
||||||
|
// for (let i=0; i< kill.length; i++ ) {
|
||||||
|
// console.log(i + " +++ " + kill[i]);
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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]);
|
||||||
|
} else {
|
||||||
|
budget.push(getBudgetEntry(budg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.includes("Fahne")) {
|
||||||
|
clean.push(line);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.includes("Punkte")) {
|
||||||
|
clean.push(line);
|
||||||
|
const pt = line.split(" ");
|
||||||
|
|
||||||
|
if (line.includes("Endpunktestand")) {
|
||||||
|
war['ptBlufor'] = parseInt(pt[11]);
|
||||||
|
war['ptOpfor'] = parseInt(pt[14].slice(0, -1));
|
||||||
|
} else {
|
||||||
|
points.push(getPointsEntry(pt))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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));
|
||||||
|
addPlayerIfNotExists(playerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.includes("Revive")) {
|
||||||
|
clean.push(line);
|
||||||
|
//console.log(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.includes("Transport ||")) {
|
||||||
|
clean.push(line);
|
||||||
|
const driverName = line.substring(line.lastIndexOf("wurde von ") + 10, line.lastIndexOf(" eingeflogen"));
|
||||||
|
const driverNameArray = driverName.split(" ");
|
||||||
|
const driverFraction = driverNameArray[driverNameArray.length-1] === "(WEST)" ? "BLUFOR" : "OPFOR";
|
||||||
|
const sanitizedDriverName = driverName.substring(0, driverName.indexOf(driverNameArray[driverNameArray.length-1])-1);
|
||||||
|
|
||||||
|
const passengerName = line.substring(line.lastIndexOf("|| ") + 3, line.lastIndexOf(" wurde von"));
|
||||||
|
const passengerNameArray = passengerName.split(" ");
|
||||||
|
const passengerFraction = passengerNameArray[passengerNameArray.length-1] === "(WEST)" ? "BLUFOR" : "OPFOR";
|
||||||
|
const sanitizedPassengerName = passengerName.substring(0, passengerName.indexOf(passengerNameArray[passengerNameArray.length-1])-1);
|
||||||
|
const distance = parseInt(line.substring(line.lastIndexOf("eingeflogen (") + 13, line.lastIndexOf("m)") - 1));
|
||||||
|
|
||||||
|
transport.push({
|
||||||
|
war: "blablub7z8",
|
||||||
|
driver: sanitizedDriverName,
|
||||||
|
passenger: sanitizedPassengerName,
|
||||||
|
distance: distance
|
||||||
|
});
|
||||||
|
|
||||||
|
addPlayerIfNotExists(sanitizedDriverName);
|
||||||
|
addPlayerIfNotExists(sanitizedPassengerName);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//
|
||||||
|
playerNames.forEach(budg => console.log(budg));
|
||||||
|
};
|
||||||
|
|
||||||
|
function getRespawnEntry(respawn, playerName) {
|
||||||
|
return {
|
||||||
|
war: "1234567",
|
||||||
|
time: getDateTime(respawn[5]),
|
||||||
|
player: playerName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPointsEntry(pt) {
|
||||||
|
return {
|
||||||
|
warId: "123-xyz-123",
|
||||||
|
time: getDateTime(pt[5]),
|
||||||
|
ptBlufor: parseInt(pt[12]),
|
||||||
|
ptOpfor: parseInt(pt[15].slice(0, -1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getBudgetEntry(budg) {
|
||||||
|
return {
|
||||||
|
warId: "123-xyz-123",
|
||||||
|
time: getDateTime(budg[5]),
|
||||||
|
fraction: budg[9] === "NATO" ? "BLUFOR" : "OPFOR",
|
||||||
|
oldBudget: transformMoneyString(budg[11]),
|
||||||
|
newBudget: transformMoneyString(budg[14])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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])));
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
function getDateTime(timeString) {
|
||||||
|
const timeZone = 'Z';
|
||||||
|
return new Date("1999-01-01T0" + timeString + timeZone);
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = parseWarLog;
|
|
@ -1,4 +1,4 @@
|
||||||
import {Component, HostListener} from '@angular/core';
|
import {Component} from '@angular/core';
|
||||||
import {NavigationEnd, NavigationStart, Router} from '@angular/router';
|
import {NavigationEnd, NavigationStart, Router} from '@angular/router';
|
||||||
import {LoginService} from './services/login-service/login-service';
|
import {LoginService} from './services/login-service/login-service';
|
||||||
import {PromotionService} from "./services/promotion-service/promotion.service";
|
import {PromotionService} from "./services/promotion-service/promotion.service";
|
||||||
|
@ -30,7 +30,7 @@ export class AppComponent {
|
||||||
}
|
}
|
||||||
if (event instanceof NavigationEnd) {
|
if (event instanceof NavigationEnd) {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
if (router.url.includes('stats') || router.url.includes('overview')) {
|
if (router.url.includes('overview')) {
|
||||||
window.scrollTo({left: 0, top: 0, behavior: 'smooth'});
|
window.scrollTo({left: 0, top: 0, behavior: 'smooth'});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|