Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
90204c5
[O] Kotlinize ArgsParser, split CliEntry
hykilpikonna Jan 3, 2023
26507a8
[M] Replace all Consumer<String> log with ILogger
hykilpikonna Jan 3, 2023
d534006
[F] Fix checkstyle
hykilpikonna Jan 3, 2023
e4429c4
[+] Kotlinize command parsers to support non-blocking io
hykilpikonna Jan 3, 2023
5ba18b0
[F] Fix tests for coroutine
hykilpikonna Jan 3, 2023
ac1a6b2
[F] Fix main class for CLI wrapper
hykilpikonna Jan 3, 2023
d31103e
[F] Fix ArgsParserTest for coroutine
hykilpikonna Jan 3, 2023
8d73366
[+] Cat command
hykilpikonna Jan 3, 2023
fcbde24
[F] Fix dependency in pyml
hykilpikonna Jan 3, 2023
d1d0e88
[O] Use the same method to hijack console commands
hykilpikonna Jan 3, 2023
cc3a2e5
[F] Register listeners
hykilpikonna Jan 3, 2023
9ccdbfd
[F] Fix return void warning
hykilpikonna Jan 3, 2023
f183d02
[F] Fix already consumed error
hykilpikonna Jan 3, 2023
887fba1
[F] Fix already consumed error in a better way
hykilpikonna Jan 3, 2023
5ef5554
[+] Kotlinize ColorLogger
hykilpikonna Jan 3, 2023
d5575b7
[+] PrintStream.printc() extension
hykilpikonna Jan 3, 2023
293bffa
[O] Use raw output
hykilpikonna Jan 3, 2023
62250a2
[O] Generalize launch script
hykilpikonna Jan 3, 2023
26bb2e2
[F] Fix exception on unrecognized command
hykilpikonna Jan 3, 2023
59efc61
[F] Avoid using raw out
hykilpikonna Jan 3, 2023
d91544c
[F] Fix catch scope
hykilpikonna Jan 3, 2023
d32af13
[M] Rename getLatestPluginVersion to getLatest
hykilpikonna Jan 3, 2023
6fbd7ea
[+] ID searcher
hykilpikonna Jan 3, 2023
50a4519
[+] Register ID searcher
hykilpikonna Jan 3, 2023
67e680a
[+] Package change model
hykilpikonna Jan 3, 2023
a6bc581
[M] RIIK: UnitConverter
hykilpikonna Jan 4, 2023
e19e2da
[O] Make package change type computed
hykilpikonna Jan 4, 2023
69a4255
[+] Package change to string
hykilpikonna Jan 4, 2023
52eecec
[+] Install exception
hykilpikonna Jan 4, 2023
233ba2f
[O] Split fmt with table
hykilpikonna Jan 4, 2023
7068ac0
[F] Put fmt outside of class scope
hykilpikonna Jan 4, 2023
d04bd2d
[M] InstallBoundary → IInstaller
hykilpikonna Jan 4, 2023
b51844b
[F] Fix tests
hykilpikonna Jan 4, 2023
3b86aa7
[O] Redesign install input
hykilpikonna Jan 4, 2023
4fb3533
[O] Redesign installer
hykilpikonna Jan 4, 2023
1df6f9a
[O] Redesign install controller
hykilpikonna Jan 4, 2023
9c2ab33
[O] Redesign install parser
hykilpikonna Jan 4, 2023
a6674aa
[-] Remove the controller
hykilpikonna Jan 4, 2023
5c00382
[M] RIIK: ControllerFactory
hykilpikonna Jan 4, 2023
2643964
[M] RIIK: ArgsParserFactory
hykilpikonna Jan 4, 2023
03b6ab4
[M] ControllerFactoryBoundary → IControllerFactory
hykilpikonna Jan 4, 2023
321b3f2
[M] RIIK: InteractorFactory
hykilpikonna Jan 4, 2023
5ae5b60
Revert "[-] Remove the controller"
hykilpikonna Jan 4, 2023
5c281b7
[M] RIIK: ParserFactory
hykilpikonna Jan 4, 2023
70f5add
[F] Add server param to InteractorFactory
hykilpikonna Jan 4, 2023
215d4f0
[O] !!!!! Unimplemented operations
hykilpikonna Jan 4, 2023
8b514ca
[M] RIIK: Table
hykilpikonna Jan 4, 2023
0b11970
[M] RIIK: ListPresenter
hykilpikonna Jan 4, 2023
5a33e8a
[M] RIIK: MirrorController
hykilpikonna Jan 4, 2023
7189fc0
[F] Fix tests
hykilpikonna Jan 4, 2023
e799d8c
[O] No need to display name when they're all the same
hykilpikonna Jan 4, 2023
bdca6c6
[+] Add number of downloads to PluginModel
hykilpikonna Jan 4, 2023
3ba6b4e
[O] crawl.sh: Compress without downtime
hykilpikonna Jan 4, 2023
d6c04a8
[M] RIIK: CreateDatabase
hykilpikonna Jan 4, 2023
b7caf92
[-] Remove redundant create database
hykilpikonna Jan 4, 2023
7f3f447
[F] Fix table formatting
hykilpikonna Jan 4, 2023
b49715c
[O] Install: Sort by downloads, ignore packages without versions
hykilpikonna Jan 4, 2023
f338daa
[O] Install: Display downloads count
hykilpikonna Jan 4, 2023
a771511
[O] Install: Default option
hykilpikonna Jan 4, 2023
5444271
[F] Install: Depends null case
hykilpikonna Jan 4, 2023
5300ab2
[O] Change: Add colors
hykilpikonna Jan 4, 2023
c4ce5c9
[F] Change: Fix size calculation
hykilpikonna Jan 4, 2023
e1fb6fa
[O] Change: Calculate downlodSize, upgradeSize, removedSie
hykilpikonna Jan 4, 2023
56f335b
[F] Unit: Fix bits unit always appended with /s
hykilpikonna Jan 4, 2023
aa86c07
[F] Print exception in install
hykilpikonna Jan 4, 2023
65310dc
[F] Fix test case
hykilpikonna Jan 4, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ group 'org.hydev.mcpm'
version '1.0.0.788'

application {
mainClass = 'org.hydev.mcpm.client.arguments.ArgsParser'
mainClass = 'org.hydev.mcpm.CliEntryKt'
}

repositories {
Expand Down Expand Up @@ -94,11 +94,13 @@ dependencies {

// https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'

// Unit tests
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.0'
testRuntimeOnly 'org.slf4j:slf4j-simple:2.0.4'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4'
}

processResources {
Expand Down
4 changes: 2 additions & 2 deletions crawl.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ $PY -m tools.run org.hydev.mcpm.server.SpigetCrawler
$PY -m tools.run org.hydev.mcpm.server.spiget.CreateDatabase

# Zstd compression
rm -rf .mcpm/db.zst
zstd -f -19 -T36 .mcpm/db
zstd -f -19 -T36 .mcpm/db -o .mcpm/db.zst1
mv -f .mcpm/db.zst1 .mcpm/db.zst

popd
2 changes: 1 addition & 1 deletion mcpm
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ set -e
./gradlew :compileJava
classpath=$(./gradlew :printCp 2>& 1>/dev/null)

java -cp "$classpath" org.hydev.mcpm.client.arguments.ArgsParser "$@"
$JAVA_HOME/bin/java -cp "$classpath" org.hydev.mcpm.CliEntryKt "$@"
26 changes: 26 additions & 0 deletions src/main/java/org/hydev/mcpm/CliEntry.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.hydev.mcpm

import net.sourceforge.argparse4j.inf.ArgumentParserException
import org.hydev.mcpm.client.arguments.ArgsParserFactory
import org.hydev.mcpm.client.interaction.StdLogger
import org.hydev.mcpm.utils.ColorLogger

/**
* CLI Entry point
*
* @author Azalea (https://github.com/hykilpikonna)
* @since 2023-01-02
*/
suspend fun main(args: Array<String>)
{
val parser = ArgsParserFactory.baseArgsParser()

try
{
parser.parse(args, StdLogger())
}
catch (e: ArgumentParserException)
{
parser.fail(e, StdLogger())
}
}
30 changes: 21 additions & 9 deletions src/main/java/org/hydev/mcpm/SpigotEntry.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package org.hydev.mcpm

import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import net.sourceforge.argparse4j.inf.ArgumentParserException
import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.plugin.java.JavaPlugin
import org.hydev.mcpm.client.arguments.ArgsParserFactory
import org.hydev.mcpm.client.interaction.SpigotUserHandler
import org.hydev.mcpm.client.interaction.StdLogger
import org.hydev.mcpm.utils.ColorLogger

/**
Expand Down Expand Up @@ -38,6 +43,9 @@ class SpigotEntry : JavaPlugin(), CommandExecutor

// Register mcpm command
getCommand("mcpm")!!.setExecutor(this)

// Register event listeners
server.pluginManager.registerEvents(interaction, this)
}

/**
Expand All @@ -48,24 +56,28 @@ class SpigotEntry : JavaPlugin(), CommandExecutor
logger.info("Disabled!")
}

@OptIn(DelicateCoroutinesApi::class)
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<String>): Boolean
{
val log = ColorLogger.toMinecraft(sender)
try
{
parser.parse(args, log)
}
catch (e: ArgumentParserException)
{
parser.fail(e, log)
val log = interaction.create(sender)
// Run async
GlobalScope.launch {
try
{
parser.parse(args, log)
}
catch (e: ArgumentParserException)
{
parser.fail(e, log)
}
}
return true
}

override fun onTabComplete(sender: CommandSender, command: Command, alias: String, args: Array<String>): List<String>?
{
if (command.name.lowercase() != "mcpm") return null
return if (args.size == 1) parser.rawSubparsers.map { it.name() }
return if (args.size == 1) parser.rawSubparsers.map { it.name }
else null
}
}
127 changes: 0 additions & 127 deletions src/main/java/org/hydev/mcpm/client/arguments/ArgsParser.java

This file was deleted.

92 changes: 92 additions & 0 deletions src/main/java/org/hydev/mcpm/client/arguments/ArgsParser.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package org.hydev.mcpm.client.arguments

import net.sourceforge.argparse4j.ArgumentParsers
import net.sourceforge.argparse4j.inf.*
import org.hydev.mcpm.client.arguments.parsers.CommandHandler
import org.hydev.mcpm.client.arguments.parsers.CommandParser
import org.hydev.mcpm.client.interaction.ILogger
import java.io.PrintWriter
import java.io.StringWriter

/**
* Handles parsing command arguments into CommandEntry objects (to be dispatched to Controller).
* For steps to add a new command, see Command.java.
*/
class ArgsParser(val rawSubparsers: List<CommandParser>)
{
val help: String
val parser: ArgumentParser = ArgumentParsers.newFor("mcpm").addHelp(false).build()

/**
* Creates a new ArgsParser object with a list of CommandParsers.
*
* @param allParsers A list of all CommandParser objects that this ArgsParser can parse.
*/
init
{
val parsers = parser.addSubparsers()
for (parser in rawSubparsers)
{
val subparser = parsers.addParser(parser.name, false)
parser.configure(subparser)
subparser.setDefault("handler", parser)
subparser.addArgument("-h", "--help").action(PrintHelpAction(subparser))
}

// Create help string and help command
help = "mcpm: Minecraft Plugin Package Manager\n" +
rawSubparsers.filter { it.description.isNotBlank() }
.map { "&f/mcpm ${it.name} &6- ${it.description}&r\n" }.joinToString("") +
"To view the help message of a command, use /mcpm <command> -h"

val helpSub = parsers.addParser("help", false)
helpSub.setDefault("handler", object : CommandHandler
{
override suspend fun run(details: Namespace, log: ILogger) = log.print(help)
})
}

/**
* Parses arguments into a CommandEntry object.
*
* @param arguments A list of string arguments. Example: [ "load", "pluginA", "pluginB" ].
* @param log Logger
* @throws ArgumentParserException Thrown when arguments are not parsed correctly.
* For default handling, pass this to ArgsParser#fail.
*/
@Throws(ArgumentParserException::class)
suspend fun parse(arguments: Array<String>, log: ILogger)
{
// If no args are present, add help
if (arguments.isEmpty())
{
log.print(help)
return
}

try
{
val namespace = parser.parseArgs(arguments)
val handleObject = runCatching { namespace.get<CommandHandler>("handler") }.getOrNull()
?: throw ArgumentParserException("Unrecognized command.", parser)
handleObject.run(namespace, log)
}
catch (e: HelpException)
{
log.print("&e" + e.help())
}
}

/**
* Writes the error message to stdout (along with help details if needed).
*
* @param e The error object that was caught from #parse.
*/
fun fail(e: ArgumentParserException?, log: ILogger)
{
val writer = StringWriter()
val printer = PrintWriter(writer)
parser.handleError(e, printer)
log.print("&c$writer")
}
}

This file was deleted.

Loading