From eb6a78d2548fcaf4becfea0d32171ca2ac05d424 Mon Sep 17 00:00:00 2001 From: MrGeorgen Date: Wed, 6 Jan 2021 00:17:53 +0100 Subject: [PATCH] fixed modloader versions match --- .gitignore | 4 + package-lock.json | 18 +++++ package.json | 19 +++++ src/curse.js | 188 +++++++++++++++++++++++----------------------- src/main.js | 18 +++-- 5 files changed, 147 insertions(+), 100 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore index d333b23..b188da0 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,7 @@ dist # Stores VSCode versions used for testing VSCode extensions .vscode-test +/.eslintrc.js +/mods +/mods-lock.json +/mods.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d8b30ff --- /dev/null +++ b/package-lock.json @@ -0,0 +1,18 @@ +{ + "name": "minecraft-mod-packager", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==" + }, + "node-json-minify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-json-minify/-/node-json-minify-1.0.0.tgz", + "integrity": "sha1-e7NDL5ZYtr6x2ZP9XVOzyinQ15w=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..56a075b --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "minecraft-mod-packager", + "version": "1.0.0", + "description": "A minecraft mod package manager", + "main": "src/main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://git.redstoneunion.de/MrGeorgen/minecraft-mod-packager.git" + }, + "author": "MrGeorgen", + "license": "LGPL-3.0", + "dependencies": { + "follow-redirects": "^1.13.0", + "node-json-minify": "^1.0.0" + } +} diff --git a/src/curse.js b/src/curse.js index 6c4bf53..9149eb8 100644 --- a/src/curse.js +++ b/src/curse.js @@ -1,113 +1,111 @@ -const { http, https } = require('follow-redirects'); -const fs = require("fs"); -let downloadStarted = false; let mods_lock; -let dep = new Map(); -try { +function main() { + const { http, https } = require('follow-redirects'); + const fs = require("fs"); + let downloadStarted = false; + let dep = new Map(); mods_lock = new Map(Object.entries(mods_lock)); -} catch { - mods_lock = new Map; -} -global.config.mods.curse.forEach(mod => { - getData(`search?categoryId=0&gameId=432&gameVersion=${encodeURI(global.config.gameVersion)}&index=0&pageSize=15&searchFilter=${encodeURI(mod)}§ionId=6&sort=2`, (result) => { // resolve projectID - resolveDep(result[0].id, downloadMods); - }); -}); - -var resolveDepRecursionCount = []; -function resolveDep(modId, callback, index) { - if(index === undefined) index = resolveDepRecursionCount.push(0) - 1; - ++resolveDepRecursionCount[index]; - getData(`${modId}/files`, (files) => { - let rightVersion; - for(let i = files.length - 1; i >= 0; --i) { - let versionArray = files[i].gameVersion; - if(versionMatch(versionArray, global.config.gameVersion) && (versionMatch(versionArray, global.config.modloader) || modloaderMatch(versionArray, global.config.modloader))) { - rightVersion = files[i]; - dep.set(modId, {fileId: rightVersion.id, url: rightVersion.downloadUrl}); - } - } - rightVersion.dependencies.forEach(mod => { - resolveDep(mod.addonId, callback, index); - }); - --resolveDepRecursionCount[index]; - if(resolveDepRecursionCount[index] == 0) callback(); - }); -} - -function getData(url, callback) { - https.get(`https://addons-ecs.forgesvc.net/api/v2/addon/${url}`, (resp) => { - let data = ''; - resp.on('data', (chunk) => { - data += chunk; - }); - resp.on("end", () => { - callback(JSON.parse(data)); + global.config.mods.curse.forEach(mod => { + getData(`search?categoryId=0&gameId=432&gameVersion=${encodeURI(global.config.gameVersion)}&index=0&pageSize=1&searchFilter=${encodeURI(mod)}§ionId=6&sort=2`, (result) => { // resolve projectID + resolveDep(result[0].id, downloadMods); }); }); -} -function versionMatch(versionArray, gameVersion) { - let gameVersionMatch = false; - versionArray.forEach(version => { - gameVersionMatch = gameVersionMatch || version == gameVersion; - }); - return gameVersionMatch; -} - -function modloaderMatch(versionArray, modloaderVersion) { - versionArray.forEach(version => { - if(/^[a-zA-Z]+$/.test(version) && version != modloaderVersion) return false; - return true; - }); -} - -function downloadMods() { - if(!downloadStarted) { - downloadStarted = true; - save_mods_lock = Object.fromEntries(dep); - globCallback(); - dep.forEach((mod, modId) => { - getData(modId, (data) => { - let path = `mods/${data.name}.jar` - if(mods_lock.has(String(modId))) { - if(mods_lock.get(String(modId)).fileId === mod.fileId) return; - fs.unlink(path); + var resolveDepRecursionCount = []; + function resolveDep(modId, callback, index) { + if(index === undefined) index = resolveDepRecursionCount.push(0) - 1; + ++resolveDepRecursionCount[index]; + getData(`${modId}/files`, (files) => { + let rightVersion; + for(let i = files.length - 1; i >= 0; --i) { + let versionArray = files[i].gameVersion; + if(versionMatch(versionArray, global.config.gameVersion) && (versionMatch(versionArray, global.config.modloader) || modloaderMatch(versionArray, global.config.modloader))) { + rightVersion = files[i]; + dep.set(modId, {fileId: rightVersion.id, url: rightVersion.downloadUrl}); } - downloadFile(mod.url, path); + } + rightVersion.dependencies.forEach(mod => { + resolveDep(mod.addonId, callback, index); + }); + --resolveDepRecursionCount[index]; + if(resolveDepRecursionCount[index] == 0) callback(); + }); + } + + function getData(url, callback) { + https.get(`https://addons-ecs.forgesvc.net/api/v2/addon/${url}`, (resp) => { + let data = ''; + resp.on('data', (chunk) => { + data += chunk; + }); + resp.on("end", () => { + callback(JSON.parse(data)); }); }); } -} -function downloadFile(url, dest) { - let file = fs.createWriteStream(dest); - console.log(`downloading... ${url}`); - let request = https.get(url, (response) => { - // check if response is success - if (response.statusCode !== 200) { - throw response.statusCode; + function versionMatch(versionArray, gameVersion) { + let gameVersionMatch = false; + versionArray.forEach(version => { + gameVersionMatch = gameVersionMatch || version == gameVersion; + }); + return gameVersionMatch; + } + + function modloaderMatch(versionArray, modloaderVersion) { + for(let i = 0; i < versionArray.length; ++i) { + if(/^[a-zA-Z]+$/.test(versionArray[i]) && versionArray[i] != modloaderVersion) return false; } + return true; + } - response.pipe(file); - }); + function downloadMods() { + if(!downloadStarted) { + downloadStarted = true; + globCallback(Object.fromEntries(dep)); + dep.forEach((mod, modId) => { + getData(modId, (data) => { + let path = `mods/${data.name}.jar` + if(mods_lock.has(String(modId))) { + if(mods_lock.get(String(modId)).fileId === mod.fileId) return; + fs.unlink(path); + } + downloadFile(mod.url, path); + }); + }); + } + } - // close() is async, call cb after close completes - file.on('finish', () => file.close()); + function downloadFile(url, dest) { + let file = fs.createWriteStream(dest); + console.log(`downloading... ${url}`); + let request = https.get(url, (response) => { + // check if response is success + if (response.statusCode !== 200) { + throw response.statusCode; + } - // check for request error too - request.on('error', (err) => { - fs.unlink(dest); - throw err; - }); + response.pipe(file); + }); - file.on('error', (err) => { // Handle errors - fs.unlink(dest); - throw err; - }); + // close() is async, call cb after close completes + file.on('finish', () => file.close()); + + // check for request error too + request.on('error', (err) => { + fs.unlink(dest); + throw err; + }); + + file.on('error', (err) => { // Handle errors + fs.unlink(dest); + throw err; + }); + } } -module.exports = function(saved_mods_lock, mods_lock_p, callback) { - var save_mods_lock = saved_mods_lock; - var mods_lock = mods_lock_p; +module.exports = function(mods_lock_p, callback) { + mods_lock = mods_lock_p; + console.log(mods_lock); globCallback = callback; + main(); }; diff --git a/src/main.js b/src/main.js index 52c0908..c093f52 100644 --- a/src/main.js +++ b/src/main.js @@ -9,14 +9,22 @@ switch(process.argv.length) { default: throw "unexpected argument"; } -const modLockPath = "mods-lock.json"; let save_mods_lock = {}; -let modsLock = JSON.parse(fs.readFileSync(modLockPath, "utf-8")); -const numberCallback = 2; +const modLockPath = "mods-lock.json"; +let modsLock; +try { + modsLock = JSON.parse(fs.readFileSync(modLockPath, "utf-8")); +} +catch(err) { + if(err.errno !== -2) throw err; + modsLock = {curse: new Map()}; +} +const numberCallback = 1; let callbackCounter = 0; -require("./curse.js")(save_mods_lock.curse, modsLock.curse, finnish); +require("./curse.js")(modsLock.curse, finnish); -function finnish() { +function finnish(curse) { + save_mods_lock.curse = curse; if(++callbackCounter == numberCallback) { fs.writeFile(modLockPath, JSON.stringify(save_mods_lock), (err) => { if(err) throw err;