minecraft-modpack
Version:
Minecraft modpack creation made easy
132 lines (119 loc) • 5.74 kB
JavaScript
const anim = require("chalk-animation");
const link = require("terminal-link");
const request = require("request");
const rprogress = require("request-progress");
const inquirer = require("inquirer");
const chalk = require("chalk");
const fs = require("fs");
const path = require("path");
var storage;
const TFile = require("./TFile");
const Helpers = require("../lib/helpers");
function progress(progress) {
let units = Math.round(progress / 2);
return "[" + "=".repeat(Math.max(units-1, 0)) + ">" + " ".repeat(50 - units) + "] " + progress + "%";
}
class Mod{
constructor(obj){
for (let key in obj){
this[key] = obj[key];
}
}
static passStorage( storageInstance ){
storage = storageInstance;
TFile.passStorage(storage);
}
download(fileNameParam){
return new Promise( async(resolve, reject) => {
let addonId = this.id;
let addonName = this.addonName;
if( this.type === 2 ){
let decisionDownload = await inquirer.prompt([{
type: "confirm",
name: "decision",
message: chalk`{red Do you want to install optional dependency {cyan ${this.addonName}}?}`
}]);
if(!decisionDownload.decision) {
console.log(chalk.magenta`Optional dependecy download skipped.`);
resolve();
return;
}
}
let fileName;
if(fileNameParam){
fileName = fileNameParam;
} else {
let fileDecision = await inquirer.prompt([{
type: "list",
name: "fileName",
message: chalk.red.bold`Choose file: `,
choices: this.fileNames
}]);
let fileNameArr = fileDecision.fileName.split(". ");
fileNameArr.shift();
fileName = fileNameArr.join(". ");
}
let fileInstance = await (new TFile()).instance( this.files[ this.fileNamesPlain.indexOf(fileName) ] );
if( storage.gameConfig.mods.includes(`${addonId}-${fileInstance.fileName}`) && fs.existsSync( path.resolve( process.cwd(), "mods" ) ) && fs.existsSync( path.resolve( process.cwd(), "mods", fileInstance.fileName ) ) ){
storage.installedMods.push( addonId );
console.log(chalk`{yellow.bold File is already downloaded.} {cyan (Mod: ${addonName})}`);
if(!fileNameParam){
await Helpers.asyncForEach(fileInstance.dependencies, async dependency => {
if( !storage.installedMods.includes(dependency.id) ){
await dependency.download();
}
});
}
resolve();
return;
}
let modString = "";
let stringIndex = 0;
if (storage.gameConfig.mods.some( (e, i) => {
modString = e;
return e.startsWith( `${addonId}-` );
}) && !storage.gameConfig.mods.includes(`${addonId}-${fileInstance.fileName}`) ) {
let modStringArr = modString.split("-");
modStringArr.shift();
let modFileName = modStringArr.join("-");
fs.unlinkSync( path.resolve(process.cwd(), "mods", modFileName ));
storage.gameConfig.mods.splice(stringIndex, 1);
}
console.log(chalk`{blue [i]} {green Downloading mod} {red.bold ${addonName}} for Minecraft ${fileInstance.gameVersions.length > 1 ? "versions" : "version"} {yellow ${fileInstance.gameVersions.join(", ")}}`);
console.log(chalk`{blue [i]} {green CurseForge Link}:`, chalk.cyan(link(addonName, this.curseforgeURL, {
fallback: (text, url) => url
})));
let barLine = anim.rainbow("");
if (!fs.existsSync(path.resolve(process.cwd(), "mods"))) {
fs.mkdirSync(path.resolve(process.cwd(), "mods"));
}
let file = fs.createWriteStream(path.resolve(process.cwd(), "mods", fileName), "utf8");
rprogress(request(fileInstance.downloadURL))
.on("progress", function (state) {
barLine.replace( progress( (state.percent*100).toFixed(2) ) );
})
.on("error", function (e) {
console.log(chalk`{red [-]} Error: {rgb(0,255,0) ${e.message}}`);
reject();
})
.on("end", async function () {
barLine.replace( progress( (100).toFixed(2) ) );
console.log(chalk`{green [+]} {cyan Mod} {red.bold ${addonName}} {cyan successfully downloaded!}\n\n`);
file.close();
if (!fileNameParam){
storage.gameConfig.mods.push(`${addonId}-${fileInstance.fileName}`);
storage.installedMods.push( addonId );
await Helpers.asyncForEach(fileInstance.dependencies, async dependency => {
if( !storage.installedMods.includes(dependency.id) ){
await dependency.download();
}
});
}
fs.writeFileSync(storage.gameConfigPath, JSON.stringify(storage.gameConfig, undefined, 4));
resolve();
})
.pipe(file);
});
}
}
module.exports = Mod;