Merge branch 'release/v1.8.2' of hardi/opt-cc into master

pull/48/head
hardi 2018-10-01 08:36:57 +02:00 committed by Gogs
commit d2aa29253e
8 changed files with 107 additions and 43 deletions

View File

@ -16,6 +16,12 @@ const cors = require('cors');
const mongoose = require('mongoose'); const mongoose = require('mongoose');
const {exec} = require('child_process'); const {exec} = require('child_process');
// cluster mode
const cluster = require('cluster');
const envWorkerNum = process.env.NODE_WORKER_COUNT;
const cpuCount = require('os').cpus().length;
const numWorkers = (envWorkerNum && envWorkerNum < cpuCount) ? envWorkerNum : cpuCount;
// own modules // own modules
const config = require('./config/config'); const config = require('./config/config');
const urls = require('./config/api-url'); const urls = require('./config/api-url');
@ -108,7 +114,7 @@ if (process.env.NODE_ENV === config.test.unit.env || process.env.NODE_ENV === co
const mongoServer = new MongodbMemoryServer(); const mongoServer = new MongodbMemoryServer();
mongoose.Promise = Promise; mongoose.Promise = Promise;
mongoServer.getConnectionString().then((mongoUri) => { mongoServer.getConnectionString().then((mongoUri) => {
mongoose.connect(mongoUri); mongoose.connect(mongoUri, {useNewUrlParser: true});
mongoose.connection.on('error', (e) => { mongoose.connection.on('error', (e) => {
if (e.message.code === 'ETIMEDOUT') { if (e.message.code === 'ETIMEDOUT') {
@ -139,17 +145,29 @@ if (process.env.NODE_ENV === config.test.unit.env || process.env.NODE_ENV === co
}); });
}); });
} else { } else {
const mongoosePromise = mongoose.connect(config.database.uri + config.database.db); mongoose.connect(config.database.uri + config.database.db, {useNewUrlParser: true}).then((db) => {
mongoosePromise.then((db) => { if (cluster.isMaster) {
app.listen(config.port, (err) => { // Fork workers
if (err !== undefined) { for (let i = 0; i < numWorkers; i++) {
error('Error on startup, ', err); cluster.fork();
} else {
logger('Listening on port ' + config.port);
signatureCronJob.start();
backupCronJob.start();
} }
}); logger(`Master ${process.pid} is running. Forking ${numWorkers} workers`);
// Check if worker id is died
cluster.on('exit', (worker, code, signal) => {
logger(`worker ${worker.process.pid} died`);
});
} else {
app.listen(config.port, (err) => {
if (err !== undefined) {
error(`Error on startup ${err}`);
} else {
logger(`Worker ${process.pid} started. Listening on port ${config.port}`);
signatureCronJob.start();
backupCronJob.start();
}
});
}
}); });
} }

View File

@ -42,10 +42,10 @@ const parseWarLog = (lineArray, war) => {
const VEHICLE_BLACKLIST = [ const VEHICLE_BLACKLIST = [
'Prowler (Unbewaffnet)', 'Prowler (Bewaffnet)', 'Hunter', 'Prowler (Unbewaffnet)', 'Prowler (Bewaffnet)', 'Hunter',
'HEMTT Transporter', 'HEMTT Transporter (abgedeckt)', 'HEMTT SanitÀtsfahrzeug', 'HEMTT Transporter', 'HEMTT Transporter (abgedeckt)', 'HEMTT Sanitätsfahrzeug',
'Remote Designator [NATO]', 'UGV Stomper', 'Remote Designator [NATO]', 'UGV Stomper',
'Qilin (Unbewaffnet)', 'Qilin (Bewaffnet)', 'Ifrit', 'Qilin (Unbewaffnet)', 'Qilin (Bewaffnet)', 'Ifrit',
'Tempest-Transporter', 'Tempest-Transporter (abgedeckt)', 'Tempest SanitÀtsfahrzeug', 'Tempest-Transporter', 'Tempest-Transporter (abgedeckt)', 'Tempest Sanitätsfahrzeug',
'Remote Designator [CSAT]', 'UBF Saif', 'Remote Designator [CSAT]', 'UBF Saif',
'Quad Bike', 'HuntIR', 'Quad Bike', 'HuntIR',
]; ];
@ -108,19 +108,28 @@ const parseWarLog = (lineArray, war) => {
const kill = { const kill = {
war: war._id, war: war._id,
time: getFullTimeDate(war.date, line.split(WHITESPACE)[5]), time: getFullTimeDate(war.date, line.split(WHITESPACE)[5]),
shooter: shooter ? shooter.name : null,
target: target ? target.name : null,
friendlyFire: shooter ? target.fraction === shooter.fraction : false,
fraction: shooter ? shooter.fraction : 'NONE',
}; };
if (shooter.magazine) { if (shooter) {
kill.magazine = shooter.magazine; kill.shooter = shooter.name;
kill.fraction = shooter.fraction;
if (target) {
kill.friendlyFire = (target.fraction === shooter.fraction);
}
if (shooter.magazine) {
kill.magazine = shooter.magazine;
}
if (shooter.vehicle) {
kill.shooterVehicle = shooter.vehicle;
}
} else {
kill.fraction = 'NONE';
} }
if (shooter.vehicle) {
kill.shooterVehicle = shooter.vehicle; if (target) {
} kill.target = target.name;
if (target.vehicle) { if (target.vehicle) {
kill.targetVehicle = target.vehicle; kill.targetVehicle = target.vehicle;
}
} }
stats.kills.push(kill); stats.kills.push(kill);
} }
@ -312,12 +321,15 @@ const getPlayerInfoFromString = (inputString) => {
let name; let name;
if (playerNameRegexMatch && playerNameRegexMatch.length >= 2) { if (playerNameRegexMatch && playerNameRegexMatch.length >= 2) {
name = playerNameRegexMatch[2].trim(); name = playerNameRegexMatch[2].trim();
// do not return player for 'Error: No unit' // do not return player for 'unbekannt' or 'Error: No unit'
if (!name && name === 'Error: No unit') { if (!name || name === 'unbekannt' || name === 'Error: No unit' || name === 'Selbstverschulden.') {
return; return;
} }
resPlayer.name = name; resPlayer.name = name;
} else {
return;
} }
// ADDITIONAL PLAYER NAMES // ADDITIONAL PLAYER NAMES
let additionalPlayerMatch; let additionalPlayerMatch;
while ((additionalPlayerMatch = playerNameRegex.exec(inputString)) !== null) { while ((additionalPlayerMatch = playerNameRegex.exec(inputString)) !== null) {
@ -341,7 +353,7 @@ const getPlayerInfoFromString = (inputString) => {
} }
if (side && side !== 'ENEMY') { if (side && side !== 'ENEMY') {
resPlayer.fraction = side === 'WEST' ? 'BLUFOR' : 'OPFOR'; resPlayer.fraction = (side === 'WEST') ? 'BLUFOR' : 'OPFOR';
} }
// MAGAZINE // MAGAZINE

View File

@ -1,6 +1,6 @@
{ {
"name": "opt-cc", "name": "opt-cc",
"version": "1.8.1", "version": "1.8.2",
"author": "Florian Hartwich <hardi@noarch.de>", "author": "Florian Hartwich <hardi@noarch.de>",
"private": true, "private": true,
"scripts": { "scripts": {

View File

@ -4219,11 +4219,13 @@
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true "bundled": true,
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@ -4236,15 +4238,18 @@
}, },
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true "bundled": true,
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true "bundled": true,
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true "bundled": true,
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
@ -4347,7 +4352,8 @@
}, },
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true "bundled": true,
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@ -4357,6 +4363,7 @@
"is-fullwidth-code-point": { "is-fullwidth-code-point": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
@ -4369,17 +4376,20 @@
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
}, },
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true "bundled": true,
"optional": true
}, },
"minipass": { "minipass": {
"version": "2.2.4", "version": "2.2.4",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
"yallist": "^3.0.0" "yallist": "^3.0.0"
@ -4396,6 +4406,7 @@
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
@ -4468,7 +4479,8 @@
}, },
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true "bundled": true,
"optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
@ -4478,6 +4490,7 @@
"once": { "once": {
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@ -4583,6 +4596,7 @@
"string-width": { "string-width": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",

View File

@ -1,4 +1,4 @@
import {Component, OnInit} from '@angular/core'; import {Component, OnDestroy, OnInit} from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router'; import {ActivatedRoute, Router} from '@angular/router';
import {Fraction} from '../../utils/fraction.enum'; import {Fraction} from '../../utils/fraction.enum';
@ -14,7 +14,7 @@ import {Location} from '@angular/common';
templateUrl: './decoration-overview.component.html', templateUrl: './decoration-overview.component.html',
styleUrls: ['./decoration-overview.component.css'] styleUrls: ['./decoration-overview.component.css']
}) })
export class DecorationOverviewComponent implements OnInit { export class DecorationOverviewComponent implements OnInit, OnDestroy {
decorations: Decoration[]; decorations: Decoration[];
@ -54,6 +54,10 @@ export class DecorationOverviewComponent implements OnInit {
}); });
}; };
ngOnDestroy() {
this.bottomSheet.dismiss();
}
switchFraction(value: any) { switchFraction(value: any) {
this.medals = this.decorations.filter(d => d.fraction === value && d.isMedal); this.medals = this.decorations.filter(d => d.fraction === value && d.isMedal);
this.ribbons = this.decorations.filter(d => d.fraction === value && !d.isMedal); this.ribbons = this.decorations.filter(d => d.fraction === value && !d.isMedal);

View File

@ -1,4 +1,4 @@
import {Component, OnInit} from '@angular/core'; import {Component, OnDestroy, OnInit} from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router'; import {ActivatedRoute, Router} from '@angular/router';
import {Fraction} from '../../utils/fraction.enum'; import {Fraction} from '../../utils/fraction.enum';
import {Rank} from '../../models/model-interfaces'; import {Rank} from '../../models/model-interfaces';
@ -12,7 +12,7 @@ import {UserListSheetComponent} from '../user-list-sheet/user-list-sheet.compone
templateUrl: './rank-overview.component.html', templateUrl: './rank-overview.component.html',
styleUrls: ['./rank-overview.component.css'] styleUrls: ['./rank-overview.component.css']
}) })
export class RankOverviewComponent implements OnInit { export class RankOverviewComponent implements OnInit, OnDestroy {
ranksOpfor: Rank[]; ranksOpfor: Rank[];
@ -37,6 +37,10 @@ export class RankOverviewComponent implements OnInit {
}); });
}; };
ngOnDestroy() {
this.bottomSheet.dismiss();
}
selectRow(rank: Rank) { selectRow(rank: Rank) {
this.bottomSheet.open(UserListSheetComponent, {data: {rank: rank}}); this.bottomSheet.open(UserListSheetComponent, {data: {rank: rank}});
} }

View File

@ -7,7 +7,7 @@
.scroll-btn-right { .scroll-btn-right {
top: 50px; top: 50px;
left: calc(100vw - 45px); left: calc(100vw - 50px);
} }
.scroll-btn mat-icon { .scroll-btn mat-icon {

View File

@ -1,4 +1,14 @@
import {Component, ElementRef, EventEmitter, Input, OnChanges, Output, ViewChild} from '@angular/core'; import {
AfterViewInit,
Component,
ElementRef,
EventEmitter,
Input,
OnChanges,
Output,
SimpleChanges,
ViewChild
} from '@angular/core';
import {Campaign} from '../../../models/model-interfaces'; import {Campaign} from '../../../models/model-interfaces';
import {LoginService} from '../../../services/app-user-service/login-service'; import {LoginService} from '../../../services/app-user-service/login-service';
@ -30,8 +40,10 @@ export class CampaignNavigationComponent implements OnChanges {
constructor(public loginService: LoginService) { constructor(public loginService: LoginService) {
} }
ngOnChanges() { ngOnChanges(changes: SimpleChanges) {
this.isRightScrollVisible = this.campaigns.length > 4; if (!changes.selectedCampaignId) {
this.isRightScrollVisible = this.campaigns.length > 4;
}
} }
select(campaign) { select(campaign) {