4
0
Fork 0
mirror of https://github.com/Anvilcraft/modpacktools synced 2024-05-19 20:04:07 +02:00

add and implement AbstractCommand

less boilerplate!
This commit is contained in:
LordMZTE 2020-08-14 18:46:36 +02:00
parent b945983835
commit c7b6672601
9 changed files with 100 additions and 102 deletions

View file

@ -0,0 +1,35 @@
package ley.anvil.modpacktools.command
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.inf.ArgumentParser
/**
* Implement this for commands. it is meant to reduce boilerplate.
*
* @param displayName the name of this command to be displayed in the help message
* @param name the internal name of the command. will be the display name in lower case and with _ instead of spaces by default
*/
abstract class AbstractCommand
@JvmOverloads
constructor(
val displayName: String,
override val name: String = displayName.toLowerCase().replace(' ', '_')
) : ICommand {
override val parser: ArgumentParser by lazy {
ArgumentParsers.newFor(displayName)
.build()
.description(helpMessage)
.apply {
addArgs()
}
}
/**
* This will be called to add arguments to the arg parser of this command.
* override this to add arguments.
*
* @receiver the parser to add the args to
*/
open fun ArgumentParser.addArgs() {}
}

View file

@ -4,16 +4,14 @@ 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.AbstractCommand
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
@ -22,14 +20,9 @@ import java.net.URL
import java.util.zip.ZipOutputStream
@LoadCommand
object BuildTechnic : ICommand {
override val name = "buildtechnic"
object BuildTechnic : AbstractCommand("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<String>("Locations/tempDir"))}
private val tmp: File by lazy {File(tempDir, "technic")}
private val download: File by lazy {File(tempDir, "download")}

View file

@ -3,17 +3,16 @@ package ley.anvil.modpacktools.commands
import ley.anvil.modpacktools.CONFIG
import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.TERMC
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn
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.toZip
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.impl.Arguments.storeTrue
import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace
@ -26,22 +25,19 @@ import java.net.URL
import java.util.zip.ZipOutputStream
@LoadCommand
object BuildTwitch : ICommand {
override val name: String = "buildtwitch"
object BuildTwitch : AbstractCommand("BuildTwitch") {
override val helpMessage: String = "builds a twitch export"
override val parser: ArgumentParser = ArgumentParsers.newFor("BuildTwitch")
.build()
.description(helpMessage)
.apply {
addArgument("-a", "--all")
.help("Downloads all relations instead of just required ones")
.action(storeTrue())
}
private val tempDir by lazy {File(CONFIG.config.pathOrException<String>("Locations/tempDir"))}
private val tmp: File by lazy {File(tempDir, "twitch")}
private val downloadDir by lazy {File(tempDir, "download")}
override fun ArgumentParser.addArgs() {
addArgument("-a", "--all")
.help("Downloads all relations instead of just required ones")
.action(storeTrue())
}
override fun execute(args: Namespace): CommandReturn {
val wr = MPJH.asWrapper!!
val ml = convertAStoManifest(wr) {args.getBoolean("all") || "required" in it.options}

View file

@ -18,12 +18,11 @@ import j2html.utils.CSSMin.compressCss
import ley.anvil.addonscript.wrapper.MetaData
import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.TERMC
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn
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.fPrintln
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.impl.Arguments.storeTrue
import net.sourceforge.argparse4j.impl.type.CaseInsensitiveEnumNameArgumentType
import net.sourceforge.argparse4j.impl.type.FileArgumentType
@ -38,31 +37,26 @@ import java.nio.charset.StandardCharsets
import java.util.Comparator.comparing
@LoadCommand
object CreateModlist : ICommand {
override val name: String = "createmodlist"
object CreateModlist : AbstractCommand("CreateModlist") {
override val helpMessage: String = "This creates a modlist either as html or csv file."
override val parser: ArgumentParser = run {
val parser = ArgumentParsers.newFor("CreateModlist").build()
.description(helpMessage)
parser.addArgument("-s", "--sorting")
override fun ArgumentParser.addArgs() {
addArgument("-s", "--sorting")
.type(CaseInsensitiveEnumNameArgumentType(Sorting::class.java))
.setDefault(Sorting.NAME)
.help("Determines How mods should be sorted")
parser.addArgument("-a", "--all")
addArgument("-a", "--all")
.action(storeTrue())
.help("If this is set, all relations and not only be mods will be in the list")
parser.addArgument("type")
addArgument("type")
.type(CaseInsensitiveEnumNameArgumentType(Format::class.java))
.help("What format the mod list should be made in")
parser.addArgument("file")
addArgument("file")
.type(FileArgumentType().verifyNotExists())
.help("What file the mod list should be written to")
parser
}
override fun execute(args: Namespace): CommandReturn {
@ -107,7 +101,12 @@ object CreateModlist : ICommand {
head(
style(
//Fancy css!
compressCss(IOUtils.toString(ClassLoader.getSystemResourceAsStream("commands/createmodlist/style.css"), StandardCharsets.UTF_8))
compressCss(
IOUtils.toString(
ClassLoader.getSystemResourceAsStream("commands/createmodlist/style.css"),
StandardCharsets.UTF_8
)
)
)
),
body(
@ -164,7 +163,8 @@ object CreateModlist : ICommand {
return success("Wrote HTML file")
}
private fun getMods(all: Boolean, sorting: Comparator<MetaData>): List<MetaData> = MPJH.getModMetas(if(all) null else arrayOf("mod")).sortedWith(sorting)
private fun getMods(all: Boolean, sorting: Comparator<MetaData>): List<MetaData> =
MPJH.getModMetas(if(all) null else arrayOf("mod")).sortedWith(sorting)
enum class Format {
HTML, CSV

View file

@ -2,14 +2,13 @@ package ley.anvil.modpacktools.commands
import ley.anvil.addonscript.wrapper.FileOrLink
import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn
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.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
import net.sourceforge.argparse4j.inf.ArgumentParser
@ -19,37 +18,31 @@ import java.net.URL
import java.util.stream.Collectors.toMap
@LoadCommand
object DownloadMods : ICommand {
override val name: String = "downloadmods"
object DownloadMods : AbstractCommand("DownloadMods") {
override val helpMessage: String = "Downloads all mods."
override val parser: ArgumentParser = run {
val parser = ArgumentParsers.newFor("DownloadMods")
.build()
.description(helpMessage)
parser.addArgument("dir")
override fun ArgumentParser.addArgs() {
addArgument("dir")
.type(FileArgumentType().verifyCanCreate())
.help("the directory to download the mods to")
parser.addArgument("-f", "--force")
addArgument("-f", "--force")
.action(storeTrue())
.help("if true, mods that are already in the download folder will be downloaded again")
parser.addArgument("-a", "--all")
addArgument("-a", "--all")
.action(storeTrue())
.help("Downloads not only mods but everything with a dir installer")
parser
}
override fun execute(args: Namespace): CommandReturn {
val json = MPJH.asWrapper
val fileList = mutableListOf<FileOrLink>()
for(
rel in json!!.defaultVersion!!.getRelations(
arrayOf("client"),
if(args.getBoolean("all")) null else arrayOf("mod")
)!!
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())

View file

@ -3,13 +3,12 @@ package ley.anvil.modpacktools.commands
import ley.anvil.addonscript.curse.ManifestJSON
import ley.anvil.modpacktools.GSON
import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn
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.readAsJson
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.impl.type.FileArgumentType
import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace
@ -17,16 +16,14 @@ import java.io.File
import java.io.FileWriter
@LoadCommand
object Import : ICommand {
override val name: String = "import"
object Import : AbstractCommand("Import") {
override val helpMessage: String = "Converts a given manifest file to a modpackjson file"
override val parser: ArgumentParser = ArgumentParsers.newFor("Import")
.build()
.apply {
addArgument("manifest")
.help("the manifest file to import")
.type(FileArgumentType().verifyIsFile())
}
override fun ArgumentParser.addArgs() {
addArgument("manifest")
.help("the manifest file to import")
.type(FileArgumentType().verifyIsFile())
}
override val needsModpackjson: Boolean = false
override val needsConfig: Boolean = false

View file

@ -2,23 +2,17 @@ package ley.anvil.modpacktools.commands
import ley.anvil.addonscript.v1.AddonscriptJSON
import ley.anvil.modpacktools.CONFIG
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.success
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace
import java.io.File
import java.io.FileWriter
@LoadCommand
object Init : ICommand {
override val name: String = "init"
override val helpMessage: String = "initializes the MPT dev environment (currently only creates config file)"
override val parser: ArgumentParser = ArgumentParsers.newFor("Init")
.build()
.description(helpMessage)
object Init : AbstractCommand("Init") {
override val helpMessage: String = "initializes the MPT dev environment"
override val needsConfig: Boolean = false
override val needsModpackjson: Boolean = false
@ -35,7 +29,7 @@ object Init : ICommand {
val asJson = File(srcDir, "modpack.json")
if (!asJson.exists()) {
if(!asJson.exists()) {
//create new file
val writer = FileWriter(asJson)
val addsc = AddonscriptJSON.create()

View file

@ -2,35 +2,31 @@ package ley.anvil.modpacktools.commands
import com.jakewharton.fliptables.FlipTable
import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.success
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.impl.Arguments.storeTrue
import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace
@LoadCommand
object ListRelations : ICommand {
override val name: String = "listrelations"
object ListRelations : AbstractCommand("ListRelations") {
override val helpMessage: String = "Lists the relations of this mod pack"
override val parser: ArgumentParser = ArgumentParsers.newFor("ListRelations")
.build()
.description(helpMessage)
.apply {
addArgument("-c", "--csv")
.help("Doesn't format as a table but instead as csv (separated by ;)")
.action(storeTrue())
}.apply {
addArgument("-n", "--nolimit")
.help("does not limit the size of the authors list")
.action(storeTrue())
}.apply {
addArgument("-d", "--description")
.help("adds the description of relations to the list")
.action(storeTrue())
}
override fun ArgumentParser.addArgs() {
addArgument("-c", "--csv")
.help("Doesn't format as a table but instead as csv (separated by ;)")
.action(storeTrue())
addArgument("-n", "--nolimit")
.help("does not limit the size of the authors list")
.action(storeTrue())
addArgument("-d", "--description")
.help("adds the description of relations to the list")
.action(storeTrue())
}
override fun execute(args: Namespace): CommandReturn {
val metas = MPJH.getModMetas().sortedBy {it.name}

View file

@ -1,23 +1,17 @@
package ley.anvil.modpacktools.commands
import ley.anvil.modpacktools.TERMC
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.success
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand
import ley.anvil.modpacktools.runCommand
import ley.anvil.modpacktools.util.fPrint
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace
@LoadCommand
object Shell : ICommand {
override val name: String = "shell"
object Shell : AbstractCommand("Shell") {
override val helpMessage: String = "opens a shell where mpt commands can be entered in a loop."
override val parser: ArgumentParser = ArgumentParsers.newFor("Shell")
.build()
.description(helpMessage)
override val needsConfig: Boolean = false
override val needsModpackjson: Boolean = false