From e67995d6a05a60ecb09dc6c720c4990af2e4ec09 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Wed, 12 Aug 2020 21:14:00 +0200 Subject: [PATCH] started making BuildTechnic command. not yet working local files aren't being installed for no good reason whatsoever mod loader not getting installed yet --- build.gradle.kts | 3 +- .../modpacktools/commands/BuildTechnic.kt | 90 +++++++++++++++++++ .../modpacktools/commands/BuildTwitch.kt | 45 +--------- .../modpacktools/commands/DownloadMods.kt | 17 ++-- .../modpacktools/util/addonscript/ASUtil.kt | 53 +++++++++++ 5 files changed, 160 insertions(+), 48 deletions(-) create mode 100644 src/main/kotlin/ley/anvil/modpacktools/commands/BuildTechnic.kt create mode 100644 src/main/kotlin/ley/anvil/modpacktools/util/addonscript/ASUtil.kt diff --git a/build.gradle.kts b/build.gradle.kts index 9bba177..d95ea33 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -46,7 +46,7 @@ dependencies { "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.3.8", //IO - "com.squareup.okhttp3:okhttp:4.8.0", //HTTP client + "com.squareup.okhttp3:okhttp:4.8.1", //HTTP client "com.moandjiezana.toml:toml4j:0.7.2", //Config file parser "org.apache.commons:commons-csv:1.8", "com.j2html:j2html:1.4.0", //HTML builder @@ -68,6 +68,7 @@ dependencies { //This exists so options can be set for test compile and compile at once val kOptions = {obj: GroovyObject -> + //This is sorta garbage, but if i would do this the proper way Intelli'ntJ would think its an error even tho it is not obj.withGroovyBuilder { "kotlinOptions" { diff --git a/src/main/kotlin/ley/anvil/modpacktools/commands/BuildTechnic.kt b/src/main/kotlin/ley/anvil/modpacktools/commands/BuildTechnic.kt new file mode 100644 index 0000000..d5868a8 --- /dev/null +++ b/src/main/kotlin/ley/anvil/modpacktools/commands/BuildTechnic.kt @@ -0,0 +1,90 @@ +package ley.anvil.modpacktools.commands + +import ley.anvil.addonscript.wrapper.FileOrLink +import ley.anvil.modpacktools.CONFIG +import ley.anvil.modpacktools.MPJH +import ley.anvil.modpacktools.TERMC +import ley.anvil.modpacktools.command.CommandReturn +import ley.anvil.modpacktools.command.CommandReturn.Companion.fail +import ley.anvil.modpacktools.command.ICommand +import ley.anvil.modpacktools.command.LoadCommand +import ley.anvil.modpacktools.util.addonscript.installFile +import ley.anvil.modpacktools.util.downloadFiles +import ley.anvil.modpacktools.util.fPrintln +import ley.anvil.modpacktools.util.toZip +import net.sourceforge.argparse4j.ArgumentParsers +import net.sourceforge.argparse4j.inf.ArgumentParser +import net.sourceforge.argparse4j.inf.Namespace +import org.apache.commons.io.FileUtils +import java.io.File +import java.io.FileOutputStream +import java.net.URL +import java.util.zip.ZipOutputStream + +@LoadCommand +object BuildTechnic : ICommand { + override val name = "buildtechnic" + override val helpMessage = "Builds a technic export" + + override val parser: ArgumentParser = ArgumentParsers.newFor("BuildTechnic") + .build() + .description(helpMessage) + + private val tempDir by lazy {File(CONFIG.config.pathOrException("Locations/tempDir"))} + private val tmp: File by lazy {File(tempDir, "technic")} + private val download: File by lazy {File(tempDir, "download")} + val srcDir by lazy {File(CONFIG.config.pathOrException("Locations/src"))} + + override fun execute(args: Namespace): CommandReturn { + //Setup dirs + arrayOf(tmp, download) + .forEach { + it.mkdirs() + FileUtils.cleanDirectory(it) + } + + val fileList = mutableListOf() + val toDownload = mutableMapOf>() + MPJH.asWrapper!!.defaultVersion.getRelations {"client" in it.options}.forEach { + if(it.hasFile()) + fileList.add(it.file.get()) + } + + fileList.forEach { + when { + it.isFile -> { + if(!it.isASDirSet) + it.setASDir(srcDir) + + if(it.file.exists()) + installFile(it.installer, it.file, tmp).printf() + } + it.isURL -> toDownload[it.url] = it.installer to download + else -> return fail("${it.link} is neither a file nor an URL") + } + } + + downloadFiles( + toDownload.mapValues {it.value.second}, + { + if(it.exception == null) { + fPrintln("downloaded file ${it.file}", TERMC.brightBlue) + installFile(toDownload[it.url]!!.first, it.file, tmp).printf() + } else { + fPrintln("ERROR DOWNLOADING ${it.url}") + it.exception.printStackTrace() + } + }, + resolveFileName = true + ) + + fPrintln("Making Zip", TERMC.brightGreen) + ZipOutputStream(FileOutputStream("build/${MPJH.asWrapper!!.json.id}-${MPJH.asWrapper!!.defaultVersion.versionName}-technic.zip")) + .use { + tmp.toZip(it) + it.flush() + } + + return CommandReturn.success("Built export") + } +} diff --git a/src/main/kotlin/ley/anvil/modpacktools/commands/BuildTwitch.kt b/src/main/kotlin/ley/anvil/modpacktools/commands/BuildTwitch.kt index 171361d..3b26cc8 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/commands/BuildTwitch.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/commands/BuildTwitch.kt @@ -8,10 +8,10 @@ import ley.anvil.modpacktools.command.CommandReturn.Companion.fail import ley.anvil.modpacktools.command.CommandReturn.Companion.success import ley.anvil.modpacktools.command.ICommand import ley.anvil.modpacktools.command.LoadCommand +import ley.anvil.modpacktools.util.addonscript.installFile import ley.anvil.modpacktools.util.downloadFiles import ley.anvil.modpacktools.util.fPrintln import ley.anvil.modpacktools.util.manifest.convertAStoManifest -import ley.anvil.modpacktools.util.mergeTo import ley.anvil.modpacktools.util.toZip import net.sourceforge.argparse4j.ArgumentParsers import net.sourceforge.argparse4j.impl.Arguments.storeTrue @@ -49,6 +49,7 @@ object BuildTwitch : ICommand { val dir = File("./build") val toDownload = mutableMapOf>() val srcDir by lazy {File(CONFIG.config.pathOrException("Locations/src"))} + val overrides by lazy {File(tmp, "overrides")} dir.mkdirs() tmp.mkdirs() downloadDir.mkdirs() @@ -65,7 +66,7 @@ object BuildTwitch : ICommand { uf.key.setASDir(srcDir) val file = uf.key.file if(file.exists()) { - installFile(uf.value, file).apply {println(this)} + installFile(uf.value, file, overrides).printf() } } else if(uf.key.isURL) { val filePath = URL(uf.key.link) @@ -79,7 +80,7 @@ object BuildTwitch : ICommand { toDownload.mapValues {it.value.first}, { fPrintln("downloaded file ${it.file}", TERMC.brightBlue) - fPrintln(installFile(toDownload[it.url]!!.second, it.file), TERMC.green) + installFile(toDownload[it.url]!!.second, it.file, overrides).printf() }, false ) @@ -91,42 +92,4 @@ object BuildTwitch : ICommand { zip.close() return success("Successfully built twitch zip") } - - private fun installFile(installer: String, file: File): String { - when { - installer == "internal.override" -> { - when { - file.extension == "zip" -> { - TODO("unzip to ./.mpt/twitch/overrides") - } - - file.isDirectory -> { - FileUtils.copyDirectory(file, File(tmp, "overrides")) - } - - else -> { - return "Only zip files can be used with 'internal.override'" - } - } - } - - installer.startsWith("internal.dir") -> { - val parts = installer.split(":") - if(parts.size >= 2) { - FileUtils.copyFile(file, File(File(tmp, "overrides"), parts[1]) mergeTo file) - } else { - return "No directory was given for installer 'internal.dir'" - } - } - - installer.startsWith("internal.zip") -> { - TODO() - } - - else -> { - return "The installer '$installer' is not supported for Twitch export" - } - } - return "installed $file" - } } diff --git a/src/main/kotlin/ley/anvil/modpacktools/commands/DownloadMods.kt b/src/main/kotlin/ley/anvil/modpacktools/commands/DownloadMods.kt index 49ee00f..dea129a 100644 --- a/src/main/kotlin/ley/anvil/modpacktools/commands/DownloadMods.kt +++ b/src/main/kotlin/ley/anvil/modpacktools/commands/DownloadMods.kt @@ -8,6 +8,7 @@ import ley.anvil.modpacktools.command.ICommand import ley.anvil.modpacktools.command.LoadCommand import ley.anvil.modpacktools.util.DownloadFileTask import ley.anvil.modpacktools.util.downloadFiles +import ley.anvil.modpacktools.util.fPrintln import net.sourceforge.argparse4j.ArgumentParsers import net.sourceforge.argparse4j.impl.Arguments.storeTrue import net.sourceforge.argparse4j.impl.type.FileArgumentType @@ -44,7 +45,12 @@ object DownloadMods : ICommand { override fun execute(args: Namespace): CommandReturn { val json = MPJH.asWrapper val fileList = mutableListOf() - for(rel in json!!.defaultVersion!!.getRelations(arrayOf("client"), if(args.getBoolean("all")) null else arrayOf("mod"))!!) //TODO only client? what if someone wants a server? + for( + rel in json!!.defaultVersion!!.getRelations( + arrayOf("client"), + if(args.getBoolean("all")) null else arrayOf("mod") + )!! + ) //TODO only client? what if someone wants a server? if(rel.hasFile()) fileList.add(rel.file.get()) @@ -71,11 +77,10 @@ object DownloadMods : ICommand { ) ), {r: DownloadFileTask.Return -> - //synced so error message gets printed under response - synchronized(this) { - println("${r.responseCode} ${r.responseMessage} ${r.url} ${r.file}") - if(r.exception != null) - println(r.exception.message) + println("${r.responseCode} ${r.responseMessage} ${r.url} ${r.file}") + if(r.exception != null) { + fPrintln("ERROR DOWNLOADING ${r.url}") + r.exception.printStackTrace() } }, !args.getBoolean("force"), diff --git a/src/main/kotlin/ley/anvil/modpacktools/util/addonscript/ASUtil.kt b/src/main/kotlin/ley/anvil/modpacktools/util/addonscript/ASUtil.kt new file mode 100644 index 0000000..833fc57 --- /dev/null +++ b/src/main/kotlin/ley/anvil/modpacktools/util/addonscript/ASUtil.kt @@ -0,0 +1,53 @@ +package ley.anvil.modpacktools.util.addonscript + +import ley.anvil.modpacktools.TERMC +import ley.anvil.modpacktools.util.fPrintln +import ley.anvil.modpacktools.util.mergeTo +import org.apache.commons.io.FileUtils +import java.io.File +import java.io.PrintStream + +data class InstallFileSuccess( + val success: Boolean, + val msg: String? = null +) { + @JvmOverloads + fun printf(out: PrintStream = System.out) { + if(msg != null) + out.fPrintln(msg, if(success) TERMC.green else TERMC.red) + } +} + +fun installFile(installer: String, file: File, outDir: File): InstallFileSuccess { + when { + installer == "internal.override" -> { + when { + file.extension == "zip" -> { + TODO("unzip to ./.mpt/twitch/overrides") + } + + file.isDirectory -> { + FileUtils.copyDirectory(file, outDir) + } + + else -> { + InstallFileSuccess(false, "Only zip files can be used with \'internal.override\'") + } + } + } + + installer.startsWith("internal.dir") -> { + val (_, dir) = installer.split(":") + FileUtils.copyFile(file, File(outDir, dir) mergeTo file) + } + + installer.startsWith("internal.zip") -> { + TODO() + } + + else -> { + return InstallFileSuccess(false, "The installer \'$installer\' is not supported") + } + } + return InstallFileSuccess(true, "installed $file") +}