summaryrefslogtreecommitdiff
path: root/platform-paper/src
diff options
context:
space:
mode:
authorSho Sakuma <me@m1sk9.dev>2026-01-09 20:37:51 +0900
committerSho Sakuma <me@m1sk9.dev>2026-01-09 20:37:51 +0900
commit973b4a68f45686fd9282f6167d14e71eaa1287df (patch)
tree693bf3d175655974f33eb1c7156c9d1d9f6411d2 /platform-paper/src
parent64153b0481784071de033a36769059f0dbbb5a80 (diff)
downloadLunaticChat-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.kt5
-rw-r--r--platform-paper/src/main/kotlin/dev/m1sk9/lunaticChat/paper/command/handler/DirectMessageHandler.kt7
-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.kt54
-rw-r--r--platform-paper/src/main/resources/paper-plugin.yml7
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