UNPKG

minecraft-modpack

Version:

Minecraft modpack creation made easy

132 lines (119 loc) 5.74 kB
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;