From f80f27c5fb1dcd7d75dae75ff44f669e8f237559 Mon Sep 17 00:00:00 2001 From: AgentManny Date: Sun, 20 Jan 2019 19:04:07 +0000 Subject: [PATCH 1/4] Execute commands asynchronously and custom permission message per command --- .../kotlin/com/qrakn/honcho/HonchoCommand.kt | 2 -- .../kotlin/com/qrakn/honcho/HonchoExecutor.kt | 18 +++++++++++++++--- .../com/qrakn/honcho/command/CommandMeta.kt | 7 ++++++- 3 files changed, 21 insertions(+), 6 deletions(-) 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..be6e08f 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 { @@ -60,7 +62,7 @@ internal class HonchoExecutor(private val honcho: Honcho) : CommandExecutor { 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?) + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', meta.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..9556a49 100644 --- a/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt +++ b/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt @@ -5,12 +5,17 @@ package com.qrakn.honcho.command * * @param label the command's label(s) * @param permission the command's permission node + * @param permissionMessage the command's permission message * @param description the command's description + * @param subcommands the command's subcommands + * @param async executes the command asynchronously */ @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) annotation class CommandMeta( vararg val label: String, val permission: String = "", + val permissionMessage: String = "&cYou don't have permission to use this command.", 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 From abb20733a7c38411682da7a4ddf835b71d13aa6d Mon Sep 17 00:00:00 2001 From: AgentManny Date: Sun, 20 Jan 2019 20:10:15 +0000 Subject: [PATCH 2/4] command adapters --- src/main/kotlin/com/qrakn/honcho/Honcho.kt | 11 +++++-- .../command/adapter/CommandTypeAdapter.kt | 2 ++ .../adapter/impl/BooleanTypeAdapter.kt | 24 +++++++++++++++ .../adapter/impl/GameModeTypeAdapter.kt | 29 +++++++++++++++++++ .../adapter/impl/IntegerTypeAdapter.kt | 9 ++++++ .../adapter/impl/OfflinePlayerTypeAdapter.kt | 10 +++++++ .../command/adapter/impl/WorldTypeAdapter.kt | 10 +++++++ 7 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/com/qrakn/honcho/command/adapter/impl/BooleanTypeAdapter.kt create mode 100644 src/main/kotlin/com/qrakn/honcho/command/adapter/impl/GameModeTypeAdapter.kt create mode 100644 src/main/kotlin/com/qrakn/honcho/command/adapter/impl/IntegerTypeAdapter.kt create mode 100644 src/main/kotlin/com/qrakn/honcho/command/adapter/impl/OfflinePlayerTypeAdapter.kt create mode 100644 src/main/kotlin/com/qrakn/honcho/command/adapter/impl/WorldTypeAdapter.kt diff --git a/src/main/kotlin/com/qrakn/honcho/Honcho.kt b/src/main/kotlin/com/qrakn/honcho/Honcho.kt index 8155aad..372eb0d 100644 --- a/src/main/kotlin/com/qrakn/honcho/Honcho.kt +++ b/src/main/kotlin/com/qrakn/honcho/Honcho.kt @@ -1,8 +1,10 @@ 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.GameMode +import org.bukkit.OfflinePlayer +import org.bukkit.World import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin @@ -11,8 +13,13 @@ class Honcho(val plugin: JavaPlugin) { private val executor: HonchoExecutor = HonchoExecutor(this) 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/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 From 10a7c3c7a4f427a1953581e4ed2321cb16b383dc Mon Sep 17 00:00:00 2001 From: AgentManny Date: Tue, 22 Jan 2019 19:46:26 +0000 Subject: [PATCH 3/4] global permission --- src/main/kotlin/com/qrakn/honcho/Honcho.kt | 2 ++ src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt | 8 +++++--- src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt | 2 -- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/com/qrakn/honcho/Honcho.kt b/src/main/kotlin/com/qrakn/honcho/Honcho.kt index 372eb0d..e55f620 100644 --- a/src/main/kotlin/com/qrakn/honcho/Honcho.kt +++ b/src/main/kotlin/com/qrakn/honcho/Honcho.kt @@ -2,6 +2,7 @@ package com.qrakn.honcho import com.qrakn.honcho.command.adapter.CommandTypeAdapter import com.qrakn.honcho.command.adapter.impl.* +import org.bukkit.ChatColor import org.bukkit.GameMode import org.bukkit.OfflinePlayer import org.bukkit.World @@ -11,6 +12,7 @@ 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()) diff --git a/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt b/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt index be6e08f..9bd8efe 100644 --- a/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt +++ b/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt @@ -61,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(ChatColor.translateAlternateColorCodes('&', meta.permissionMessage)) + if (!sender.hasPermission(meta.permission)) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', honcho.permissionMessage)) return true } @@ -102,7 +102,9 @@ internal class HonchoExecutor(private val honcho: Honcho) : CommandExecutor { for (i in 1 until parameters.size) { val parameter = parameters[i] val adapter = adapters[parameter.type]!! - + if (parameter == null) { + Bukkit.broadcastMessage("test") + } val translation: Any? translation = if (i == parameters.lastIndex) { adapter.convert(StringUtils.join(args, " ", i - 1, args.size), parameter.type) diff --git a/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt b/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt index 9556a49..e155027 100644 --- a/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt +++ b/src/main/kotlin/com/qrakn/honcho/command/CommandMeta.kt @@ -5,7 +5,6 @@ package com.qrakn.honcho.command * * @param label the command's label(s) * @param permission the command's permission node - * @param permissionMessage the command's permission message * @param description the command's description * @param subcommands the command's subcommands * @param async executes the command asynchronously @@ -15,7 +14,6 @@ package com.qrakn.honcho.command annotation class CommandMeta( vararg val label: String, val permission: String = "", - val permissionMessage: String = "&cYou don't have permission to use this command.", val description: String = "", val subcommands: Boolean = false, val async: Boolean = false) \ No newline at end of file From 920f5f9f7f5a7f6c14391ad496dd2eea4e721b0e Mon Sep 17 00:00:00 2001 From: AgentManny Date: Tue, 22 Jan 2019 19:53:17 +0000 Subject: [PATCH 4/4] useless shit --- src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt b/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt index 9bd8efe..a45d0e3 100644 --- a/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt +++ b/src/main/kotlin/com/qrakn/honcho/HonchoExecutor.kt @@ -102,9 +102,7 @@ internal class HonchoExecutor(private val honcho: Honcho) : CommandExecutor { for (i in 1 until parameters.size) { val parameter = parameters[i] val adapter = adapters[parameter.type]!! - if (parameter == null) { - Bukkit.broadcastMessage("test") - } + val translation: Any? translation = if (i == parameters.lastIndex) { adapter.convert(StringUtils.join(args, " ", i - 1, args.size), parameter.type)