180 lines
7.7 KiB
Java
180 lines
7.7 KiB
Java
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<UUID, Long> cooldowns = new HashMap<>();
|
||
|
||
/** Ticket-IDs für die der Ersteller bereits über Schließung informiert wurde */
|
||
private final Set<Integer> 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 <Text> &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 <ID> &7– Ticket annehmen"));
|
||
player.sendMessage(plugin.color("&e/ticket close <ID> [Kommentar] &7– Ticket schließen"));
|
||
}
|
||
if (player.hasPermission("ticket.admin")) {
|
||
player.sendMessage(plugin.color("&e/ticket forward <ID> <Spieler> &7– Ticket weiterleiten"));
|
||
player.sendMessage(plugin.color("&e/ticket reload &7– Konfiguration neu laden"));
|
||
}
|
||
player.sendMessage(plugin.color("&8&m "));
|
||
}
|
||
} |