From 8acbd707f9e72dcfa7a86607d103df3551e0a702 Mon Sep 17 00:00:00 2001 From: Danielv123 Date: Tue, 11 Jul 2017 12:02:47 +0200 Subject: [PATCH] GET /api/getFactorioLocale now returns entire base en locale --- lib/getFactorioLocale.js | 29 ++++++++++++++ lib/getFactorioLocale.spec.js | 74 +++++++++++++++++++++++++++++++++++ master.js | 11 ++++-- package-lock.json | 5 +++ package.json | 1 + 5 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 lib/getFactorioLocale.js create mode 100644 lib/getFactorioLocale.spec.js diff --git a/lib/getFactorioLocale.js b/lib/getFactorioLocale.js new file mode 100644 index 00000000..8863ed81 --- /dev/null +++ b/lib/getFactorioLocale.js @@ -0,0 +1,29 @@ +const fs = require("fs"); +const ini = require("ini"); + +function getLocale(factorioDirectory, languageCode, callback){ + var localeFile = factorioDirectory + '/data/base/locale/' + languageCode + '/base.cfg'; + fs.readFile(localeFile, "utf8", (err, rawLocale) => { + callback(err, rawLocale); + }); +} + +function getLocaleAsObject(factorioDirectory, languageCode, callback){ + if(typeof factorioDirectory != "string" || typeof languageCode != "string" || typeof callback != "function"){ + throw "Error: wrong parameters provided"; + } + getLocale(factorioDirectory, languageCode, (err, rawLocale) => { + if(err){ + callback(err); + } else { + let processedLocale = ini.parse(rawLocale) + callback(undefined, processedLocale); + } + }); +} + +module.exports = { + asObject: getLocaleAsObject, +} + + diff --git a/lib/getFactorioLocale.spec.js b/lib/getFactorioLocale.spec.js new file mode 100644 index 00000000..084ce986 --- /dev/null +++ b/lib/getFactorioLocale.spec.js @@ -0,0 +1,74 @@ +const assert = require("assert"); +const getFactorioLocale = require("./getFactorioLocale"); + +describe("getFactorioLocale.js", () => { + describe("asObject()", () => { + it("requires 2 strings and a function as parameters", () => { + let validate = (err) => { + return err == "Error: wrong parameters provided" + } + let message = "getFactorioLocale is responding incorrectly to invalid arguments" + let callback = (err,object) => true; + + assert.throws(() => getFactorioLocale.asObject(), validate, message); + assert.throws(() => getFactorioLocale.asObject("hello", "I forgot my callback"), validate, message); + assert.throws(() => getFactorioLocale.asObject(undefined, undefined, callback), validate, message); + + // the proper way to do it + assert.doesNotThrow(() => getFactorioLocale.asObject("factorio_0.15.27", "en", callback), validate, message); + }); + it("returns a nested object with base game locale information", (done) => { + getFactorioLocale.asObject("factorio", "en", callback); + + function callback(err, object){ + assert.equal(typeof object, "object"); + assert.equal(object["entity-name"]["fish"], "Fish"); + assert.equal(object["entity-name"]["small-lamp"], "Lamp"); + Object.keys(object).forEach(key => { + // first level of the nested object is always an object + assert.equal(typeof object[key], "object"); + + Object.keys(object[key]).forEach(key2 => { + // second level of the nested object is always a string, nearly always truthy + if(key2 != "so-long-and-thanks-for-all-the-fish"){ + assert.ok(object[key][key2]); + assert.equal(typeof object[key][key2], "string"); + } + }); + }); + done(); + } + }); + it("has some duplicate keys", (done) => { + getFactorioLocale.asObject("factorio", "en", callback); + + function callback(err, object){ + let arrayOfKeys = []; + // collect all keys in a single array + Object.keys(object).forEach(key => { + arrayOfKeys.push(key); + Object.keys(object[key]).forEach(key2 => { + arrayOfKeys.push(key2); + }); + }); + + // check for duplicates + let duplicateKeys = []; + let i = 0; + arrayOfKeys.forEach(key => { + let o = 0; + arrayOfKeys.forEach(key2 => { + if(i != o && key == key2){ + duplicateKeys.push(key); + } + o++ + }); + i++; + }); + // we got 704 but this is a very unexact number + assert(duplicateKeys.length > 10) + done(); + } + }); + }); +}); \ No newline at end of file diff --git a/master.js b/master.js index aad0e7fc..58e1547f 100644 --- a/master.js +++ b/master.js @@ -2,7 +2,11 @@ debug = false; // constants -const masterModFolder = "./database/masterMods/" +const masterModFolder = "./database/masterMods/"; +var config = require('./config'); + +// homebrew modules +const getFactorioLocale = require("./lib/getFactorioLocale"); // Library for create folder recursively if it does not exist const mkdirp = require("mkdirp"); @@ -12,8 +16,6 @@ const deepmerge = require("deepmerge"); const path = require("path"); const fs = require("fs"); var nedb = require("nedb"); -// require config.json -var config = require('./config'); var express = require("express"); var ejs = require("ejs"); @@ -305,6 +307,9 @@ app.post("/api/getStats", function(req,res) { }); } }); +app.get("/api/getFactorioLocale", function(req,res){ + getFactorioLocale.asObject(config.factorioDirectory, "en", (err, factorioLocale) => res.send(factorioLocale)); +}); // endpoint for getting the chartjs library app.get("/chart.js", function(req, res) { diff --git a/package-lock.json b/package-lock.json index dfef3f22..398db5d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -720,6 +720,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, "inline-process-browser": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/inline-process-browser/-/inline-process-browser-1.0.0.tgz", diff --git a/package.json b/package.json index e4a96cf8..cbd976a8 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "fs-extra": "^1.0.0", "getmac": "^1.2.1", "hash-files": "^1.1.1", + "ini": "^1.3.4", "luamin": "^1.0.4", "mkdirp": "^0.5.1", "ncp": "^2.0.0",