fixed modloader versions match
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@ -107,3 +107,7 @@ dist
|
|||||||
# Stores VSCode versions used for testing VSCode extensions
|
# Stores VSCode versions used for testing VSCode extensions
|
||||||
.vscode-test
|
.vscode-test
|
||||||
|
|
||||||
|
/.eslintrc.js
|
||||||
|
/mods
|
||||||
|
/mods-lock.json
|
||||||
|
/mods.json
|
||||||
|
|||||||
18
package-lock.json
generated
Normal file
18
package-lock.json
generated
Normal file
@ -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="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
19
package.json
Normal file
19
package.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
188
src/curse.js
188
src/curse.js
@ -1,113 +1,111 @@
|
|||||||
const { http, https } = require('follow-redirects');
|
|
||||||
const fs = require("fs");
|
|
||||||
let downloadStarted = false;
|
|
||||||
let mods_lock;
|
let mods_lock;
|
||||||
let dep = new Map();
|
function main() {
|
||||||
try {
|
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));
|
mods_lock = new Map(Object.entries(mods_lock));
|
||||||
} catch {
|
global.config.mods.curse.forEach(mod => {
|
||||||
mods_lock = new Map;
|
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);
|
||||||
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));
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
function versionMatch(versionArray, gameVersion) {
|
var resolveDepRecursionCount = [];
|
||||||
let gameVersionMatch = false;
|
function resolveDep(modId, callback, index) {
|
||||||
versionArray.forEach(version => {
|
if(index === undefined) index = resolveDepRecursionCount.push(0) - 1;
|
||||||
gameVersionMatch = gameVersionMatch || version == gameVersion;
|
++resolveDepRecursionCount[index];
|
||||||
});
|
getData(`${modId}/files`, (files) => {
|
||||||
return gameVersionMatch;
|
let rightVersion;
|
||||||
}
|
for(let i = files.length - 1; i >= 0; --i) {
|
||||||
|
let versionArray = files[i].gameVersion;
|
||||||
function modloaderMatch(versionArray, modloaderVersion) {
|
if(versionMatch(versionArray, global.config.gameVersion) && (versionMatch(versionArray, global.config.modloader) || modloaderMatch(versionArray, global.config.modloader))) {
|
||||||
versionArray.forEach(version => {
|
rightVersion = files[i];
|
||||||
if(/^[a-zA-Z]+$/.test(version) && version != modloaderVersion) return false;
|
dep.set(modId, {fileId: rightVersion.id, url: rightVersion.downloadUrl});
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
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) {
|
function versionMatch(versionArray, gameVersion) {
|
||||||
let file = fs.createWriteStream(dest);
|
let gameVersionMatch = false;
|
||||||
console.log(`downloading... ${url}`);
|
versionArray.forEach(version => {
|
||||||
let request = https.get(url, (response) => {
|
gameVersionMatch = gameVersionMatch || version == gameVersion;
|
||||||
// check if response is success
|
});
|
||||||
if (response.statusCode !== 200) {
|
return gameVersionMatch;
|
||||||
throw response.statusCode;
|
}
|
||||||
|
|
||||||
|
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
|
function downloadFile(url, dest) {
|
||||||
file.on('finish', () => file.close());
|
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
|
response.pipe(file);
|
||||||
request.on('error', (err) => {
|
});
|
||||||
fs.unlink(dest);
|
|
||||||
throw err;
|
|
||||||
});
|
|
||||||
|
|
||||||
file.on('error', (err) => { // Handle errors
|
// close() is async, call cb after close completes
|
||||||
fs.unlink(dest);
|
file.on('finish', () => file.close());
|
||||||
throw err;
|
|
||||||
});
|
// 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) {
|
module.exports = function(mods_lock_p, callback) {
|
||||||
var save_mods_lock = saved_mods_lock;
|
mods_lock = mods_lock_p;
|
||||||
var mods_lock = mods_lock_p;
|
console.log(mods_lock);
|
||||||
globCallback = callback;
|
globCallback = callback;
|
||||||
|
main();
|
||||||
};
|
};
|
||||||
|
|||||||
18
src/main.js
18
src/main.js
@ -9,14 +9,22 @@ switch(process.argv.length) {
|
|||||||
default:
|
default:
|
||||||
throw "unexpected argument";
|
throw "unexpected argument";
|
||||||
}
|
}
|
||||||
const modLockPath = "mods-lock.json";
|
|
||||||
let save_mods_lock = {};
|
let save_mods_lock = {};
|
||||||
let modsLock = JSON.parse(fs.readFileSync(modLockPath, "utf-8"));
|
const modLockPath = "mods-lock.json";
|
||||||
const numberCallback = 2;
|
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;
|
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) {
|
if(++callbackCounter == numberCallback) {
|
||||||
fs.writeFile(modLockPath, JSON.stringify(save_mods_lock), (err) => {
|
fs.writeFile(modLockPath, JSON.stringify(save_mods_lock), (err) => {
|
||||||
if(err) throw err;
|
if(err) throw err;
|
||||||
|
|||||||
Reference in New Issue
Block a user