UNPKG

veaf-mission-creation-tools

Version:

A set of tools that help set up a and run dynamic missions

187 lines (164 loc) 6.49 kB
"use strict"; var fs = require("fs"); const fsPromises = fs.promises; const path = require('path'); String.prototype.regexLastIndexOf = function (regex) { var match = this.match(regex); return match ? this.lastIndexOf(match.slice(-1)) : -1; } function fitsIn(value, parameter) { if (!parameter) return true; if (!value) return false; const list = parameter.split(","); if (list && list.length > 1) { // this is a list const result = list.includes(value.toString()); return result; } const array = parameter.split("-"); if (array && array.length == 2) { // this is an array const min = Number(array[0]); const max = Number(array[1]); const result = (value >= min && value <= max); return result; } return value == parameter; } // parses a moment in the day into hours function parseMomentInDay(moment) { if (!moment) return null; switch (moment.toLowerCase()) { case "morning": return "0-11"; case "afternoon": return "12-23"; case "day": return "07-20"; case "night": return "21-06"; case "matin": return "0-11"; case "après-midi": return "12-23"; case "journée": return "07-20"; case "nuit": return "21-06"; } return null; } // parses a day of week string into a number function parseDayOfWeek(dayOfWeek) { if (!dayOfWeek) return null; switch (dayOfWeek.toLowerCase()) { case "1": return "1"; case "2": return "2"; case "3": return "3"; case "4": return "4"; case "5": return "5"; case "6": return "6"; case "7": return "7"; case "monday": return "1"; case "tuesday": return "2"; case "wednesday": return "3"; case "thursday": return "4"; case "friday": return "5"; case "saturday": return "6"; case "sunday": return "7"; case "mon": return "1"; case "tue": return "2"; case "wed": return "3"; case "thu": return "4"; case "fri": return "5"; case "sat": return "6"; case "sun": return "7"; case "lundi": return "1"; case "mardi": return "2"; case "mercredi": return "3"; case "jeudi": return "4"; case "vendredi": return "5"; case "samedi": return "6"; case "dimanche": return "7"; case "lun": return "1"; case "mar": return "2"; case "mer": return "3"; case "jeu": return "4"; case "ven": return "5"; case "sam": return "6"; case "dim": return "7"; } return null; } async function selectMission(parameters) { let { sourceFileName, targetFileName, configurationFile, trace, quiet } = parameters; if (!quiet) console.log(`DCS server startup mission selector starting`); if (trace) console.log(`parameters = ${JSON.stringify(parameters)}`); let date = new Date(); let currentMonth = date.getMonth() + 1; let currentDate = date.getDate(); let currentDay = date.getUTCDay(); let currentHour = date.getHours(); if (trace) { console.log(`currentMonth = ` + currentMonth); console.log(`currentDayOfMonth = ` + currentDate); console.log(`currentDayOfWeek = ` + currentDay); console.log(`currentHour = ` + currentHour); } // read the configuration file try { if (!fs.existsSync(configurationFile)) { console.error(`configuration file ${configurationFile} does not exist`); process.exit(-1); } else { //let configurationFolder = path.dirname(configurationFile) + "/"; let json = fs.readFileSync(configurationFile); if (!json) { console.error("cannot read file " + configurationFile); // no file ? return; } let data = JSON.parse(json); if (!data) { console.error("cannot parse file content " + configurationFile); // invalid content return; } let selectedMission = data.default; for (let i=0; i<data.moments.length; i++) { if (!data.moments[i]["//comment"]) { let { month, dayOfMonth, dayOfWeek, hour, mission, missions } = data.moments[i]; let nDayOfWeek = parseDayOfWeek(dayOfWeek); let nHour = parseMomentInDay(hour); if (month && !(fitsIn(currentMonth, month))) continue; if (dayOfMonth && !(fitsIn(currentDate, dayOfMonth))) continue; if (nDayOfWeek && !(fitsIn(currentDay, nDayOfWeek))) continue; if (nHour && !(fitsIn(currentHour, nHour))) continue; // everything fits, select this mission if (mission) { selectedMission = mission; } else if (missions) { // select a random mission in the missions list selectedMission = missions[Math.floor(Math.random() * missions.length)]; } if (!quiet) console.log(`current date ${date.toISOString()} fits in ` + JSON.stringify(data.moments[i])); break; } } // edit the file if (!quiet) console.log(`\n********************\nselecting mission ` + selectedMission+ `\n********************\n`); let sourceFileData = fs.readFileSync(sourceFileName, {encoding:'utf8', flag:'r'}); let matchResult = sourceFileData.match(`[^\\[]*\\[(\\d+)\\].*${selectedMission}.*`); let missionNumber = "01"; if (matchResult && matchResult.length >= 1) missionNumber = matchResult[1].toLowerCase(); if (trace) console.log(`setting mission number to ` + missionNumber); let matchpos = sourceFileData.regexLastIndexOf(/\["current"\]\s*=\s*(\d+),/g); if (matchpos) sourceFileData = sourceFileData.slice(0, matchpos) + sourceFileData.slice(matchpos).replace(/\["current"\]\s*=\s*(\d+),/, `["current"] = ${missionNumber},`); matchpos = sourceFileData.regexLastIndexOf(/\["listStartIndex"\]\s*=\s*(\d+),/g); if (matchpos) sourceFileData = sourceFileData.slice(0, matchpos) + sourceFileData.slice(matchpos).replace(/\["listStartIndex"\]\s*=\s*(\d+),/, `["listStartIndex"] = ${missionNumber},`); let writeStream = fs.createWriteStream(targetFileName); writeStream.write(sourceFileData, 'utf8'); writeStream.on('finish', () => { if (!quiet) console.log(`wrote all data to ${targetFileName}`); }); writeStream.end(); } } catch (error) { console.error(error); } if (!quiet) console.log("All done !"); } module.exports.selectMission = selectMission;