You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
4.9 KiB
155 lines
4.9 KiB
const col = require('colors/safe')
|
|
const axios = require('axios')
|
|
const config = require('./config')
|
|
|
|
class ModVersion {
|
|
#id = ''
|
|
#data = {}
|
|
#mod = {}
|
|
|
|
constructor(id, data, mod) {
|
|
this.#id = id
|
|
this.#data = data
|
|
this.#mod = mod
|
|
}
|
|
|
|
display() {
|
|
console.log(` ${col.cyan(this.#data.id)} ${col.blue('('+this.#data.type+')')}\t${col.yellow(new Date(this.#data.uploaded_at).toLocaleString())}\t\t${this.#data.name}`)
|
|
}
|
|
|
|
wait(ms) {
|
|
return new Promise(res => {
|
|
setTimeout(res, ms)
|
|
})
|
|
}
|
|
|
|
id_vers() {
|
|
return `mc.${this.#data.version}.id.${this.#id}`
|
|
}
|
|
|
|
async stage_download() {
|
|
const url = `https://www.curseforge.com/minecraft/mc-mods/${this.#mod.name()}/download/${this.#id}`
|
|
const responses = []
|
|
const br = await (require('puppeteer')).launch({headless: false})
|
|
const page = await br.newPage()
|
|
|
|
await page.goto(url);
|
|
|
|
const cookieLink = await page.$(`div[data-tracking-opt-in-accept="true"]`);
|
|
await this.wait(2000)
|
|
if ( cookieLink ) await cookieLink.click({clickCount: 1, delay: 500})
|
|
const reportLink = await page.$(`a[href="/minecraft/mc-mods/${this.#mod.name()}/download/${this.#id}/file"]`);
|
|
await page._client.send('Page.setDownloadBehavior', {behavior: 'allow', downloadPath: config.download_staging});
|
|
await reportLink.click({ clickCount: 1, delay: 100 });
|
|
await this.wait(5000)
|
|
await br.close()
|
|
}
|
|
|
|
verify_stage() {
|
|
return (require('fs')).existsSync(`${config.download_staging}/${this.#data.name.replace(/ /g, '+')}`)
|
|
}
|
|
|
|
async archive_stage() {
|
|
const fs = require('fs').promises
|
|
const proc = require('child_process')
|
|
await fs.mkdir(`${config.download_staging}/mods`)
|
|
await fs.rename(`${config.download_staging}/${this.#data.name.replace(/ /g, '+')}`, `${config.download_staging}/mods/${this.#data.name.replace(/ /g, '+')}`)
|
|
await new Promise((res, rej) => {
|
|
proc.exec(`cd ${config.download_staging} && zip -r ${this.#mod.name()}-${this.id_vers()}.zip ./mods && rm -rf mods`, (err, stout, sterr) => {
|
|
if ( err ) rej(err)
|
|
else res()
|
|
})
|
|
})
|
|
}
|
|
|
|
async install_stage() {
|
|
const fs = require('fs')
|
|
if ( !(await fs.existsSync(`${config.repo}`)) ) await fs.promises.mkdir(config.repo)
|
|
if ( !(await fs.existsSync(`${config.repo}/mods`))) await fs.promises.mkdir(`${config.repo}/mods`)
|
|
if ( !(await fs.existsSync(`${config.repo}/mods/${this.#mod.name()}`))) await fs.promises.mkdir(`${config.repo}/mods/${this.#mod.name()}`)
|
|
await fs.promises.rename(`${config.download_staging}/${this.#mod.name()}-${this.id_vers()}.zip`, `${config.repo}/mods/${this.#mod.name()}/${this.#mod.name()}-${this.id_vers()}.zip`)
|
|
}
|
|
|
|
print_solder() {
|
|
console.log(`Update Solder to have the mod: "${col.green(this.#mod.name())}" with version: "${col.blue(this.id_vers())}".`)
|
|
}
|
|
}
|
|
|
|
class Mod {
|
|
#data = {}
|
|
#cli_name = ''
|
|
|
|
constructor(name, data) {
|
|
this.#data = data
|
|
this.#cli_name = name
|
|
// console.log(data)
|
|
}
|
|
|
|
data() {
|
|
return this.#data
|
|
}
|
|
|
|
name() {
|
|
return this.#cli_name
|
|
}
|
|
|
|
version_info(minecraft) {
|
|
if ( !this.#data.versions ) return
|
|
return this.#data.versions[minecraft]
|
|
}
|
|
|
|
get_version_by_minecraft(minecraft, type = false) {
|
|
let vers = this.version_info(minecraft)
|
|
if ( !vers || vers.length < 1 ) return;
|
|
|
|
if ( type ) vers = vers.filter(x => x.type === type)
|
|
if ( vers.length < 1 ) return;
|
|
|
|
const sorted_vers = vers.sort((a, b) => a.id - b.id).reverse()
|
|
return new ModVersion(sorted_vers[0].id, sorted_vers[0], this)
|
|
}
|
|
|
|
get_version_by_id(id, type = false) {
|
|
console.log({id})
|
|
let vers = Object.values(this.#data.versions).flat(1)
|
|
if ( !vers || vers.length < 1 ) return;
|
|
|
|
if ( type ) vers = vers.filter(x => x.type === type)
|
|
if ( vers.length < 1 ) return
|
|
|
|
const id_vers = vers.filter(x => x.id === id)
|
|
if ( id_vers.length < 1 ) return;
|
|
return new ModVersion(id_vers[0].id, id_vers[0], this)
|
|
}
|
|
|
|
print_header() {
|
|
console.log(` ${col.green('Mod:')} ${this.#data.title}`)
|
|
console.log(` ${col.green('CLI Package Name:')} ${this.name()}`)
|
|
console.log(` ${col.green('URL:')} ${this.#data.urls.curseforge}`)
|
|
console.log(` ${col.green('Last Fetch:')} ${new Date(this.#data.last_fetch).toLocaleString()}`)
|
|
}
|
|
|
|
print_info() {
|
|
console.log(` ${col.green('Mod:')} ${this.#data.title}`)
|
|
console.log(` ${col.green('CLI Package Name:')} ${this.name()}`)
|
|
console.log(` ${col.green('URL:')} ${this.#data.urls.curseforge}`)
|
|
console.log(` ${col.green('Last Fetch:')} ${new Date(this.#data.last_fetch).toLocaleString()}`)
|
|
console.log(` ${col.green('Supported Versions:')}`)
|
|
|
|
const display_vers = {}
|
|
const vers_order = []
|
|
for ( const version in this.#data.versions ) {
|
|
display_vers[version] = ` - ${version}:\t ${col.yellow(this.#data.versions[version].reverse()[0].name)}`
|
|
vers_order.push(version)
|
|
}
|
|
|
|
vers_order.map( a => a.split('.').map( n => +n+100000 ).join('.') ).sort()
|
|
.map( a => a.split('.').map( n => +n-100000 ).join('.') ).reverse()
|
|
.forEach(x => console.log(display_vers[x]))
|
|
}
|
|
}
|
|
|
|
module.exports = exports = {
|
|
Mod
|
|
}
|