diff --git a/src/main/kotlin/com/qrakn/honcho/Honcho.kt b/src/main/kotlin/com/qrakn/honcho/Honcho.kt index 8155aad..e55f620 100644 --- a/src/main/kotlin/com/qrakn/honcho/Honcho.kt +++ b/src/main/kotlin/com/qrakn/honcho/Honcho.kt @@ -1,18 +1,27 @@ package com.qrakn.honcho import com.qrakn.honcho.command.adapter.CommandTypeAdapter -import com.qrakn.honcho.command.adapter.impl.PlayerTypeAdapter -import com.qrakn.honcho.command.adapter.impl.StringTypeAdapter +import com.qrakn.honcho.command.adapter.impl.* +import org.bukkit.ChatColor +import org.bukkit.GameMode +import org.bukkit.OfflinePlayer +import org.bukkit.World import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin class Honcho(val plugin: JavaPlugin) { private val executor: HonchoExecutor = HonchoExecutor(this) + var permissionMessage: String = "&cYou don't have permission to use this command" init { + registerTypeAdapter(Boolean::class.java, BooleanTypeAdapter()) + registerTypeAdapter(GameMode::class.java, GameModeTypeAdapter()) + registerTypeAdapter(Integer::class.java, IntegerTypeAdapter()) + registerTypeAdapter(OfflinePlayer::class.java, OfflinePlayerTypeAdapter()) registerTypeAdapter(String::class.java, StringTypeAdapter()) registerTypeAdapter(Player::class.java, PlayerTypeAdapter()) + registerTypeAdapter(World::class.java, WorldTypeAdapter()) } fun registerCommand(command: Any) { diff --git a/src/main/kotlin/com/qrakn/honcho/HonchoCommand.kt b/src/main/kotlin/com/qrakn/honcho/HonchoCommand.kt index 84faea9..4f2928a 100644 --- a/src/main/kotlin/com/qrakn/honcho/HonchoCommand.kt +++ b/src/main/kotlin/com/qrakn/honcho/HonchoCommand.kt @@ -2,8 +2,6 @@ package com.qrakn.honcho import com.qrakn.honcho.command.CommandMeta import org.apache.commons.lang.StringUtils -import org.apache.commons.lang.mutable.Mutable -import org.bukkit.Bukkit import org.bukkit.command.CommandSender import org.bukkit.command.defaults.BukkitCommand import java.util.* diff --git a/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt b/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt index 018f42f..a45d0e3 100644 --- a/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt +++ b/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt @@ -13,9 +13,11 @@ import org.bukkit.command.CommandSender import org.bukkit.entity.Player import org.bukkit.plugin.PluginManager import org.bukkit.plugin.SimplePluginManager -import java.lang.NullPointerException +import org.bukkit.scheduler.BukkitRunnable import java.lang.reflect.Method import java.util.HashMap +import kotlin.collections.ArrayList +import kotlin.collections.set internal class HonchoExecutor(private val honcho: Honcho) : CommandExecutor { @@ -59,8 +61,8 @@ internal class HonchoExecutor(private val honcho: Honcho) : CommandExecutor { val meta = binding.command.javaClass.getAnnotation(CommandMeta::class.java) val instance = binding.command - if (meta.permission.isNotEmpty() && !sender.hasPermission(meta.permission)) { - sender.sendMessage("Nope.") // TODO send configurable no permission message (make command specific or impl specific?) + if (!sender.hasPermission(meta.permission)) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', honcho.permissionMessage)) return true } @@ -112,7 +114,17 @@ internal class HonchoExecutor(private val honcho: Honcho) : CommandExecutor { } if (arguments.size == parameters.size) { - method.invoke(instance, *arguments.toTypedArray()) + if (meta.async) { + object : BukkitRunnable() { + + override fun run() { + method.invoke(instance, *arguments.toTypedArray()) + } + + }.runTaskAsynchronously(honcho.plugin) + } else { + method.invoke(instance, *arguments.toTypedArray()) + } } return true diff --git a/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt b/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt index cfad3c3..e155027 100644 --- a/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt +++ b/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt @@ -6,6 +6,8 @@ package com.qrakn.honcho.command * @param label the command's label(s) * @param permission the command's permission node * @param description the command's description + * @param subcommands the command's subcommands + * @param async executes the command asynchronously */ @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) @@ -13,4 +15,5 @@ annotation class CommandMeta( vararg val label: String, val permission: String = "", val description: String = "", - val subcommands: Boolean = false) \ No newline at end of file + val subcommands: Boolean = false, + val async: Boolean = false) \ No newline at end of file diff --git a/src/main/kotlin/com/qrakn/honcho/command/adapter/CommandTypeAdapter.kt b/src/main/kotlin/com/qrakn/honcho/command/adapter/CommandTypeAdapter.kt index 9e6e4fc..7386821 100644 --- a/src/main/kotlin/com/qrakn/honcho/command/adapter/CommandTypeAdapter.kt +++ b/src/main/kotlin/com/qrakn/honcho/command/adapter/CommandTypeAdapter.kt @@ -1,5 +1,7 @@ package com.qrakn.honcho.command.adapter interface CommandTypeAdapter { + fun convert(string: String, type: Class): T + } \ No newline at end of file diff --git a/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/BooleanTypeAdapter.kt b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/BooleanTypeAdapter.kt new file mode 100644 index 0000000..f4294c4 --- /dev/null +++ b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/BooleanTypeAdapter.kt @@ -0,0 +1,24 @@ +package com.qrakn.honcho.command.adapter.impl + +import com.qrakn.honcho.command.adapter.CommandTypeAdapter +import java.util.* + +class BooleanTypeAdapter : CommandTypeAdapter { + override fun convert(string: String, type: Class): T { + return type.cast(MAP[string.toLowerCase()]) + } + + companion object { + private val MAP = HashMap() + + init { + MAP["true"] = true + MAP["on"] = true + MAP["yes"] = true + + MAP["false"] = false + MAP["off"] = false + MAP["no"] = false + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/GameModeTypeAdapter.kt b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/GameModeTypeAdapter.kt new file mode 100644 index 0000000..ca34c68 --- /dev/null +++ b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/GameModeTypeAdapter.kt @@ -0,0 +1,29 @@ +package com.qrakn.honcho.command.adapter.impl + +import com.qrakn.honcho.command.adapter.CommandTypeAdapter +import org.bukkit.GameMode +import java.util.* + +class GameModeTypeAdapter : CommandTypeAdapter { + override fun convert(string: String, type: Class): T { + return type.cast(MAP[string.toLowerCase()]) + } + + companion object { + private val MAP = HashMap() + + init { + MAP["c"] = GameMode.CREATIVE + MAP["creative"] = GameMode.CREATIVE + MAP["1"] = GameMode.CREATIVE + + MAP["s"] = GameMode.SURVIVAL + MAP["survival"] = GameMode.SURVIVAL + MAP["0"] = GameMode.SURVIVAL + + MAP["a"] = GameMode.ADVENTURE + MAP["adventure"] = GameMode.ADVENTURE + MAP["2"] = GameMode.ADVENTURE + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/IntegerTypeAdapter.kt b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/IntegerTypeAdapter.kt new file mode 100644 index 0000000..0e85a40 --- /dev/null +++ b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/IntegerTypeAdapter.kt @@ -0,0 +1,9 @@ +package com.qrakn.honcho.command.adapter.impl + +import com.qrakn.honcho.command.adapter.CommandTypeAdapter + +class IntegerTypeAdapter : CommandTypeAdapter { + override fun convert(string: String, type: Class): T { + return type.cast(Integer.parseInt(string)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/OfflinePlayerTypeAdapter.kt b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/OfflinePlayerTypeAdapter.kt new file mode 100644 index 0000000..20687ad --- /dev/null +++ b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/OfflinePlayerTypeAdapter.kt @@ -0,0 +1,10 @@ +package com.qrakn.honcho.command.adapter.impl + +import com.qrakn.honcho.command.adapter.CommandTypeAdapter +import org.bukkit.Bukkit + +class OfflinePlayerTypeAdapter : CommandTypeAdapter { + override fun convert(string: String, type: Class): T { + return type.cast(Bukkit.getOfflinePlayer(string)) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/WorldTypeAdapter.kt b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/WorldTypeAdapter.kt new file mode 100644 index 0000000..37bff3a --- /dev/null +++ b/src/main/kotlin/com/qrakn/honcho/command/adapter/impl/WorldTypeAdapter.kt @@ -0,0 +1,10 @@ +package com.qrakn.honcho.command.adapter.impl + +import com.qrakn.honcho.command.adapter.CommandTypeAdapter +import org.bukkit.Bukkit + +class WorldTypeAdapter : CommandTypeAdapter { + override fun convert(string: String, type: Class): T { + return type.cast(Bukkit.getWorld(string)) + } +} \ No newline at end of file