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() 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) } }