package de.ticketsystem.manager; import de.ticketsystem.TicketPlugin; import de.ticketsystem.model.Ticket; import de.ticketsystem.model.TicketStatus; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; public class TicketManager { private final TicketPlugin plugin; /** Cooldown Map: UUID → Zeitstempel letztes Ticket */ private final Map cooldowns = new HashMap<>(); /** Ticket-IDs für die der Ersteller bereits über Schließung informiert wurde */ private final Set notifiedClosedTickets = new HashSet<>(); public TicketManager(TicketPlugin plugin) { this.plugin = plugin; } // ─────────────────────────── Cooldown ────────────────────────────────── public boolean hasCooldown(UUID uuid) { if (!cooldowns.containsKey(uuid)) return false; long cooldownSeconds = plugin.getConfig().getLong("ticket-cooldown", 60) * 1000L; return (System.currentTimeMillis() - cooldowns.get(uuid)) < cooldownSeconds; } public long getRemainingCooldown(UUID uuid) { long cooldownMillis = plugin.getConfig().getLong("ticket-cooldown", 60) * 1000L; long elapsed = System.currentTimeMillis() - cooldowns.getOrDefault(uuid, 0L); return Math.max(0, (cooldownMillis - elapsed) / 1000); } public void setCooldown(UUID uuid) { cooldowns.put(uuid, System.currentTimeMillis()); } // ─────────────────────────── Benachrichtigungen ──────────────────────── /** * Benachrichtigt alle Online-Supporter/Admins über ein neues Ticket * und sendet optional eine Discord-Webhook-Nachricht. */ public void notifyTeam(Ticket ticket) { String msg = plugin.formatMessage("messages.new-ticket-notify") .replace("{player}", ticket.getCreatorName()) .replace("{message}", ticket.getMessage()) .replace("{id}", String.valueOf(ticket.getId())); for (Player p : Bukkit.getOnlinePlayers()) { if (p.hasPermission("ticket.support") || p.hasPermission("ticket.admin")) { p.sendMessage(msg); p.sendMessage(plugin.color("&7» Klicke &e/ticket list &7um die GUI zu öffnen.")); } } // Discord-Webhook (asynchron, kein Einfluss auf Server-Performance) plugin.getDiscordWebhook().sendNewTicket(ticket); } /** * Benachrichtigt den Ersteller, wenn sein Ticket angenommen wurde. */ public void notifyCreatorClaimed(Ticket ticket) { Player creator = Bukkit.getPlayer(ticket.getCreatorUUID()); if (creator != null && creator.isOnline()) { String msg = plugin.formatMessage("messages.ticket-claimed-notify") .replace("{id}", String.valueOf(ticket.getId())) .replace("{claimer}", ticket.getClaimerName()); creator.sendMessage(msg); } } /** * Benachrichtigt den Ersteller, wenn sein Ticket weitergeleitet wurde. */ public void notifyCreatorForwarded(Ticket ticket) { Player creator = Bukkit.getPlayer(ticket.getCreatorUUID()); if (creator != null && creator.isOnline()) { String forwardedTo = ticket.getForwardedToName() != null ? ticket.getForwardedToName() : "einen Supporter"; String msg = plugin.formatMessage("messages.ticket-forwarded-creator-notify") .replace("{id}", String.valueOf(ticket.getId())) .replace("{supporter}", forwardedTo); creator.sendMessage(msg); } } /** * Sendet dem weitergeleiteten Supporter eine Benachrichtigung * und informiert optional Discord. */ public void notifyForwardedTo(Ticket ticket, String fromName) { Player target = Bukkit.getPlayer(ticket.getForwardedToUUID()); if (target != null && target.isOnline()) { String msg = plugin.formatMessage("messages.ticket-forwarded-notify") .replace("{player}", ticket.getCreatorName()) .replace("{id}", String.valueOf(ticket.getId())); target.sendMessage(msg); } // Discord plugin.getDiscordWebhook().sendTicketForwarded(ticket, fromName); } /** * Benachrichtigt den Ersteller, wenn sein Ticket geschlossen wurde, * und informiert optional Discord. */ public void notifyCreatorClosed(Ticket ticket) { notifyCreatorClosed(ticket, null); } /** * Benachrichtigt den Ersteller, wenn sein Ticket geschlossen wurde. * @param closerName Name des Admins/Supporters der es geschlossen hat (für Discord, kann null sein) */ public void notifyCreatorClosed(Ticket ticket, String closerName) { notifiedClosedTickets.add(ticket.getId()); Player creator = Bukkit.getPlayer(ticket.getCreatorUUID()); if (creator != null && creator.isOnline()) { String comment = (ticket.getCloseComment() != null && !ticket.getCloseComment().isEmpty()) ? ticket.getCloseComment() : ""; String msg = plugin.formatMessage("messages.ticket-closed-notify") .replace("{id}", String.valueOf(ticket.getId())) .replace("{comment}", comment); creator.sendMessage(msg); if (!comment.isEmpty()) { creator.sendMessage(plugin.color("&7Kommentar des Supports: &f" + comment)); } } // Discord String closer = closerName != null ? closerName : "Unbekannt"; plugin.getDiscordWebhook().sendTicketClosed(ticket, closer); } /** * Prüft ob der Ersteller für dieses Ticket bereits über die Schließung informiert wurde. */ public boolean wasClosedNotificationSent(int ticketId) { return notifiedClosedTickets.contains(ticketId); } // ─────────────────────────── Hilfsmethoden ───────────────────────────── public boolean hasReachedTicketLimit(UUID uuid) { int max = plugin.getConfig().getInt("max-open-tickets-per-player", 2); if (max <= 0) return false; return plugin.getDatabaseManager().countOpenTicketsByPlayer(uuid) >= max; } public void sendHelpMessage(Player player) { player.sendMessage(plugin.color("&8&m ")); player.sendMessage(plugin.color("&6TicketSystem &7– Befehle")); player.sendMessage(plugin.color("&8&m ")); player.sendMessage(plugin.color("&e/ticket create &7– Neues Ticket erstellen")); player.sendMessage(plugin.color("&e/ticket list &7– Deine Tickets ansehen (GUI)")); if (player.hasPermission("ticket.support") || player.hasPermission("ticket.admin")) { player.sendMessage(plugin.color("&e/ticket claim &7– Ticket annehmen")); player.sendMessage(plugin.color("&e/ticket close [Kommentar] &7– Ticket schließen")); } if (player.hasPermission("ticket.admin")) { player.sendMessage(plugin.color("&e/ticket forward &7– Ticket weiterleiten")); player.sendMessage(plugin.color("&e/ticket reload &7– Konfiguration neu laden")); } player.sendMessage(plugin.color("&8&m ")); } }