const config = require('./config') const axios = require('axios') const colors = require('colors/safe') const { Mod } = require('./classes') class Helpers { api_url(endpoint) { return `${config.api_base.endsWith('/') ? config.api_base : config.api_base+'/'}${endpoint.startsWith('/') ? endpoint.substring(1) : endpoint}` } async fetch_mod(name) { try { const mod = await axios.get(this.api_url(name)) return new Mod(name, mod.data) } catch(e) { this.error_out(`Unable to fetch mod ${name} - ${e}`) } } error_out(message) { console.log(`${colors.red('Fatal Error: ')}${message}`) process.exit() } async install_mod({argv, spinner, install}) { const mod = await this.fetch_mod(install) const version = argv.minecraft ? mod.get_version_by_minecraft(argv.minecraft, argv.type) : mod.get_version_by_id(argv.mod_version, argv.type) spinner.stop() if ( !version ) this.error_out('Unable to find mod version matching those criteria. To list available versions, use --list.') console.log('Installing mod version to repository...') mod.print_header() version.display() spinner.color = 'yellow' spinner.text = 'Download mod file (sorry about this)...' spinner.start() await version.wait(2000) await version.stage_download() spinner.stop() spinner.color = 'green' spinner.text = 'Verifying file staging...' spinner.start() if ( !(version.verify_stage()) ) { spinner.stop() this.error_out('We were unable to programmatically stage the downloaded JAR for this mod. Sorry.') } else { spinner.stop() console.log(colors.green('File staged successfully!')) } spinner.color = 'cyan' spinner.text = 'Preparing staged file for archive...' spinner.start() await version.archive_stage() spinner.color = 'green' spinner.text = 'Installing archive to repository...' await version.install_stage() spinner.stop() console.log(colors.green('Archive added to repository.')) version.print_solder() } list_installed_mods() { const { readdirSync } = require('fs') const getDirectories = source => readdirSync(source, { withFileTypes: true }).filter(dirent => dirent.isDirectory()).map(dirent => dirent.name) return getDirectories(`${config.repo}/mods`) } list_mod_versions(pkg) { const { readdirSync } = require('fs') const getFiles = source => readdirSync(source, { withFileTypes: true }).filter(dirent => dirent.isFile()).map(dirent => dirent.name) return getFiles(`${config.repo}/mods/${pkg}`) } } module.exports = exports = new Helpers