FC-softwares/baseball-scoreboard

View on GitHub
updateData.js

Summary

Maintainability
A
1 hr
Test Coverage
const fs = require('fs');
const { updateActive, updateOfficial, updateSettings, resetAllStaff } = require("./updateActive");
 
function updateData(data,socket){
fs.readFile(__dirname + '/app/json/data.json', 'utf8', (err, data_old) => {
if (err) throw err;
var json;
if (typeof data === 'string') json = JSON.parse(data)
else json = data
var data_old_obj = JSON.parse(data_old), toBeSent = {};
Object.entries(json).forEach(entry => {
const [indx, element] = entry;
switch (element) {
case '+':plusChanges(indx, data_old_obj, toBeSent);break;
case '-':minusChanges(indx, data_old_obj, toBeSent);break;
case '0':zeroChanges(indx, data_old_obj, toBeSent);break;
case 'toggle':({ data_old_obj, toBeSent } = toggleChanges(indx, data_old_obj, toBeSent));break;
default:
if (indx.startsWith('Teams.') && (indx.endsWith('.Name')||indx.endsWith('.Color')||indx.endsWith(".Short"))) ({ data_old_obj, toBeSent } = nameColorChange(data_old_obj, element, toBeSent, indx.split('.')[1] + '.' + indx.split('.')[2]));
else if (indx.startsWith('Teams.') && indx.endsWith('.Logo')) updateLogo(indx, element, data_old_obj, toBeSent)
else {data_old_obj[indx] = element;toBeSent[indx] = element;}
}
});
toBeSent = {...toBeSent,Teams: {...toBeSent?.Teams,Away: {...toBeSent?.Teams?.Away,Score: data_old_obj.Teams.Away.Score,},Home: {...toBeSent?.Teams?.Home,Score: data_old_obj.Teams.Home.Score,},},Int: data_old_obj.Int,Inning: data_old_obj.Inning, Arrow: data_old_obj.Arrow,};
fs.writeFile(__dirname + '/app/json/data.json', JSON.stringify(data_old_obj, null, 4), (err) => {if (err) throw err;});
socket.emit('update', toBeSent);
socket.broadcast.emit('update', toBeSent);
});
}
 
function updateLogo(indx, element, data_old_obj, toBeSent) {
fs.writeFile(__dirname + '/app/img/' + indx.split('.')[1] + 'Logo.json', JSON.stringify(element, null, 4), (err) => {
if (err)
throw err;
console.log('The file has been saved!');
});
data_old_obj.Teams[indx.split('.')[1]].Logo = element;
toBeSent.Teams = { ...toBeSent.Teams, [indx.split('.')[1]]: { ...toBeSent.Teams[indx.split('.')[1]], Logo: element, }, };
}
 
function nameColorChange(data_old_obj, element, toBeSent, mix) {
const [team, nameOrColor] = mix.split('.');
data_old_obj.Teams[team][nameOrColor] = element;
if (toBeSent.Teams === undefined)
toBeSent.Teams = {};
if (toBeSent.Teams[team] === undefined)
toBeSent.Teams[team] = {};
toBeSent.Teams[team][nameOrColor] = element;
return { data_old_obj, toBeSent };
}
 
Function `plusChanges` has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
function plusChanges(indx, data_old_obj, toBeSent) {
switch(indx) {
case 'Ball': if (data_old_obj.Ball < 3){data_old_obj[indx]++; toBeSent.Ball = data_old_obj.Ball;} break;
case 'Strike':
if (data_old_obj.Strike < 2) {
data_old_obj[indx]++;
toBeSent.Strike = data_old_obj.Strike;
} else {
toBeSent.Strike = 0; data_old_obj.Strike = 0; toBeSent.Ball = 0; data_old_obj.Ball = 0;
OutCheck(data_old_obj, toBeSent);
}
break;
case 'Out':
OutCheck(data_old_obj, toBeSent);
break;
case 'Teams.Away.Score': var { i, ScoreATmp } = scorePlus(data_old_obj, 'Away','A'); break;
case 'Teams.Home.Score': var { i, ScoreHTmp } = scorePlus(data_old_obj, 'Home','H'); data_old_obj.Teams.Home.Score = ScoreHTmp; break;
case 'Inning': data_old_obj.Inning++, data_old_obj.Int[data_old_obj.Inning] = { A: 0, H: 0 }; break;
}
return { ScoreATmp, ScoreHTmp, i };
}
 
function OutCheck(data_old_obj, toBeSent) {
if (data_old_obj.Out < 2) {
data_old_obj.Out++;
toBeSent.Out = data_old_obj.Out;
}
else
autoChangePlus(data_old_obj, toBeSent);
}
 
function autoChangePlus(data_old_obj, toBeSent) {
data_old_obj.Out = 0;
data_old_obj.Strike = 0;
data_old_obj.Ball = 0;
data_old_obj.Bases = { 1: false, 2: false, 3: false };
toBeSent.Out = data_old_obj.Out;
toBeSent.Strike = 0;
toBeSent.Ball = 0;
toBeSent.Bases = { 1: false, 2: false, 3: false };
ArrowCheck(data_old_obj);
toBeSent.Arrow = data_old_obj.Arrow;
toBeSent.Inning = data_old_obj.Inning;
toBeSent.Int = data_old_obj.Int;
}
 
function scorePlus(data_old_obj, team,short) {
data_old_obj.Int[data_old_obj.Inning][short]++;
var ScoreATmp = 0;
for (var i = 1; i <= data_old_obj.Inning; i++) {
ScoreATmp += data_old_obj.Int[i][short];
}
data_old_obj.Teams[team].Score = ScoreATmp;
let ScoreHTmp = ScoreATmp;
return { i, ScoreATmp, ScoreHTmp };
}
 
Function `minusChanges` has a Cognitive Complexity of 8 (exceeds 5 allowed). Consider refactoring.
function minusChanges(indx, data_old_obj, toBeSent) {
var i, ScoreATmp = 0, ScoreHTmp = 0;
switch(indx) {
case 'Teams.Home.Score':
minusScore(data_old_obj, 'Home', 'H', toBeSent);
break;
case 'Teams.Away.Score':
minusScore(data_old_obj, 'Away', 'A', toBeSent);
break;
case 'Inning':
if (data_old_obj.Inning > 1) {
delete data_old_obj.Int[data_old_obj.Inning], data_old_obj.Inning--;
for (i = 1; i <= data_old_obj.Inning; i++) ScoreATmp += data_old_obj.Int[i].A, ScoreHTmp += data_old_obj.Int[i].H;
data_old_obj.Teams.Away.Score = ScoreATmp, data_old_obj.Teams.Home.Score = ScoreHTmp;
}
break;
default:
if (data_old_obj[indx] > 0) data_old_obj[indx]--, toBeSent[indx] = data_old_obj[indx];
break;
}
return { ScoreATmp, ScoreHTmp, i };
}
 
 
function minusScore(data_old_obj, team, short) {
if (data_old_obj.Int[data_old_obj.Inning][short] > 0) {
data_old_obj.Int[data_old_obj.Inning][short]--
data_old_obj.Teams[team].Score--;
}
}
 
function zeroChanges(indx, data_old_obj, toBeSent) {
if (indx === 'Inning') {
data_old_obj[indx] = 1;
data_old_obj.Int = { 1: { A: 0, H: 0 } };
data_old_obj.Teams.Away.Score = 0;
data_old_obj.Teams.Home.Score = 0;
toBeSent.Int = data_old_obj.Int;
toBeSent.Teams = {...toBeSent?.Teams,Away: {...toBeSent?.Teams?.Away,Score: 0},Home: {...toBeSent?.Teams?.Home,Score: 0}};
toBeSent.Inning = data_old_obj.Inning;
} else if (indx === 'Teams.Away.Score') {
zeroScore(data_old_obj, 'Away', 'A');
} else if (indx === 'Teams.Home.Score') {
zeroScore(data_old_obj, 'Home', 'H');
} else {
data_old_obj[indx] = 0;
toBeSent[indx] = data_old_obj[indx];
}
return;
}
 
function zeroScore(data_old_obj, team, short) {
data_old_obj.Teams[team].Score = 0;
for (var i = 1; i <= data_old_obj.Inning; i++)
data_old_obj.Int[i][short] = 0;
return;
}
 
function toggleChanges(indx, data_old_obj, toBeSent) {
if (['1', '2', '3'].includes(indx) && toBeSent.Bases === undefined) toBeSent.Bases = {};
switch (indx) {
case '1': case '2': case '3': toggleBase(data_old_obj, toBeSent, indx);break;
case 'Auto_Change_Inning':
data_old_obj = { ...data_old_obj, Bases: { 1: false, 2: false, 3: false }, Ball: 0, Strike: 0, Out: 0};
ArrowCheck(data_old_obj);
toBeSent = { ...toBeSent, Bases: { 1: false, 2: false, 3: false }, Ball: 0, Strike: 0, Out: 0, Arrow: data_old_obj.Arrow, Inning: data_old_obj.Inning, Int: data_old_obj.Int };
break;
case 'Reset_All':
data_old_obj = {Teams: {Away: { Name: 'AWAY', Score: 0, Color: '#000000', Short: "AWY" },Home: { Name: 'HOME', Score: 0, Color: '#000000', Short: "HME" },},Ball: 0,Strike: 0,Out: 0,Inning: 1,Arrow: 1,Bases: { 1: false, 2: false, 3: false },Int: { 1: { A: 0, H: 0 } },};
toBeSent = {Teams: {Away: { Name: 'AWAY', Score: 0, Color: '#000000', Short: "AWY", Logo: "" },Home: { Name: 'HOME', Score: 0, Color: '#000000', Short: "HME", Logo: "" },},Ball: 0,Strike: 0,Out: 0,Inning: 1,Arrow: 1,Bases: { 1: false, 2: false, 3: false },Int: { 1: { A: 0, H: 0 } },};
fs.writeFileSync(__dirname + '/app/img/AwayLogo.json', JSON.stringify(""));
fs.writeFileSync(__dirname + '/app/img/HomeLogo.json', JSON.stringify(""));
break;
default: break;
}
return { data_old_obj, toBeSent };
}
 
function ArrowCheck(data_old_obj) {
if (data_old_obj.Arrow === 1)
data_old_obj.Arrow = 2;
else {
data_old_obj.Arrow = 1;
data_old_obj.Inning++;
data_old_obj.Int[data_old_obj.Inning] = { A: 0, H: 0 };
}
}
 
function toggleBase(data_old_obj, toBeSent, indx) {
data_old_obj.Bases[indx] = !data_old_obj.Bases[indx];
toBeSent.Bases[indx] = data_old_obj.Bases[indx];
}
 
exports.updateActive = updateActive;
exports.updateData = updateData;
exports.updateOfficial = updateOfficial;
exports.updateSettings = updateSettings;
exports.resetAllStaff = resetAllStaff;