Compare commits
4 Commits
0b4b9a6e77
...
e2938843b8
| Author | SHA1 | Date | |
|---|---|---|---|
| e2938843b8 | |||
| 2d1de103d8 | |||
| 54cfb222b9 | |||
| 68b9f56abd |
197
src/curse.js
197
src/curse.js
@ -1,114 +1,123 @@
|
|||||||
|
const { http, https } = require('follow-redirects');
|
||||||
|
const fs = require("fs");
|
||||||
|
const util = require("./util.js");
|
||||||
let mods_lock;
|
let mods_lock;
|
||||||
|
let downloadStarted = false;
|
||||||
|
let dep = new Map();
|
||||||
function main() {
|
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));
|
mods_lock = new Map(Object.entries(mods_lock));
|
||||||
if(global.config.mods.curse.length === 0) globCallback("curse", {});
|
if(global.config.mods.curse.length === 0) globCallback("curse", {});
|
||||||
global.config.mods.curse.forEach(mod => {
|
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=0`, (result) => { // resolve projectID
|
getData(`search?categoryId=0&gameId=432&gameVersion=${encodeURI(global.config.gameVersion)}&index=0&pageSize=15&searchFilter=${encodeURI(mod)}§ionId=6&sort=0`, (result) => { // resolve projectID
|
||||||
resolveDep(result[0].id, downloadMods);
|
let i = 0;
|
||||||
});
|
while(result[i].name !== mod) {
|
||||||
});
|
++i;
|
||||||
|
if(i === result.length) {
|
||||||
var resolveDepRecursionCount = [];
|
console.log(`cursemod ${mod} not found`);
|
||||||
function resolveDep(modId, callback, index) {
|
return;
|
||||||
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(String(modId), {fileId: rightVersion.id, url: rightVersion.downloadUrl, filename: rightVersion.fileName});
|
resolveDep(result[i].id, downloadMods);
|
||||||
rightVersion.dependencies.forEach(mod => {
|
|
||||||
if(mod.type !== 3) return
|
|
||||||
resolveDep(mod.addonId, callback, index);
|
|
||||||
});
|
|
||||||
--resolveDepRecursionCount[index];
|
|
||||||
if(resolveDepRecursionCount[index] == 0) callback();
|
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function getData(url, callback) {
|
var resolveDepRecursionCount = 0;
|
||||||
https.get(`https://addons-ecs.forgesvc.net/api/v2/addon/${url}`, (resp) => {
|
function resolveDep(modId, callback) {
|
||||||
let data = '';
|
++resolveDepRecursionCount;
|
||||||
resp.on('data', (chunk) => {
|
getData(`${modId}/files`, (files) => {
|
||||||
data += chunk;
|
let rightVersion;
|
||||||
});
|
for(let i = files.length - 1; i >= 0; --i) {
|
||||||
resp.on("end", () => {
|
let versionArray = files[i].gameVersion;
|
||||||
callback(JSON.parse(data));
|
if(versionMatch(versionArray, global.config.gameVersion) && (versionMatch(versionArray, global.config.modloader) || modloaderMatch(versionArray, global.config.modloader))) {
|
||||||
});
|
rightVersion = files[i];
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
function downloadMods() {
|
|
||||||
if(!downloadStarted) {
|
|
||||||
downloadStarted = true;
|
|
||||||
globCallback("curse", Object.fromEntries(dep));
|
|
||||||
dep.forEach((mod, modId) => {
|
|
||||||
let path = getPath(mod)
|
|
||||||
if(mods_lock.has(modId)) {
|
|
||||||
if(mods_lock.get(modId).fileId === mod.fileId) return;
|
|
||||||
fs.unlink(path, () => {});
|
|
||||||
}
|
|
||||||
downloadFile(mod.url, path);
|
|
||||||
});
|
|
||||||
mods_lock.forEach((mod, modId) => {
|
|
||||||
if(!dep.has(modId)) fs.unlink(getPath(mod), () => {})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function getPath(mod) {
|
|
||||||
return `mods/${mod.filename}`
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
response.pipe(file);
|
dep.set(String(modId), {fileId: rightVersion.id, url: rightVersion.downloadUrl, filename: rightVersion.fileName});
|
||||||
|
rightVersion.dependencies.forEach(mod => {
|
||||||
|
if(mod.type !== 3) return;
|
||||||
|
resolveDep(mod.addonId, callback);
|
||||||
});
|
});
|
||||||
|
--resolveDepRecursionCount;
|
||||||
|
if(resolveDepRecursionCount == 0) callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// close() is async, call cb after close completes
|
function getData(url, callback) {
|
||||||
file.on('finish', () => file.close());
|
https.get(`https://addons-ecs.forgesvc.net/api/v2/addon/${url}`, (resp) => {
|
||||||
|
let data = '';
|
||||||
// check for request error too
|
resp.on('data', (chunk) => {
|
||||||
request.on('error', (err) => {
|
data += chunk;
|
||||||
fs.unlink(dest, () => {});
|
|
||||||
throw err;
|
|
||||||
});
|
});
|
||||||
|
resp.on("end", () => {
|
||||||
|
callback(JSON.parse(data));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
file.on('error', (err) => { // Handle errors
|
function versionMatch(versionArray, gameVersion) {
|
||||||
fs.unlink(dest);
|
let gameVersionMatch = false;
|
||||||
throw err;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
function downloadMods() {
|
||||||
|
if(!downloadStarted) {
|
||||||
|
downloadStarted = true;
|
||||||
|
globCallback("curse", Object.fromEntries(dep));
|
||||||
|
dep.forEach((mod, modId) => {
|
||||||
|
let path = getPath(mod)
|
||||||
|
if(mods_lock.has(modId)) {
|
||||||
|
if(mods_lock.get(modId).fileId === mod.fileId) return;
|
||||||
|
fs.unlink(path, () => {});
|
||||||
|
}
|
||||||
|
downloadFile(mod.url, path);
|
||||||
|
});
|
||||||
|
mods_lock.forEach((mod, modId) => {
|
||||||
|
if(!dep.has(modId)) fs.unlink(getPath(mod), () => {})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function getPath(mod) {
|
||||||
|
return `mods/${mod.filename}`
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
response.pipe(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 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(mods_lock_p, callback) {
|
module.exports = function(mods_lock_p, callback) {
|
||||||
mods_lock = mods_lock_p;
|
mods_lock = mods_lock_p;
|
||||||
globCallback = callback;
|
globCallback = callback;
|
||||||
|
|||||||
14
src/git.js
14
src/git.js
@ -2,6 +2,7 @@ const git = require("gift");
|
|||||||
const childProcess = require("child_process");
|
const childProcess = require("child_process");
|
||||||
const fs = require("fs");
|
const fs = require("fs");
|
||||||
const g2js = require('gradle-to-js/lib/parser');
|
const g2js = require('gradle-to-js/lib/parser');
|
||||||
|
const util = require("./util.js");
|
||||||
let modsLock;
|
let modsLock;
|
||||||
let globCallback;
|
let globCallback;
|
||||||
let loopCounter = 0;
|
let loopCounter = 0;
|
||||||
@ -34,7 +35,7 @@ function main () {
|
|||||||
});
|
});
|
||||||
deleteMods.forEach((mod, url) => {
|
deleteMods.forEach((mod, url) => {
|
||||||
modsLock.delete(url);
|
modsLock.delete(url);
|
||||||
fs.unlink(modPath(mod.filename), (err) => {
|
fs.unlink(util.modPath(mod), (err) => {
|
||||||
if(err) throw err;
|
if(err) throw err;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -58,14 +59,13 @@ function build(repo, repoPath, gitRepo) {
|
|||||||
fs.readFile(`${repoPath}/gradle.properties`, "utf-8", (err, data) => {
|
fs.readFile(`${repoPath}/gradle.properties`, "utf-8", (err, data) => {
|
||||||
if(err) throw err;
|
if(err) throw err;
|
||||||
g2js.parseText(data).then((gradleProp) => {
|
g2js.parseText(data).then((gradleProp) => {
|
||||||
let modFile = `${gradleProp.archives_base_name}-${gradleProp.mod_version}.jar`;
|
if(newLock.filename != null) fs.unlink(util.modPath(newLock), (err) => {
|
||||||
if(newLock.filename != null) fs.unlink(`mods/${newLock.filename}`, (err) => {
|
|
||||||
if(err) throw err;
|
if(err) throw err;
|
||||||
});
|
});
|
||||||
fs.copyFile(`${buildPath}/${modFile}`, `mods/${modFile}`, (err) => {
|
newLock.filename = `${gradleProp.archives_base_name}-${gradleProp.mod_version}.jar`;
|
||||||
|
fs.copyFile(`${buildPath}/${newLock.filename}`, util.modPath(newLock), (err) => {
|
||||||
if(err) throw err;
|
if(err) throw err;
|
||||||
});
|
});
|
||||||
newLock.filename = modFile;
|
|
||||||
cbDecrease();
|
cbDecrease();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -83,10 +83,6 @@ function mayCb() {
|
|||||||
if(loopCounter <= 0) globCallback("git", Object.fromEntries(modsLock));
|
if(loopCounter <= 0) globCallback("git", Object.fromEntries(modsLock));
|
||||||
}
|
}
|
||||||
|
|
||||||
function modPath(filename) {
|
|
||||||
return `mods/${filename}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = (mods_lock_p, cb) => {
|
module.exports = (mods_lock_p, cb) => {
|
||||||
globCallback = cb;
|
globCallback = cb;
|
||||||
modsLock = mods_lock_p;
|
modsLock = mods_lock_p;
|
||||||
|
|||||||
7
src/util.js
Normal file
7
src/util.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
function modPath(mod) {
|
||||||
|
return `mods${mod.filename}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
modPath: modPath
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user