diff options
author | Dico200 <dico.karssiens@gmail.com> | 2018-07-27 23:31:24 +0100 |
---|---|---|
committer | Dico200 <dico.karssiens@gmail.com> | 2018-07-27 23:31:24 +0100 |
commit | 2c1aee89f6bbc696f55a0952bf26c295611e5e3a (patch) | |
tree | ee74596b472127577ba5df0f2badfcc3911a88da /src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt | |
parent | 2a726e1b618b38e635b249d7d09000ec2ea9ac17 (diff) |
Refactor and reformat commands
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt b/src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt index 726be81..ab97023 100644 --- a/src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt +++ b/src/main/kotlin/io/dico/parcels2/command/ParcelParameterTypes.kt @@ -3,10 +3,14 @@ package io.dico.parcels2.command import io.dico.dicore.command.CommandException import io.dico.dicore.command.parameter.ArgumentBuffer import io.dico.dicore.command.parameter.Parameter +import io.dico.dicore.command.parameter.type.ParameterConfig import io.dico.dicore.command.parameter.type.ParameterType import io.dico.parcels2.Parcel import io.dico.parcels2.ParcelWorld import io.dico.parcels2.Worlds +import io.dico.parcels2.util.isValid +import org.bukkit.Bukkit +import org.bukkit.OfflinePlayer import org.bukkit.command.CommandSender import org.bukkit.entity.Player @@ -44,3 +48,75 @@ class ParcelParameterType(val worlds: Worlds) : ParameterType<Parcel, Void>(Parc } } + + +class NamedParcelTarget(val world: ParcelWorld, val player: OfflinePlayer, val index: Int) + +@Target(AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class NamedParcelDefault(val value: NamedParcelDefaultValue) + +enum class NamedParcelDefaultValue { + FIRST_OWNED, + NULL +} + +class NamedParcelTargetConfig : ParameterConfig<NamedParcelDefault, + NamedParcelDefaultValue>(NamedParcelDefault::class.java) { + + override fun toParameterInfo(annotation: NamedParcelDefault): NamedParcelDefaultValue { + return annotation.value + } +} + +class ParcelHomeParameterType(val worlds: Worlds) : ParameterType<NamedParcelTarget, + NamedParcelDefaultValue>(NamedParcelTarget::class.java, NamedParcelTargetConfig()) { + + val regex = Regex.fromLiteral("((.+)->)?(.+)|((.+):([0-9]+))") + + private fun requirePlayer(sender: CommandSender, parameter: Parameter<*, *>): Player { + if (sender !is Player) invalidInput(parameter, "console cannot omit the player name") + return sender + } + + @Suppress("UsePropertyAccessSyntax") + private fun getOfflinePlayer(input: String, parameter: Parameter<*, *>) = Bukkit.getOfflinePlayer(input) + ?.takeIf { it.isValid } + ?: invalidInput(parameter, "do not know who $input is") + + override fun parse(parameter: Parameter<NamedParcelTarget, NamedParcelDefaultValue>, + sender: CommandSender, buffer: ArgumentBuffer): NamedParcelTarget { + val matchResult = regex.matchEntire(buffer.next()) + ?: invalidInput(parameter, "must be a player, index, or player:index (/${regex.pattern}/)") + + val world = worlds.getTargetWorld(matchResult.groupValues[2], sender, parameter) + + matchResult.groupValues[3].takeUnless { it.isEmpty() }?.let { + // first group was matched, it's a player or an int + it.toIntOrNull()?.let { + requirePlayer(sender, parameter) + return NamedParcelTarget(world, sender as Player, it) + } + + return NamedParcelTarget(world, getOfflinePlayer(it, parameter), 0) + } + + val player = getOfflinePlayer(matchResult.groupValues[5], parameter) + val index = matchResult.groupValues[6].toIntOrNull() + ?: invalidInput(parameter, "couldn't parse int") + + return NamedParcelTarget(world, player, index) + } + + override fun getDefaultValue(parameter: Parameter<NamedParcelTarget, NamedParcelDefaultValue>, + sender: CommandSender, buffer: ArgumentBuffer): NamedParcelTarget? { + if (parameter.paramInfo == NamedParcelDefaultValue.NULL) { + return null + } + + val world = worlds.getTargetWorld(null, sender, parameter) + val player = requirePlayer(sender, parameter) + return NamedParcelTarget(world, player, 0) + } + +} |