Skip to content

Instantly share code, notes, and snippets.

@andrewgazelka
Created January 28, 2019 15:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andrewgazelka/efb28dda2d9d5b779578c77a95d25ce0 to your computer and use it in GitHub Desktop.
Save andrewgazelka/efb28dda2d9d5b779578c77a95d25ce0 to your computer and use it in GitHub Desktop.
package io.simplyservers.simplecore.api.command
import io.simplyservers.simplecore.api.command.delegates.BlankTabCompleter
import org.bukkit.command.Command
import org.bukkit.command.CommandSender
class SubCommandBase(
private val argsCount: Int = 0,
private val nameable: Nameable,
private val tabCompleter: TabCompleter = BlankTabCompleter,
private val subCommandProcessor: SubCommandProcessor
) :
SimpleCommand,
Nameable by nameable {
private fun argsToProcess(args: Array<out String>) = args.sliceArray(0 until argsCount)
private fun subCommandArg(args: Array<out String>) = args.getOrNull(argsCount)
private fun argsToPass(args: Array<out String>) = args.sliceArray(argsCount + 1 until args.size)
private fun Collection<io.simplyservers.simplecore.api.command.SimpleCommand>.getCommand(name: String) = this.firstOrNull { it.matches(name) }
override fun on(sender: CommandSender, command: Command, alias: String, args: Array<out String>): Boolean {
if (args.size < argsCount) return false
val forArgs = argsToProcess(args)
val possibleSubCommands = processArgs(sender, command, alias, forArgs)
when (possibleSubCommands) {
is SubCommandResult.Failure -> return false
is SubCommandResult.Success -> {
val subCommandArg = subCommandArg(args)?.toLowerCase()
if (subCommandArg == null) {
sender.sendWrongSubCommand()
return false
}
val simpleCommand = possibleSubCommands.commands.getCommand(subCommandArg)
if (simpleCommand == null) {
sender.sendWrongSubCommand()
return false
}
return simpleCommand.on(sender, command, alias, argsToPass(args))
}
}
}
private fun processArgs(sender: CommandSender, command: Command, alias: String, args: Array<out String>): SubCommandResult {
return subCommandProcessor.on(sender, command, alias, args)
}
private fun CommandSender.sendWrongSubCommand(): String = TODO()
override fun onTabComplete(sender: CommandSender, command: Command, alias: String, args: Array<out String>): Set<String> {
if (args.size <= argsCount) return onTabArgs(sender, command, alias, args)
val subCommands = processArgs(sender, command, alias, args)
when (subCommands) {
is SubCommandResult.Failure -> return emptySet()
is SubCommandResult.Success -> {
val allSubCommands = subCommands.commands
if (allSubCommands.isEmpty()) return emptySet()
val allSubCommandNames = allSubCommands.map { it.name }
val enteredSimpleCommand = subCommandArg(args) ?: return allSubCommandNames.toSet()
if (args.size == argsCount + 1) return allSubCommandNames.filter { it.startsWith(enteredSimpleCommand, ignoreCase = true) }.toSet()
val subCommand = allSubCommands.getCommand(enteredSimpleCommand)
if (subCommand != null) {
return subCommand.onTabComplete(sender, command, alias, argsToPass(args))
}
return emptySet()
}
}
}
fun onTabArgs(sender: CommandSender, command: Command, alias: String, args: Array<out String>): Set<String> {
return tabCompleter.onTabComplete(sender, command, alias, args)
}
fun io.simplyservers.simplecore.api.command.SimpleCommand.matches(name: String): Boolean {
return this.name == name || this.aliases.contains(name)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment