GhostDisplays/main/kotlin/net/hareworks/ghostdisplays/display/EditSessionManager.kt
2025-12-06 04:40:18 +09:00

57 lines
1.9 KiB
Kotlin

package net.hareworks.ghostdisplays.display
import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
import net.hareworks.ghostdisplays.display.DisplayManager.DisplayOperationException
import org.bukkit.Bukkit
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.AsyncPlayerChatEvent
import org.bukkit.event.player.PlayerQuitEvent
import org.bukkit.plugin.java.JavaPlugin
class EditSessionManager(
private val plugin: JavaPlugin,
private val manager: DisplayManager
) : Listener {
private val sessions = ConcurrentHashMap<UUID, String>()
fun begin(player: Player, displayId: String) {
sessions[player.uniqueId] = displayId
}
fun cancel(player: Player): Boolean = sessions.remove(player.uniqueId) != null
fun shutdown() {
sessions.clear()
}
@EventHandler(ignoreCancelled = true)
fun onPlayerChat(event: AsyncPlayerChatEvent) {
val displayId = sessions[event.player.uniqueId] ?: return
event.isCancelled = true
val message = event.message
if (message.equals("cancel", ignoreCase = true)) {
sessions.remove(event.player.uniqueId)
event.player.sendMessage("GhostDisplays: editing for '$displayId' cancelled.")
return
}
Bukkit.getScheduler().runTask(plugin) {
try {
manager.updateText(displayId, message)
event.player.sendMessage("GhostDisplays: updated text for '$displayId'.")
} catch (ex: DisplayOperationException) {
event.player.sendMessage("GhostDisplays: ${ex.message}")
} finally {
sessions.remove(event.player.uniqueId)
}
}
}
@EventHandler
fun onPlayerQuit(event: PlayerQuitEvent) {
sessions.remove(event.player.uniqueId)
}
}