diff options
| author | Sho Sakuma <me@m1sk9.dev> | 2026-01-09 20:37:51 +0900 |
|---|---|---|
| committer | Sho Sakuma <me@m1sk9.dev> | 2026-01-09 20:37:51 +0900 |
| commit | 973b4a68f45686fd9282f6167d14e71eaa1287df (patch) | |
| tree | 693bf3d175655974f33eb1c7156c9d1d9f6411d2 /platform-paper/src | |
| parent | 64153b0481784071de033a36769059f0dbbb5a80 (diff) | |
| download | LunaticChat-973b4a68f45686fd9282f6167d14e71eaa1287df.tar.gz LunaticChat-973b4a68f45686fd9282f6167d14e71eaa1287df.tar.bz2 LunaticChat-973b4a68f45686fd9282f6167d14e71eaa1287df.zip | |
feat: Add spy logic
Diffstat (limited to 'platform-paper/src')
| -rw-r--r-- | platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt | 5 | ||||
| -rw-r--r-- | platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/handler/DirectMessageHandler.kt | 7 | ||||
| -rw-r--r-- | platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerPresenceListener.kt (renamed from platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerLogoutListener.kt) | 4 | ||||
| -rw-r--r-- | platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/SpyPermissionManager.kt | 54 | ||||
| -rw-r--r-- | platform-paper/src/main/resources/paper-plugin.yml | 7 |
5 files changed, 72 insertions, 5 deletions
diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt index 437c2b5..00f2eb9 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/LunaticChat.kt @@ -4,7 +4,9 @@ import dev.m1sk9.lunaticChat.paper.command.core.CommandRegistry import dev.m1sk9.lunaticChat.paper.command.handler.DirectMessageHandler import dev.m1sk9.lunaticChat.paper.command.impl.ReplyCommand import dev.m1sk9.lunaticChat.paper.command.impl.TellCommand +import dev.m1sk9.lunaticChat.paper.common.SpyPermissionManager import dev.m1sk9.lunaticChat.paper.config.ConfigManager +import dev.m1sk9.lunaticChat.paper.listener.PlayerPresenceListener import org.bukkit.event.Listener import org.bukkit.plugin.java.JavaPlugin @@ -34,7 +36,8 @@ class LunaticChat : ) commandRegistry.initialize() - server.pluginManager.registerEvents(this, this) + server.pluginManager.registerEvents(SpyPermissionManager, this) + server.pluginManager.registerEvents(PlayerPresenceListener(), this) logger.info("LunaticChat enabled.") } diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/handler/DirectMessageHandler.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/handler/DirectMessageHandler.kt index 6ad358d..dfa1096 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/handler/DirectMessageHandler.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/handler/DirectMessageHandler.kt @@ -1,5 +1,6 @@ package dev.m1sk9.lunaticChat.paper.command.handler +import dev.m1sk9.lunaticChat.paper.common.SpyPermissionManager import dev.m1sk9.lunaticChat.paper.config.ConfigManager import net.kyori.adventure.text.Component import org.bukkit.Bukkit @@ -71,6 +72,12 @@ class DirectMessageHandler { val format = lunaticChatConfiguration.messageFormat.directMessageFormat val formattedMessage = formatMessage(format, sender.name, recipient.name, message) + SpyPermissionManager.getDirectMessageSpyPlayers().values.forEach { + if (it.isOnline && it.uniqueId != sender.uniqueId && it.uniqueId != recipient.uniqueId) { + it.sendMessage(formattedMessage) + } + } + sender.sendMessage(formattedMessage) recipient.sendMessage(formattedMessage) return true diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerLogoutListener.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerPresenceListener.kt index 07ee635..ad53929 100644 --- a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerLogoutListener.kt +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/PlayerPresenceListener.kt @@ -5,8 +5,8 @@ import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.player.PlayerQuitEvent -class PlayerLogoutListener : Listener { - @EventHandler +class PlayerPresenceListener : Listener { + @EventHandler(ignoreCancelled = true) fun onQuit( lunaticChat: LunaticChat, event: PlayerQuitEvent, diff --git a/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/SpyPermissionManager.kt b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/SpyPermissionManager.kt new file mode 100644 index 0000000..26de098 --- /dev/null +++ b/platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/listener/SpyPermissionManager.kt @@ -0,0 +1,54 @@ +package dev.m1sk9.lunaticChat.paper.common + +import dev.m1sk9.lunaticChat.engine.permission.LunaticChatPermissionNode +import org.bukkit.Bukkit +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent +import org.bukkit.event.player.PlayerQuitEvent +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap + +/** + * Manages spy permission cache for direct messages. + * Caches player references to avoid repeated lookups. + */ +object SpyPermissionManager : Listener { + private val directMessageSpyPlayers: ConcurrentHashMap<UUID, Player> = ConcurrentHashMap() + + /** + * Gets all players with spy permission as a map of UUID to Player. + */ + fun getDirectMessageSpyPlayers(): Map<UUID, Player> = directMessageSpyPlayers.toMap() + + /** + * Gets all player UUIDs with spy permission. + */ + fun getDirectMessageSpyPlayerIds(): Set<UUID> = directMessageSpyPlayers.keys + + /** + * Updates the cache of players with direct message spy permission. + * Call this on player join/quit/permission change events. + */ + fun updateSpyCache() { + directMessageSpyPlayers.clear() + Bukkit + .getOnlinePlayers() + .filter { + it.hasAllPermission { + +LunaticChatPermissionNode.Spy + } + }.associateByTo(directMessageSpyPlayers) { it.uniqueId } + } + + @EventHandler(ignoreCancelled = true) + fun onPlayerJoin(e: PlayerJoinEvent) { + updateSpyCache() + } + + @EventHandler(ignoreCancelled = true) + fun onPlayerQuit(event: PlayerQuitEvent) { + directMessageSpyPlayers.remove(event.player.uniqueId) + } +} diff --git a/platform-paper/src/main/resources/paper-plugin.yml b/platform-paper/src/main/resources/paper-plugin.yml index db7aac1..7ad79d6 100644 --- a/platform-paper/src/main/resources/paper-plugin.yml +++ b/platform-paper/src/main/resources/paper-plugin.yml @@ -10,6 +10,9 @@ website: lc.m1sk9.dev permissions: lunaticchat.command.tell: - default: not op + default: true lunaticchat.command.reply: - default: not op + default: true + + lunaticchat.spy: + default: op |
