From 43b9f87e4be0eac2adf8514f6d209e8d6b8f97af Mon Sep 17 00:00:00 2001 From: wtlgo Date: Tue, 28 Feb 2023 20:21:05 +0300 Subject: [PATCH] Add spy feature --- .../java/dev/mikchan/mcnp/chat/ChatPlugin.kt | 2 + .../java/dev/mikchan/mcnp/chat/Creators.kt | 7 ++ .../chat/commands/DefaultCommandManager.kt | 4 +- .../mcnp/chat/commands/command/SpyCommand.kt | 54 ++++++++++++++ .../mcnp/chat/events/DefaultEventManager.kt | 2 + .../mcnp/chat/events/listener/ChatListener.kt | 20 +++-- .../mcnp/chat/events/listener/MCNCListener.kt | 40 ++++++++++ .../mcnp/chat/formatting/CommonFormatter.kt | 24 +++++- .../mcnp/chat/formatting/DefaultFormatter.kt | 73 ++++++++++++++----- .../mcnp/chat/formatting/IFormatter.kt | 10 +++ .../mcnp/chat/formatting/PAPIFormatter.kt | 56 ++++++++++++-- .../dev/mikchan/mcnp/chat/keys/DefaultKeys.kt | 9 +++ .../mcnp/chat/keys/DefaultKeysCreator.kt | 9 +++ .../java/dev/mikchan/mcnp/chat/keys/IKey.kt | 9 +++ .../java/dev/mikchan/mcnp/chat/keys/IKeys.kt | 5 ++ .../mikchan/mcnp/chat/keys/IKeysCreator.kt | 7 ++ .../java/dev/mikchan/mcnp/chat/keys/Key.kt | 6 ++ src/main/resources/plugin.yml | 7 ++ 18 files changed, 312 insertions(+), 32 deletions(-) create mode 100644 src/main/java/dev/mikchan/mcnp/chat/commands/command/SpyCommand.kt create mode 100644 src/main/java/dev/mikchan/mcnp/chat/events/listener/MCNCListener.kt create mode 100644 src/main/java/dev/mikchan/mcnp/chat/keys/DefaultKeys.kt create mode 100644 src/main/java/dev/mikchan/mcnp/chat/keys/DefaultKeysCreator.kt create mode 100644 src/main/java/dev/mikchan/mcnp/chat/keys/IKey.kt create mode 100644 src/main/java/dev/mikchan/mcnp/chat/keys/IKeys.kt create mode 100644 src/main/java/dev/mikchan/mcnp/chat/keys/IKeysCreator.kt create mode 100644 src/main/java/dev/mikchan/mcnp/chat/keys/Key.kt diff --git a/src/main/java/dev/mikchan/mcnp/chat/ChatPlugin.kt b/src/main/java/dev/mikchan/mcnp/chat/ChatPlugin.kt index 56f8eaa..56141b9 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/ChatPlugin.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/ChatPlugin.kt @@ -4,6 +4,7 @@ import dev.mikchan.mcnp.chat.commands.ICommandManager import dev.mikchan.mcnp.chat.config.IConfig import dev.mikchan.mcnp.chat.events.IEventManager import dev.mikchan.mcnp.chat.formatting.IFormatter +import dev.mikchan.mcnp.chat.keys.IKeys import dev.mikchan.mcnp.chat.users.IUserManager import org.bstats.bukkit.Metrics import org.bukkit.plugin.java.JavaPlugin @@ -22,6 +23,7 @@ class ChatPlugin : JavaPlugin() { val formatter: IFormatter = Creators.formatter.create(this) val userManager: IUserManager = Creators.userManager.create(this) val eventManager: IEventManager = Creators.eventManager.create(this) + val keys: IKeys = Creators.keys.create(this) override fun onEnable() { commandManager.enableAll() diff --git a/src/main/java/dev/mikchan/mcnp/chat/Creators.kt b/src/main/java/dev/mikchan/mcnp/chat/Creators.kt index 2ae6200..5e7bd8d 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/Creators.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/Creators.kt @@ -8,6 +8,8 @@ import dev.mikchan.mcnp.chat.events.DefaultEventManagerCreator import dev.mikchan.mcnp.chat.events.IEventManagerCreator import dev.mikchan.mcnp.chat.formatting.DefaultFormatterCreator import dev.mikchan.mcnp.chat.formatting.IFormatterCreator +import dev.mikchan.mcnp.chat.keys.DefaultKeysCreator +import dev.mikchan.mcnp.chat.keys.IKeysCreator import dev.mikchan.mcnp.chat.users.DefaultUserManagerCreator import dev.mikchan.mcnp.chat.users.IUserManagerCreator @@ -43,4 +45,9 @@ object Creators { * The event manager builder. */ var eventManager: IEventManagerCreator = DefaultEventManagerCreator() + + /** + * The keys' builder. + */ + var keys: IKeysCreator = DefaultKeysCreator() } diff --git a/src/main/java/dev/mikchan/mcnp/chat/commands/DefaultCommandManager.kt b/src/main/java/dev/mikchan/mcnp/chat/commands/DefaultCommandManager.kt index 879123f..55feaef 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/commands/DefaultCommandManager.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/commands/DefaultCommandManager.kt @@ -1,6 +1,7 @@ package dev.mikchan.mcnp.chat.commands import dev.mikchan.mcnp.chat.ChatPlugin +import dev.mikchan.mcnp.chat.commands.command.* import dev.mikchan.mcnp.chat.commands.command.ICommand import dev.mikchan.mcnp.chat.commands.command.MsgCommand import dev.mikchan.mcnp.chat.commands.command.ReloadCommand @@ -12,7 +13,8 @@ internal class DefaultCommandManager(private val plugin: ChatPlugin) : ICommandM private val executors: Map = mapOf( "mcn_chat" to ReloadCommand(plugin), "msg" to MsgCommand(plugin, messageHistory), - "reply" to ReplyCommand(plugin, messageHistory) + "reply" to ReplyCommand(plugin, messageHistory), + "spy" to SpyCommand(plugin), ) override fun enableAll() { diff --git a/src/main/java/dev/mikchan/mcnp/chat/commands/command/SpyCommand.kt b/src/main/java/dev/mikchan/mcnp/chat/commands/command/SpyCommand.kt new file mode 100644 index 0000000..06d1ebe --- /dev/null +++ b/src/main/java/dev/mikchan/mcnp/chat/commands/command/SpyCommand.kt @@ -0,0 +1,54 @@ +package dev.mikchan.mcnp.chat.commands.command + +import dev.mikchan.mcnp.chat.ChatPlugin +import org.bukkit.ChatColor +import org.bukkit.command.Command +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class SpyCommand(private val plugin: ChatPlugin) : ICommand { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + val player = sender as? Player + + if (player == null) { + sender.sendMessage("${ChatColor.DARK_RED}This action is only accessible to players.") + return false + } + + if (!player.hasPermission("mcn.chat.spy")) { + sender.sendMessage("${ChatColor.DARK_RED}You have no permission to do that.") + return false + } + + val prev = try { + player.persistentDataContainer.getOrDefault(plugin.keys.spy.key, plugin.keys.spy.type, 0.toByte()) + } catch (ignore: Exception) { + 0.toByte() + } + + val next = ((prev + 1) % 2).toByte() + player.persistentDataContainer.set(plugin.keys.spy.key, plugin.keys.spy.type, next) + + when (next) { + 1.toByte() -> { + player.sendMessage("${ChatColor.DARK_GREEN}Spy is switched on!") + } + + 0.toByte() -> { + player.sendMessage("${ChatColor.DARK_GREEN}Spy is switched off!") + } + + else -> { + player.sendMessage("${ChatColor.DARK_RED}Error.") + } + } + + return true + } + + override fun onTabComplete( + sender: CommandSender, command: Command, label: String, args: Array + ): MutableList { + return mutableListOf() + } +} diff --git a/src/main/java/dev/mikchan/mcnp/chat/events/DefaultEventManager.kt b/src/main/java/dev/mikchan/mcnp/chat/events/DefaultEventManager.kt index 89bab71..8ecbd06 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/events/DefaultEventManager.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/events/DefaultEventManager.kt @@ -2,12 +2,14 @@ package dev.mikchan.mcnp.chat.events import dev.mikchan.mcnp.chat.ChatPlugin import dev.mikchan.mcnp.chat.events.listener.ChatListener +import dev.mikchan.mcnp.chat.events.listener.MCNCListener import org.bukkit.event.HandlerList import org.bukkit.event.Listener internal class DefaultEventManager(private val plugin: ChatPlugin) : IEventManager { private val listeners: List = listOf( ChatListener(plugin), + MCNCListener(plugin), ) override fun unregister() { diff --git a/src/main/java/dev/mikchan/mcnp/chat/events/listener/ChatListener.kt b/src/main/java/dev/mikchan/mcnp/chat/events/listener/ChatListener.kt index 09b6a3a..2a9a637 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/events/listener/ChatListener.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/events/listener/ChatListener.kt @@ -12,13 +12,19 @@ import org.bukkit.event.player.AsyncPlayerChatPreviewEvent import kotlin.streams.asSequence internal class ChatListener(private val plugin: ChatPlugin) : Listener { + private fun checkPermissions(player: Player, isGlobal: Boolean): Boolean { + if (!player.hasPermission("mcn.chat.global") && isGlobal) return false + if (!player.hasPermission("mcn.chat.local") && !isGlobal) return false + return true + } + private fun handleChatEvent(event: AsyncPlayerChatEvent, isPreview: Boolean): Boolean { var msg = event.message.trim() val isGlobal = !plugin.config.enableLocal || msg.startsWith(plugin.config.globalPrefix) - if ((!event.player.hasPermission("mcn.chat.global") && isGlobal) || (!event.player.hasPermission("mcn.chat.local") && !isGlobal)) { + if (!isPreview && !checkPermissions(event.player, isGlobal)) { plugin.server.scheduler.scheduleSyncDelayedTask(plugin) { - event.player.sendMessage(ChatColor.RED.toString() + "You have no permission to do that!") + event.player.sendMessage("${ChatColor.RED}You have no permission to do that!") } return false @@ -36,15 +42,15 @@ internal class ChatListener(private val plugin: ChatPlugin) : Listener { } else { val r = plugin.config.localRadius - recipients.addAll(plugin.server.onlinePlayers.stream() - .filter { player -> player.world == event.player.world && player.location.distance(event.player.location) < r } - .asSequence()) + recipients.addAll(plugin.server.onlinePlayers.stream().filter { player -> + player.world == event.player.world && player.location.distance(event.player.location) < r + }.asSequence()) } val mcncEvent = MCNChatEvent( event.player, recipients, isGlobal, msg, if (isGlobal) plugin.formatter.formatGlobal( - event.player, msg - ) else plugin.formatter.formatLocal(event.player, msg), isPreview, event.isAsynchronous + event.player, "%2\$s" + ) else plugin.formatter.formatLocal(event.player, "%2\$s"), isPreview, event.isAsynchronous ) plugin.server.pluginManager.callEvent(mcncEvent) diff --git a/src/main/java/dev/mikchan/mcnp/chat/events/listener/MCNCListener.kt b/src/main/java/dev/mikchan/mcnp/chat/events/listener/MCNCListener.kt new file mode 100644 index 0000000..4483b72 --- /dev/null +++ b/src/main/java/dev/mikchan/mcnp/chat/events/listener/MCNCListener.kt @@ -0,0 +1,40 @@ +package dev.mikchan.mcnp.chat.events.listener + +import dev.mikchan.mcnp.chat.ChatPlugin +import dev.mikchan.mcnp.chat.events.event.MCNChatEvent +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener + + +internal class MCNCListener(private val plugin: ChatPlugin) : Listener { + private fun checkSpy(player: Player): Boolean { + return try { + player.persistentDataContainer.getOrDefault( + plugin.keys.spy.key, plugin.keys.spy.type, 0.toByte() + ) != 0.toByte() && player.hasPermission("mcn.chat.spy") + } catch (ignore: Exception) { + false + } + } + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + fun onMCNCEvent(event: MCNChatEvent) { + if (event.isCancelled) return + if (event.isPreview) return + if (event.isGlobal) return + + plugin.server.scheduler.scheduleSyncDelayedTask(plugin) { + val spies = plugin.server.onlinePlayers.filter { player -> !event.recipients.contains(player) } + .filter { player -> checkSpy(player) }.toSet() + + if (spies.isEmpty()) return@scheduleSyncDelayedTask + + val msg = plugin.formatter.formatSpy(event.sender, event.message) + for (spy in spies) { + spy.sendMessage(event.sender.uniqueId, msg) + } + } + } +} diff --git a/src/main/java/dev/mikchan/mcnp/chat/formatting/CommonFormatter.kt b/src/main/java/dev/mikchan/mcnp/chat/formatting/CommonFormatter.kt index 70124af..e45e53b 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/formatting/CommonFormatter.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/formatting/CommonFormatter.kt @@ -5,7 +5,14 @@ import org.bukkit.ChatColor internal abstract class CommonFormatter(private val plugin: ChatPlugin) : IFormatter { protected fun prepareTemplate( - template: String, from: () -> String?, to: () -> String?, player: () -> String?, message: () -> String? + template: String, + from: () -> String?, + to: () -> String?, + player: () -> String?, + globalPlayer: () -> String?, + localPlayer: () -> String?, + spyPlayer: () -> String?, + message: () -> String? ): String { var res = ChatColor.translateAlternateColorCodes('&', template) @@ -24,6 +31,21 @@ internal abstract class CommonFormatter(private val plugin: ChatPlugin) : IForma res = res.replace(":player:", defPlayer) } + if (res.contains(":global_player:")) { + val defPlayer = globalPlayer() ?: "" + res = res.replace(":global_player:", defPlayer) + } + + if (res.contains(":local_player:")) { + val defPlayer = localPlayer() ?: "" + res = res.replace(":local_player:", defPlayer) + } + + if (res.contains(":spy_player:")) { + val defPlayer = spyPlayer() ?: "" + res = res.replace(":spy_player:", defPlayer) + } + if (res.contains(":message:")) { val msg = message() diff --git a/src/main/java/dev/mikchan/mcnp/chat/formatting/DefaultFormatter.kt b/src/main/java/dev/mikchan/mcnp/chat/formatting/DefaultFormatter.kt index d63be41..01dfbea 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/formatting/DefaultFormatter.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/formatting/DefaultFormatter.kt @@ -7,9 +7,12 @@ import org.bukkit.entity.Player internal class DefaultFormatter(private val plugin: ChatPlugin) : CommonFormatter(plugin) { override fun formatPrivate(from: Player, to: Player, message: String): String { return prepareTemplate(plugin.config.privateTemplate, - { from.displayName }, + { "%1\$s" }, { to.displayName }, - { from.displayName }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, { if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( '&', message @@ -18,26 +21,62 @@ internal class DefaultFormatter(private val plugin: ChatPlugin) : CommonFormatte } override fun formatConsole(to: Player, message: String): String { - return prepareTemplate(plugin.config.consoleTemplate, { null }, { to.displayName }, { to.displayName }, { - ChatColor.translateAlternateColorCodes( - '&', message - ) - }) + return prepareTemplate(plugin.config.consoleTemplate, + { to.displayName }, + { to.displayName }, + { to.displayName }, + { to.displayName }, + { to.displayName }, + { to.displayName }, + { + ChatColor.translateAlternateColorCodes( + '&', message + ) + }) } override fun formatGlobal(from: Player, message: String): String { - return prepareTemplate(plugin.config.globalTemplate, { from.displayName }, { null }, { from.displayName }) { - if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( - '&', message - ) else ChatColor.stripColor(message) - } + return prepareTemplate(plugin.config.globalTemplate, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { + if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( + '&', message + ) else ChatColor.stripColor(message) + }) } override fun formatLocal(from: Player, message: String): String { - return prepareTemplate(plugin.config.localTemplate, { from.displayName }, { null }, { from.displayName }, { - if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( - '&', message - ) else ChatColor.stripColor(message) - }) + return prepareTemplate(plugin.config.localTemplate, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { + if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( + '&', message + ) else ChatColor.stripColor(message) + }) + } + + override fun formatSpy(from: Player, message: String): String { + return prepareTemplate(plugin.config.spyTemplate, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { "%1\$s" }, + { + if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( + '&', message + ) else ChatColor.stripColor(message) + }) } } diff --git a/src/main/java/dev/mikchan/mcnp/chat/formatting/IFormatter.kt b/src/main/java/dev/mikchan/mcnp/chat/formatting/IFormatter.kt index eeda438..47b04c6 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/formatting/IFormatter.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/formatting/IFormatter.kt @@ -46,4 +46,14 @@ interface IFormatter { * @return The formatted message. */ fun formatLocal(from: Player, message: String): String + + /** + * Formats a local message. + * + * @param from The player that sent the message. + * @param message The text of the message. + * + * @return The formatted message. + */ + fun formatSpy(from: Player, message: String): String } diff --git a/src/main/java/dev/mikchan/mcnp/chat/formatting/PAPIFormatter.kt b/src/main/java/dev/mikchan/mcnp/chat/formatting/PAPIFormatter.kt index 8b04b5c..7a87cc3 100644 --- a/src/main/java/dev/mikchan/mcnp/chat/formatting/PAPIFormatter.kt +++ b/src/main/java/dev/mikchan/mcnp/chat/formatting/PAPIFormatter.kt @@ -8,8 +8,7 @@ import org.bukkit.entity.Player internal class PAPIFormatter(private val plugin: ChatPlugin) : CommonFormatter(plugin) { private fun prepareFromPlayer(player: Player): String { return ChatColor.translateAlternateColorCodes( - '&', - PlaceholderAPI.setPlaceholders(player, plugin.config.fromTemplate) + '&', PlaceholderAPI.setPlaceholders(player, plugin.config.fromTemplate) ) } @@ -25,11 +24,32 @@ internal class PAPIFormatter(private val plugin: ChatPlugin) : CommonFormatter(p ) } + private fun prepareGlobalPlayer(player: Player): String { + return ChatColor.translateAlternateColorCodes( + '&', PlaceholderAPI.setPlaceholders(player, plugin.config.globalPlayerTemplate) + ) + } + + private fun prepareLocalPlayer(player: Player): String { + return ChatColor.translateAlternateColorCodes( + '&', PlaceholderAPI.setPlaceholders(player, plugin.config.localPlayerTemplate) + ) + } + + private fun prepareSpyPlayer(player: Player): String { + return ChatColor.translateAlternateColorCodes( + '&', PlaceholderAPI.setPlaceholders(player, plugin.config.spyPlayerTemplate) + ) + } + override fun formatPrivate(from: Player, to: Player, message: String): String { return prepareTemplate(plugin.config.privateTemplate, { prepareFromPlayer(from) }, { prepareToPlayer(to) }, - { preparePlayer(to) }, + { preparePlayer(from) }, + { prepareGlobalPlayer(from) }, + { prepareLocalPlayer(from) }, + { prepareSpyPlayer(from) }, { if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( '&', message @@ -39,9 +59,12 @@ internal class PAPIFormatter(private val plugin: ChatPlugin) : CommonFormatter(p override fun formatConsole(to: Player, message: String): String { return prepareTemplate(plugin.config.consoleTemplate, - { null }, + { prepareFromPlayer(to) }, { prepareToPlayer(to) }, { preparePlayer(to) }, + { prepareGlobalPlayer(to) }, + { prepareLocalPlayer(to) }, + { prepareSpyPlayer(to) }, { ChatColor.translateAlternateColorCodes( '&', message @@ -52,8 +75,11 @@ internal class PAPIFormatter(private val plugin: ChatPlugin) : CommonFormatter(p override fun formatGlobal(from: Player, message: String): String { return prepareTemplate(plugin.config.globalTemplate, { prepareFromPlayer(from) }, - { null }, + { prepareToPlayer(from) }, { preparePlayer(from) }, + { prepareGlobalPlayer(from) }, + { prepareLocalPlayer(from) }, + { prepareSpyPlayer(from) }, { if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( '&', message @@ -64,8 +90,26 @@ internal class PAPIFormatter(private val plugin: ChatPlugin) : CommonFormatter(p override fun formatLocal(from: Player, message: String): String { return prepareTemplate(plugin.config.localTemplate, { prepareFromPlayer(from) }, - { null }, + { prepareToPlayer(from) }, + { preparePlayer(from) }, + { prepareGlobalPlayer(from) }, + { prepareLocalPlayer(from) }, + { prepareSpyPlayer(from) }, + { + if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( + '&', message + ) else ChatColor.stripColor(message) + }) + } + + override fun formatSpy(from: Player, message: String): String { + return prepareTemplate(plugin.config.localTemplate, + { prepareFromPlayer(from) }, + { prepareToPlayer(from) }, { preparePlayer(from) }, + { prepareGlobalPlayer(from) }, + { prepareLocalPlayer(from) }, + { prepareSpyPlayer(from) }, { if (from.hasPermission("mcn.chat.colors")) ChatColor.translateAlternateColorCodes( '&', message diff --git a/src/main/java/dev/mikchan/mcnp/chat/keys/DefaultKeys.kt b/src/main/java/dev/mikchan/mcnp/chat/keys/DefaultKeys.kt new file mode 100644 index 0000000..ef5cefd --- /dev/null +++ b/src/main/java/dev/mikchan/mcnp/chat/keys/DefaultKeys.kt @@ -0,0 +1,9 @@ +package dev.mikchan.mcnp.chat.keys + +import dev.mikchan.mcnp.chat.ChatPlugin +import org.bukkit.NamespacedKey +import org.bukkit.persistence.PersistentDataType + +internal class DefaultKeys(plugin: ChatPlugin) : IKeys { + override val spy = Key(NamespacedKey(plugin, "spy"), PersistentDataType.BYTE) +} diff --git a/src/main/java/dev/mikchan/mcnp/chat/keys/DefaultKeysCreator.kt b/src/main/java/dev/mikchan/mcnp/chat/keys/DefaultKeysCreator.kt new file mode 100644 index 0000000..a4711ab --- /dev/null +++ b/src/main/java/dev/mikchan/mcnp/chat/keys/DefaultKeysCreator.kt @@ -0,0 +1,9 @@ +package dev.mikchan.mcnp.chat.keys + +import dev.mikchan.mcnp.chat.ChatPlugin + +internal class DefaultKeysCreator : IKeysCreator { + override fun create(plugin: ChatPlugin): IKeys { + return DefaultKeys(plugin) + } +} diff --git a/src/main/java/dev/mikchan/mcnp/chat/keys/IKey.kt b/src/main/java/dev/mikchan/mcnp/chat/keys/IKey.kt new file mode 100644 index 0000000..bf19140 --- /dev/null +++ b/src/main/java/dev/mikchan/mcnp/chat/keys/IKey.kt @@ -0,0 +1,9 @@ +package dev.mikchan.mcnp.chat.keys + +import org.bukkit.NamespacedKey +import org.bukkit.persistence.PersistentDataType + +interface IKey { + val key: NamespacedKey + val type: PersistentDataType +} diff --git a/src/main/java/dev/mikchan/mcnp/chat/keys/IKeys.kt b/src/main/java/dev/mikchan/mcnp/chat/keys/IKeys.kt new file mode 100644 index 0000000..51f1a50 --- /dev/null +++ b/src/main/java/dev/mikchan/mcnp/chat/keys/IKeys.kt @@ -0,0 +1,5 @@ +package dev.mikchan.mcnp.chat.keys + +interface IKeys { + val spy: IKey +} diff --git a/src/main/java/dev/mikchan/mcnp/chat/keys/IKeysCreator.kt b/src/main/java/dev/mikchan/mcnp/chat/keys/IKeysCreator.kt new file mode 100644 index 0000000..921701a --- /dev/null +++ b/src/main/java/dev/mikchan/mcnp/chat/keys/IKeysCreator.kt @@ -0,0 +1,7 @@ +package dev.mikchan.mcnp.chat.keys + +import dev.mikchan.mcnp.chat.ChatPlugin + +interface IKeysCreator { + fun create(plugin: ChatPlugin): IKeys +} diff --git a/src/main/java/dev/mikchan/mcnp/chat/keys/Key.kt b/src/main/java/dev/mikchan/mcnp/chat/keys/Key.kt new file mode 100644 index 0000000..cef3136 --- /dev/null +++ b/src/main/java/dev/mikchan/mcnp/chat/keys/Key.kt @@ -0,0 +1,6 @@ +package dev.mikchan.mcnp.chat.keys + +import org.bukkit.NamespacedKey +import org.bukkit.persistence.PersistentDataType + +internal class Key(override val key: NamespacedKey, override val type: PersistentDataType) : IKey diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e3650e0..052bc3b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -36,6 +36,10 @@ commands: permission: mcn.chat.reply description: Reply to private message + spy: + permission: mcn.chat.spy + description: Enables spy feature + mcn_chat: aliases: - chat @@ -61,6 +65,9 @@ permissions: mcn.chat.colors: default: op + mcn.chat.spy: + default: true + mcn.chat.admin.*: default: op children: