4
0
Fork 0
mirror of https://github.com/Anvilcraft/modpacktools synced 2024-06-11 06:59:28 +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.CONFIG
import ley.anvil.modpacktools.MPJH import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.TERMC import ley.anvil.modpacktools.TERMC
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.fail import ley.anvil.modpacktools.command.CommandReturn.Companion.fail
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand import ley.anvil.modpacktools.command.LoadCommand
import ley.anvil.modpacktools.util.addonscript.installFile import ley.anvil.modpacktools.util.addonscript.installFile
import ley.anvil.modpacktools.util.downloadFiles import ley.anvil.modpacktools.util.downloadFiles
import ley.anvil.modpacktools.util.fPrintln import ley.anvil.modpacktools.util.fPrintln
import ley.anvil.modpacktools.util.toZip import ley.anvil.modpacktools.util.toZip
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace import net.sourceforge.argparse4j.inf.Namespace
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import java.io.File import java.io.File
@ -22,14 +20,9 @@ import java.net.URL
import java.util.zip.ZipOutputStream import java.util.zip.ZipOutputStream
@LoadCommand @LoadCommand
object BuildTechnic : ICommand { object BuildTechnic : AbstractCommand("BuildTechnic") {
override val name = "buildtechnic"
override val helpMessage = "Builds a technic export" 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 tempDir by lazy {File(CONFIG.config.pathOrException<String>("Locations/tempDir"))}
private val tmp: File by lazy {File(tempDir, "technic")} private val tmp: File by lazy {File(tempDir, "technic")}
private val download: File by lazy {File(tempDir, "download")} 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.CONFIG
import ley.anvil.modpacktools.MPJH import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.TERMC import ley.anvil.modpacktools.TERMC
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.fail import ley.anvil.modpacktools.command.CommandReturn.Companion.fail
import ley.anvil.modpacktools.command.CommandReturn.Companion.success import ley.anvil.modpacktools.command.CommandReturn.Companion.success
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand import ley.anvil.modpacktools.command.LoadCommand
import ley.anvil.modpacktools.util.addonscript.installFile import ley.anvil.modpacktools.util.addonscript.installFile
import ley.anvil.modpacktools.util.downloadFiles import ley.anvil.modpacktools.util.downloadFiles
import ley.anvil.modpacktools.util.fPrintln import ley.anvil.modpacktools.util.fPrintln
import ley.anvil.modpacktools.util.manifest.convertAStoManifest import ley.anvil.modpacktools.util.manifest.convertAStoManifest
import ley.anvil.modpacktools.util.toZip import ley.anvil.modpacktools.util.toZip
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.impl.Arguments.storeTrue import net.sourceforge.argparse4j.impl.Arguments.storeTrue
import net.sourceforge.argparse4j.inf.ArgumentParser import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace import net.sourceforge.argparse4j.inf.Namespace
@ -26,22 +25,19 @@ import java.net.URL
import java.util.zip.ZipOutputStream import java.util.zip.ZipOutputStream
@LoadCommand @LoadCommand
object BuildTwitch : ICommand { object BuildTwitch : AbstractCommand("BuildTwitch") {
override val name: String = "buildtwitch"
override val helpMessage: String = "builds a twitch export" 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 tempDir by lazy {File(CONFIG.config.pathOrException<String>("Locations/tempDir"))}
private val tmp: File by lazy {File(tempDir, "twitch")} private val tmp: File by lazy {File(tempDir, "twitch")}
private val downloadDir by lazy {File(tempDir, "download")} 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 { override fun execute(args: Namespace): CommandReturn {
val wr = MPJH.asWrapper!! val wr = MPJH.asWrapper!!
val ml = convertAStoManifest(wr) {args.getBoolean("all") || "required" in it.options} 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.addonscript.wrapper.MetaData
import ley.anvil.modpacktools.MPJH import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.TERMC import ley.anvil.modpacktools.TERMC
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.success import ley.anvil.modpacktools.command.CommandReturn.Companion.success
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand import ley.anvil.modpacktools.command.LoadCommand
import ley.anvil.modpacktools.util.fPrintln import ley.anvil.modpacktools.util.fPrintln
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.impl.Arguments.storeTrue import net.sourceforge.argparse4j.impl.Arguments.storeTrue
import net.sourceforge.argparse4j.impl.type.CaseInsensitiveEnumNameArgumentType import net.sourceforge.argparse4j.impl.type.CaseInsensitiveEnumNameArgumentType
import net.sourceforge.argparse4j.impl.type.FileArgumentType import net.sourceforge.argparse4j.impl.type.FileArgumentType
@ -38,31 +37,26 @@ import java.nio.charset.StandardCharsets
import java.util.Comparator.comparing import java.util.Comparator.comparing
@LoadCommand @LoadCommand
object CreateModlist : ICommand { object CreateModlist : AbstractCommand("CreateModlist") {
override val name: String = "createmodlist"
override val helpMessage: String = "This creates a modlist either as html or csv file." 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)) .type(CaseInsensitiveEnumNameArgumentType(Sorting::class.java))
.setDefault(Sorting.NAME) .setDefault(Sorting.NAME)
.help("Determines How mods should be sorted") .help("Determines How mods should be sorted")
parser.addArgument("-a", "--all") addArgument("-a", "--all")
.action(storeTrue()) .action(storeTrue())
.help("If this is set, all relations and not only be mods will be in the list") .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)) .type(CaseInsensitiveEnumNameArgumentType(Format::class.java))
.help("What format the mod list should be made in") .help("What format the mod list should be made in")
parser.addArgument("file") addArgument("file")
.type(FileArgumentType().verifyNotExists()) .type(FileArgumentType().verifyNotExists())
.help("What file the mod list should be written to") .help("What file the mod list should be written to")
parser
} }
override fun execute(args: Namespace): CommandReturn { override fun execute(args: Namespace): CommandReturn {
@ -107,7 +101,12 @@ object CreateModlist : ICommand {
head( head(
style( style(
//Fancy css! //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( body(
@ -164,7 +163,8 @@ object CreateModlist : ICommand {
return success("Wrote HTML file") 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 { enum class Format {
HTML, CSV HTML, CSV

View file

@ -2,14 +2,13 @@ package ley.anvil.modpacktools.commands
import ley.anvil.addonscript.wrapper.FileOrLink import ley.anvil.addonscript.wrapper.FileOrLink
import ley.anvil.modpacktools.MPJH import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.success import ley.anvil.modpacktools.command.CommandReturn.Companion.success
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand import ley.anvil.modpacktools.command.LoadCommand
import ley.anvil.modpacktools.util.DownloadFileTask import ley.anvil.modpacktools.util.DownloadFileTask
import ley.anvil.modpacktools.util.downloadFiles import ley.anvil.modpacktools.util.downloadFiles
import ley.anvil.modpacktools.util.fPrintln import ley.anvil.modpacktools.util.fPrintln
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.impl.Arguments.storeTrue import net.sourceforge.argparse4j.impl.Arguments.storeTrue
import net.sourceforge.argparse4j.impl.type.FileArgumentType import net.sourceforge.argparse4j.impl.type.FileArgumentType
import net.sourceforge.argparse4j.inf.ArgumentParser import net.sourceforge.argparse4j.inf.ArgumentParser
@ -19,37 +18,31 @@ import java.net.URL
import java.util.stream.Collectors.toMap import java.util.stream.Collectors.toMap
@LoadCommand @LoadCommand
object DownloadMods : ICommand { object DownloadMods : AbstractCommand("DownloadMods") {
override val name: String = "downloadmods"
override val helpMessage: String = "Downloads all mods." 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()) .type(FileArgumentType().verifyCanCreate())
.help("the directory to download the mods to") .help("the directory to download the mods to")
parser.addArgument("-f", "--force") addArgument("-f", "--force")
.action(storeTrue()) .action(storeTrue())
.help("if true, mods that are already in the download folder will be downloaded again") .help("if true, mods that are already in the download folder will be downloaded again")
parser.addArgument("-a", "--all") addArgument("-a", "--all")
.action(storeTrue()) .action(storeTrue())
.help("Downloads not only mods but everything with a dir installer") .help("Downloads not only mods but everything with a dir installer")
parser
} }
override fun execute(args: Namespace): CommandReturn { override fun execute(args: Namespace): CommandReturn {
val json = MPJH.asWrapper val json = MPJH.asWrapper
val fileList = mutableListOf<FileOrLink>() val fileList = mutableListOf<FileOrLink>()
for( for(
rel in json!!.defaultVersion!!.getRelations( rel in json!!.defaultVersion!!.getRelations(
arrayOf("client"), arrayOf("client"),
if(args.getBoolean("all")) null else arrayOf("mod") if(args.getBoolean("all")) null else arrayOf("mod")
)!! )!!
) //TODO only client? what if someone wants a server? ) //TODO only client? what if someone wants a server?
if(rel.hasFile()) if(rel.hasFile())
fileList.add(rel.file.get()) 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.addonscript.curse.ManifestJSON
import ley.anvil.modpacktools.GSON import ley.anvil.modpacktools.GSON
import ley.anvil.modpacktools.MPJH import ley.anvil.modpacktools.MPJH
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.fail import ley.anvil.modpacktools.command.CommandReturn.Companion.fail
import ley.anvil.modpacktools.command.CommandReturn.Companion.success import ley.anvil.modpacktools.command.CommandReturn.Companion.success
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand import ley.anvil.modpacktools.command.LoadCommand
import ley.anvil.modpacktools.util.readAsJson import ley.anvil.modpacktools.util.readAsJson
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.impl.type.FileArgumentType import net.sourceforge.argparse4j.impl.type.FileArgumentType
import net.sourceforge.argparse4j.inf.ArgumentParser import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace import net.sourceforge.argparse4j.inf.Namespace
@ -17,16 +16,14 @@ import java.io.File
import java.io.FileWriter import java.io.FileWriter
@LoadCommand @LoadCommand
object Import : ICommand { object Import : AbstractCommand("Import") {
override val name: String = "import"
override val helpMessage: String = "Converts a given manifest file to a modpackjson file" override val helpMessage: String = "Converts a given manifest file to a modpackjson file"
override val parser: ArgumentParser = ArgumentParsers.newFor("Import")
.build() override fun ArgumentParser.addArgs() {
.apply { addArgument("manifest")
addArgument("manifest") .help("the manifest file to import")
.help("the manifest file to import") .type(FileArgumentType().verifyIsFile())
.type(FileArgumentType().verifyIsFile()) }
}
override val needsModpackjson: Boolean = false override val needsModpackjson: Boolean = false
override val needsConfig: 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.addonscript.v1.AddonscriptJSON
import ley.anvil.modpacktools.CONFIG import ley.anvil.modpacktools.CONFIG
import ley.anvil.modpacktools.command.AbstractCommand
import ley.anvil.modpacktools.command.CommandReturn import ley.anvil.modpacktools.command.CommandReturn
import ley.anvil.modpacktools.command.CommandReturn.Companion.success import ley.anvil.modpacktools.command.CommandReturn.Companion.success
import ley.anvil.modpacktools.command.ICommand
import ley.anvil.modpacktools.command.LoadCommand import ley.anvil.modpacktools.command.LoadCommand
import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.inf.ArgumentParser
import net.sourceforge.argparse4j.inf.Namespace import net.sourceforge.argparse4j.inf.Namespace
import java.io.File import java.io.File
import java.io.FileWriter import java.io.FileWriter
@LoadCommand @LoadCommand
object Init : ICommand { object Init : AbstractCommand("Init") {
override val name: String = "init" override val helpMessage: String = "initializes the MPT dev environment"
override val helpMessage: String = "initializes the MPT dev environment (currently only creates config file)"
override val parser: ArgumentParser = ArgumentParsers.newFor("Init")
.build()
.description(helpMessage)
override val needsConfig: Boolean = false override val needsConfig: Boolean = false
override val needsModpackjson: Boolean = false override val needsModpackjson: Boolean = false
@ -35,7 +29,7 @@ object Init : ICommand {
val asJson = File(srcDir, "modpack.json") val asJson = File(srcDir, "modpack.json")
if (!asJson.exists()) { if(!asJson.exists()) {
//create new file //create new file
val writer = FileWriter(asJson) val writer = FileWriter(asJson)
val addsc = AddonscriptJSON.create() val addsc = AddonscriptJSON.create()

View file

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

View file

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