diff --git a/package.json b/package.json index 69163fe..b878320 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "test": "echo \"Error: no test specified\"", "babel-node": "babel-node --presets=es2015", "boot": "npm run babel-node -- ./src/index.js", - "api": "npm run babel-node -- ./api/index.js" + "api": "npm run babel-node -- ./api/index.js", + "update": "npm run babel-node -- ./update.js" }, "engines": { "node": ">= 6.x", @@ -22,9 +23,11 @@ "babel-cli": "^6.11.4", "babel-preset-es2015": "^6.13.1", "babel-preset-stage-0": "^6.5.0", + "directory-tree": "^1.1.1", "fs-extra": "^0.30.0", "jwt-decode": "^2.1.0", "mysql": "^2.11.1", + "nodegit": "^0.16.0", "node-pogo-protos": "^1.4.0", "pcrypt": "git+https://github.com/laverdet/pcrypt.git", "pogo-asset-downloader": "^0.3.1", diff --git a/updater.js b/updater.js new file mode 100644 index 0000000..80194ee --- /dev/null +++ b/updater.js @@ -0,0 +1,81 @@ +import fs from "fs"; +import fse from "fs-extra"; +import git from "nodegit"; +import dirTree from "directory-tree"; + +let tmpDir = "./tmp"; +let cloneDir = JSON.parse(fs.readFileSync("./package.json")).repository.url; + +let ignore = [".git", "cfg.js", "updater.js"]; + +function skip() { + return new Promise((resolve) => { + fse.removeSync(tmpDir); + console.log(`Skipped update to version ${newVersion}`); + resolve(); + }); +} + +function updateProject() { + return new Promise((resolve) => { + let newFiles = dirTree("./tmp"); + recurse(newFiles.children); + resolve(); + }); +} + +function recurse(parent) { + for (let key in parent) { + let name = parent[key].name; + if (ignore.includes(name)) continue; + let isDir = parent[key].hasOwnProperty("children"); + try { + if (!isDir) { + fse.outputFileSync(parent[key].path.substring(4), fs.readFileSync(parent[key].path)); + } + else { + recurse(parent[key].children); + } + } catch (e) { console.log(e); } + }; +} + +((() => new Promise((resolve) => { + console.log("Be aware about the updater is experimental!"); + console.log("Preparing to update.."); + setTimeout(() => { + fse.removeSync(tmpDir); + let currentVersion = JSON.parse(fs.readFileSync("./package.json")).version; + console.log(`Your current version is ${currentVersion}!`); + setTimeout(() => { + console.log("Fetching latest version.."); + git.Clone(cloneDir, tmpDir).then((res, rofl) => { + let newVersion = null; + try { + newVersion = JSON.parse(fs.readFileSync(`${tmpDir}/package.json`)).version; + } catch (e) { + console.log("Version check failed!"); + return resolve(); + } + if (currentVersion === newVersion) { + console.log(`You are already running the latest version ${currentVersion}!`); + skip().then(resolve); + return void 0; + } + else if (currentVersion > newVersion) { + console.log(`Your version ${currentVersion} is newer than ${newVersion}!`); + skip().then(resolve); + return void 0; + } + console.log(`Latest version is ${newVersion}`); + console.log(`Updating to version ${newVersion}`); + updateProject().then(() => { + fse.removeSync(tmpDir); + console.log("Update successfully completed, please restart!"); + resolve(); + }); + }); + }, 2e3); + + }, 1e3); +})))(); \ No newline at end of file