From 0afe35b67c3d6e94565520a0975fb73128222ca6 Mon Sep 17 00:00:00 2001 From: psihius Date: Sun, 14 Jul 2019 01:25:48 +0200 Subject: [PATCH 1/5] Updated research sync to handle infinite science and hopefully stop it from apply same research in a loop annoying everyone --- sharedPlugins/researchSync/dumpResearch.lua | 6 ++- sharedPlugins/researchSync/enableResearch.lua | 9 ++-- sharedPlugins/researchSync/index.js | 46 +++++++++++++------ 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/sharedPlugins/researchSync/dumpResearch.lua b/sharedPlugins/researchSync/dumpResearch.lua index 2ecfb17b..c179f8a4 100644 --- a/sharedPlugins/researchSync/dumpResearch.lua +++ b/sharedPlugins/researchSync/dumpResearch.lua @@ -3,7 +3,11 @@ local data = {}; for _, tech in pairs(game.forces["player"].technologies) do - table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level)); + if tech.prototype.max_level == 4294967295 then + table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level) .. ":true"); + else + table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level) .. ":false"); + end end game.write_file("researchSync.txt", table.concat(data, "\n"), false, 0) diff --git a/sharedPlugins/researchSync/enableResearch.lua b/sharedPlugins/researchSync/enableResearch.lua index 13004d13..e940f560 100644 --- a/sharedPlugins/researchSync/enableResearch.lua +++ b/sharedPlugins/researchSync/enableResearch.lua @@ -1,14 +1,13 @@ /silent-command if game.forces['player'].technologies['{tech_name}'] then - if game.forces['player'].technologies['{tech_name}'].researched ~= {tech_researched} then - game.forces['player'].technologies['{tech_name}'].researched = {tech_researched} - end - if game.forces['player'].technologies['{tech_name}'].level ~= {tech_level} then + if 1 == {tech_infinite} then game.forces['player'].technologies['{tech_name}'].level = {tech_level} + else + game.forces['player'].technologies['{tech_name}'].researched = true end script.raise_event(defines.events.on_research_finished, {research=game.forces['player'].technologies['{tech_name}'], by_script=true}) game.play_sound({path="utility/research_completed"}) - if game.forces['player'].technologies['{tech_name}'].researched == false then + if 1 == {tech_infinite} then game.print("Technology {tech_name} synced at level {tech_level}") else game.print("Technology {tech_name} synced") diff --git a/sharedPlugins/researchSync/index.js b/sharedPlugins/researchSync/index.js index e198e310..18a89a09 100644 --- a/sharedPlugins/researchSync/index.js +++ b/sharedPlugins/researchSync/index.js @@ -11,9 +11,11 @@ class ResearchSync { this.research = {}; setInterval(() => { - this.pollResearch(); - setTimeout(this.doSync.bind(this), 2000); - }, extras.researchSyncPollInterval || 5000); + this.pollResearch(); + setTimeout(this.doSync.bind(this), 5000); + }, + extras.researchSyncPollInterval || 30000 + ); } pollResearch() { @@ -44,19 +46,25 @@ class ResearchSync { let researchList = slaveData[instanceKey].meta.research; if(researchList){ Object.keys(researchList).forEach(researchName => { - if (isNaN(researchList[researchName].researched) || isNaN(researchList[researchName].level)) { + if (isNaN(researchList[researchName].researched) || isNaN(researchList[researchName].level) || isNaN(researchList[researchName].infinite)) { return; } if (needResearch.hasOwnProperty(researchName)) { - if (needResearch[researchName].researched === 0) { - needResearch[researchName].researched = parseInt(researchList[researchName].researched); - } - if (needResearch[researchName].level < parseInt(researchList[researchName].level)) { + if (needResearch[researchName].infinite === 1 + && needResearch[researchName].level < parseInt(researchList[researchName].level)) + { needResearch[researchName].level = parseInt(researchList[researchName].level); + } else if (needResearch[researchName].researched === 0 + && parseInt(researchList[researchName].researched) === 1) + { + needResearch[researchName].researched = 1 } - } - else { - needResearch[researchName] = {researched: parseInt(researchList[researchName].researched), level: parseInt(researchList[researchName].level)}; + } else { + needResearch[researchName] = { + researched: parseInt(researchList[researchName].researched), + level: parseInt(researchList[researchName].level), + infinite: parseInt(researchList[researchName].infinite) + }; } }); } @@ -71,6 +79,7 @@ class ResearchSync { command = command.replace("{tech_name}", key); command = command.replace("{tech_researched}", difference[key].researched); command = command.replace("{tech_level}", difference[key].level); + command = command.replace("{tech_infinite}", difference[key].infinite); } this.messageInterface(command); console.log('Unlocking '+ key + ': ' + (difference[key].researched === 0 ? 'false' : 'true') + ' and level ' + difference[key].level + ', was '+ (this.research[key].researched === 0 ? 'false' : 'true') + ' at level ' + this.research[key].level); @@ -93,9 +102,13 @@ class ResearchSync { let diff = {}; Object.keys(localResearch).forEach((key) => { if (remoteResearch.hasOwnProperty(key)) { - if ((localResearch[key].researched === 0 && localResearch[key].researched !== remoteResearch[key].researched) || localResearch[key].level < remoteResearch[key].level) { - if (!isNaN(remoteResearch[key].researched) && !isNaN(remoteResearch[key].level)) { - diff[key] = {researched: remoteResearch[key].researched, level: remoteResearch[key].level}; + if ( + (localResearch[key].infinite === 0 && localResearch[key].researched === 0 && remoteResearch[key].researched === 1) + || + (localResearch[key].infinite === 1 && localResearch[key].level < remoteResearch[key].level) + ) { + if (!isNaN(remoteResearch[key].researched) && !isNaN(remoteResearch[key].level) && !isNaN(remoteResearch[key].infinite)) { + diff[key] = {researched: remoteResearch[key].researched, level: remoteResearch[key].level, infinite: remoteResearch[key].infinite}; } } } @@ -120,8 +133,11 @@ class ResearchSync { ? 0 : 1); let level = parseInt(kv[2]); + let infinite = ('true' !== kv[3] + ? 0 + : 1); if (!isNaN(level) && !isNaN(researched)) { - this.research[name] = {researched: researched, level: level}; + this.research[name] = {researched: researched, level: level, infinite: infinite}; } } } From b666a909abd9d0b019de5a1c09c46f84ad406ba6 Mon Sep 17 00:00:00 2001 From: psihius Date: Sun, 14 Jul 2019 01:32:34 +0200 Subject: [PATCH 2/5] Formatting and logging adjustments --- sharedPlugins/researchSync/enableResearch.lua | 4 +- sharedPlugins/researchSync/index.js | 93 +++++++++++-------- 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/sharedPlugins/researchSync/enableResearch.lua b/sharedPlugins/researchSync/enableResearch.lua index e940f560..2e9da5c0 100644 --- a/sharedPlugins/researchSync/enableResearch.lua +++ b/sharedPlugins/researchSync/enableResearch.lua @@ -8,8 +8,8 @@ if game.forces['player'].technologies['{tech_name}'] then script.raise_event(defines.events.on_research_finished, {research=game.forces['player'].technologies['{tech_name}'], by_script=true}) game.play_sound({path="utility/research_completed"}) if 1 == {tech_infinite} then - game.print("Technology {tech_name} synced at level {tech_level}") + game.print("Infinite technology {tech_name} level {tech_level} unlocked") else - game.print("Technology {tech_name} synced") + game.print("Technology {tech_name} researched") end end diff --git a/sharedPlugins/researchSync/index.js b/sharedPlugins/researchSync/index.js index 18a89a09..ab676364 100644 --- a/sharedPlugins/researchSync/index.js +++ b/sharedPlugins/researchSync/index.js @@ -1,16 +1,16 @@ -const fs = require('fs'); +const fs = require('fs'); const needle = require("needle"); - class ResearchSync { - constructor(slaveConfig, messageInterface, extras = {}){ - this.config = slaveConfig; + constructor(slaveConfig, messageInterface, extras = {}) { + this.config = slaveConfig; this.messageInterface = messageInterface; - this.functions = this.loadFunctions(); - + this.functions = this.loadFunctions(); + this.research = {}; - setInterval(() => { + setInterval( + () => { this.pollResearch(); setTimeout(this.doSync.bind(this), 5000); }, @@ -25,11 +25,11 @@ class ResearchSync { doSync() { needle.get(this.config.masterIP + ':' + this.config.masterPort + '/api/slaves', (err, resp, slaveData) => { - if (err){ - this.messageInterface("Unable to post JSON master/api/slaves, master might be unreachable"); - return false; - } - if (resp.statusCode !== 200){ + if (err) { + this.messageInterface("Unable to post JSON master/api/slaves, master might be unreachable"); + return false; + } + if (resp.statusCode !== 200) { this.messageInterface("got error when calling slaves", resp.statusCode, resp.body); return; } @@ -40,58 +40,72 @@ class ResearchSync { if (slaveData[instanceKey].unique === this.config.unique.toString()) { return; } - if (!slaveData[instanceKey].hasOwnProperty('meta') || !slaveData[instanceKey].meta.hasOwnProperty('research')) { + if (!slaveData[instanceKey].hasOwnProperty('meta') + || !slaveData[instanceKey].meta.hasOwnProperty('research') + ) { return; } let researchList = slaveData[instanceKey].meta.research; - if(researchList){ + if (researchList) { Object.keys(researchList).forEach(researchName => { - if (isNaN(researchList[researchName].researched) || isNaN(researchList[researchName].level) || isNaN(researchList[researchName].infinite)) { + if ( + isNaN(researchList[researchName].researched) + || isNaN(researchList[researchName].level) + || isNaN(researchList[researchName].infinite)) + { return; } if (needResearch.hasOwnProperty(researchName)) { - if (needResearch[researchName].infinite === 1 - && needResearch[researchName].level < parseInt(researchList[researchName].level)) - { + if ( + needResearch[researchName].infinite === 1 + && needResearch[researchName].level < parseInt(researchList[researchName].level) + ) { needResearch[researchName].level = parseInt(researchList[researchName].level); - } else if (needResearch[researchName].researched === 0 - && parseInt(researchList[researchName].researched) === 1) - { + } else if ( + needResearch[researchName].researched === 0 + && parseInt(researchList[researchName].researched) === 1 + ) { needResearch[researchName].researched = 1 } } else { needResearch[researchName] = { researched: parseInt(researchList[researchName].researched), - level: parseInt(researchList[researchName].level), - infinite: parseInt(researchList[researchName].infinite) + level : parseInt(researchList[researchName].level), + infinite : parseInt(researchList[researchName].infinite) }; } }); - } - }); + } + }); let difference = this.filterResearchDiff(this.research, needResearch); Object.keys(difference).forEach((key) => { if (this.research[key]) { let command = this.functions.enableResearch; - while(command.includes("{tech_name}")){ + while (command.includes("{tech_name}")) { command = command.replace("{tech_name}", key); command = command.replace("{tech_researched}", difference[key].researched); command = command.replace("{tech_level}", difference[key].level); command = command.replace("{tech_infinite}", difference[key].infinite); } this.messageInterface(command); - console.log('Unlocking '+ key + ': ' + (difference[key].researched === 0 ? 'false' : 'true') + ' and level ' + difference[key].level + ', was '+ (this.research[key].researched === 0 ? 'false' : 'true') + ' at level ' + this.research[key].level); - this.messageInterface("Unlocking research: " + key + " at research state = " + (difference[key].researched === 0 ? 'false' : 'true') + ' and level ' + difference[key].level); + let log_message = ''; + if (difference[key].infinite === 1) { + log_message = 'Unlocking infinite research ' + key + 'at level ' + this.research[key].level; + } else { + log_message = 'Unlocking research ' + key; + } + console.log(log_message); + this.messageInterface(log_message); this.research[key] = difference[key]; } }); needle.post(this.config.masterIP + ':' + this.config.masterPort + '/api/editSlaveMeta', { instanceID: this.config.unique, - password: this.config.clientPassword, - meta: {research: this.research} + password : this.config.clientPassword, + meta : {research: this.research} }, {headers: {'x-access-token': this.config.masterAuthToken}}, function (err, resp) { // success? }); @@ -118,22 +132,23 @@ class ResearchSync { loadFunctions() { return { - dumpResearch: this.loadFunc("dumpResearch.lua"), - enableResearch: this.loadFunc("enableResearch.lua"), + dumpResearch : this.loadFunc("dumpResearch.lua"), + enableResearch: this.loadFunc("enableResearch.lua"), }; } loadFunc(path) { - return fs.readFileSync("sharedPlugins/researchSync/" + path,'utf-8').replace(/\r?\n|\r/g,' '); + return fs.readFileSync("sharedPlugins/researchSync/" + path, 'utf-8').replace(/\r?\n|\r/g, ' '); } - scriptOutput(data){ - let kv = data.split(":"); - let name = kv[0]; - let researched = ('true' !== kv[1] + + scriptOutput(data) { + let kv = data.split(":"); + let name = kv[0]; + let researched = ('true' !== kv[1] ? 0 : 1); - let level = parseInt(kv[2]); - let infinite = ('true' !== kv[3] + let level = parseInt(kv[2]); + let infinite = ('true' !== kv[3] ? 0 : 1); if (!isNaN(level) && !isNaN(researched)) { From 71870daabaf1a181eb73242c4d60bc26cb0a2f14 Mon Sep 17 00:00:00 2001 From: psihius Date: Sun, 14 Jul 2019 15:00:55 +0200 Subject: [PATCH 3/5] Made so mass tech sync does not make sounds or messages, only notifies at the end --- sharedPlugins/researchSync/enableResearch.lua | 24 ++++++++++--------- sharedPlugins/researchSync/index.js | 4 ++++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/sharedPlugins/researchSync/enableResearch.lua b/sharedPlugins/researchSync/enableResearch.lua index 2e9da5c0..155a8ecc 100644 --- a/sharedPlugins/researchSync/enableResearch.lua +++ b/sharedPlugins/researchSync/enableResearch.lua @@ -1,15 +1,17 @@ /silent-command if game.forces['player'].technologies['{tech_name}'] then - if 1 == {tech_infinite} then - game.forces['player'].technologies['{tech_name}'].level = {tech_level} - else - game.forces['player'].technologies['{tech_name}'].researched = true - end - script.raise_event(defines.events.on_research_finished, {research=game.forces['player'].technologies['{tech_name}'], by_script=true}) - game.play_sound({path="utility/research_completed"}) if 1 == {tech_infinite} then - game.print("Infinite technology {tech_name} level {tech_level} unlocked") - else - game.print("Technology {tech_name} researched") - end + game.forces['player'].technologies['{tech_name}'].level = {tech_level} + else + game.forces['player'].technologies['{tech_name}'].researched = true + end + script.raise_event(defines.events.on_research_finished, {research=game.forces['player'].technologies['{tech_name}'], by_script=true}) + if {notify} then + if 1 == {tech_infinite} then + game.print("Infinite technology {tech_name} level {tech_level} unlocked") + else + game.print("Technology {tech_name} researched") + end + game.play_sound({path="utility/research_completed"}) + end end diff --git a/sharedPlugins/researchSync/index.js b/sharedPlugins/researchSync/index.js index ab676364..adb811d5 100644 --- a/sharedPlugins/researchSync/index.js +++ b/sharedPlugins/researchSync/index.js @@ -80,6 +80,8 @@ class ResearchSync { let difference = this.filterResearchDiff(this.research, needResearch); + let count = Object.keys(difference).length; + let counter = 1; Object.keys(difference).forEach((key) => { if (this.research[key]) { let command = this.functions.enableResearch; @@ -88,6 +90,7 @@ class ResearchSync { command = command.replace("{tech_researched}", difference[key].researched); command = command.replace("{tech_level}", difference[key].level); command = command.replace("{tech_infinite}", difference[key].infinite); + command = command.replace("{notify}", count > 1 || count === counter ? 'false' : 'true'); } this.messageInterface(command); let log_message = ''; @@ -99,6 +102,7 @@ class ResearchSync { console.log(log_message); this.messageInterface(log_message); this.research[key] = difference[key]; + ++counter; } }); From 0b34f079544aa54dabb57df43a2fb5e839e05302 Mon Sep 17 00:00:00 2001 From: Arvids Godjuks Date: Sun, 14 Jul 2019 17:48:20 +0200 Subject: [PATCH 4/5] Dump only enabled research (#164) --- sharedPlugins/researchSync/dumpResearch.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sharedPlugins/researchSync/dumpResearch.lua b/sharedPlugins/researchSync/dumpResearch.lua index c179f8a4..94b61b0a 100644 --- a/sharedPlugins/researchSync/dumpResearch.lua +++ b/sharedPlugins/researchSync/dumpResearch.lua @@ -3,7 +3,7 @@ local data = {}; for _, tech in pairs(game.forces["player"].technologies) do - if tech.prototype.max_level == 4294967295 then + if tech.enabled == true and tech.prototype.max_level == 4294967295 then table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level) .. ":true"); else table.insert(data, tech.name .. ":" .. tostring(tech.researched) .. ":" .. tostring(tech.level) .. ":false"); From 3b814eeea41776e1bbc624808ac7335e82bdb2cf Mon Sep 17 00:00:00 2001 From: TechnoStrife Date: Mon, 15 Jul 2019 11:34:02 +0300 Subject: [PATCH 5/5] Fix a bug causing all slaves data gets cleared on master startup (#165) --- master.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master.js b/master.js index 276af857..cba39301 100644 --- a/master.js +++ b/master.js @@ -235,7 +235,7 @@ const db = {}; (function(){ try{ - let x = fs.statSync(path.resolve(config.databaseDirectory, "/slaves.json")); + let x = fs.statSync(path.resolve(config.databaseDirectory, "slaves.json")); console.log(`loading slaves from path.resolve(config.databaseDirectory, "slaves.json")`); slaves = JSON.parse(fs.readFileSync(path.resolve(config.databaseDirectory, "slaves.json"))); } catch (e){