Update from Git Manager GUI

This commit is contained in:
2026-02-21 00:55:27 +01:00
parent a91e17a097
commit b7de357e81
15 changed files with 2313 additions and 1034 deletions

View File

@@ -1,6 +1,7 @@
package de.ticketsystem.manager;
import de.ticketsystem.TicketPlugin;
import de.ticketsystem.model.ConfigCategory;
import de.ticketsystem.model.Ticket;
import de.ticketsystem.model.TicketStatus;
import org.bukkit.Bukkit;
@@ -40,9 +41,7 @@ public class TicketManager {
return Math.max(0, (cooldownMillis - elapsed) / 1000);
}
public void setCooldown(UUID uuid) {
cooldowns.put(uuid, System.currentTimeMillis());
}
public void setCooldown(UUID uuid) { cooldowns.put(uuid, System.currentTimeMillis()); }
// ─────────────────────────── Benachrichtigungen ────────────────────────
@@ -51,14 +50,25 @@ public class TicketManager {
* und sendet optional eine Discord-Webhook-Nachricht.
*/
public void notifyTeam(Ticket ticket) {
// Sicherheitschecks für null-Werte
String creatorName = ticket.getCreatorName() != null ? ticket.getCreatorName() : "Unbekannt";
String message = ticket.getMessage() != null ? ticket.getMessage() : "";
String message = ticket.getMessage() != null ? ticket.getMessage() : "";
// Kategorie & Priorität optional anzeigen
String categoryInfo = "";
String priorityInfo = "";
if (plugin.getConfig().getBoolean("categories-enabled", true)) {
de.ticketsystem.model.ConfigCategory cat = plugin.getCategoryManager().fromKey(ticket.getCategoryKey());
categoryInfo = " §7[§r" + cat.getColored() + "§7]";
}
if (plugin.getConfig().getBoolean("priorities-enabled", true)) {
priorityInfo = " §7Priorität: §r" + ticket.getPriority().getColored();
}
String msg = plugin.formatMessage("messages.new-ticket-notify")
.replace("{player}", creatorName)
.replace("{player}", creatorName)
.replace("{message}", message)
.replace("{id}", String.valueOf(ticket.getId()));
.replace("{id}", String.valueOf(ticket.getId()))
+ categoryInfo + priorityInfo;
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.hasPermission("ticket.support") || p.hasPermission("ticket.admin")) {
@@ -67,34 +77,67 @@ public class TicketManager {
}
}
// Discord-Webhook (asynchron)
plugin.getDiscordWebhook().sendNewTicket(ticket);
}
/**
* Benachrichtigt den Ersteller, wenn sein Ticket angenommen wurde.
* --- FIX PROBLEMK 1: NIE "UNBEKANNT" ---
* Setzt claimer_notified = true und persistiert es.
*/
public void notifyCreatorClaimed(Ticket ticket) {
Player creator = Bukkit.getPlayer(ticket.getCreatorUUID());
if (creator != null && creator.isOnline()) {
// 1. Versuch: Name aus dem Ticket-Objekt
String claimerName = ticket.getClaimerName();
// 2. Versuch: Wenn Name fehlt, aber UUID vorhanden -> Namen über Bukkit holen
if (claimerName == null && ticket.getClaimerUUID() != null) {
if (claimerName == null && ticket.getClaimerUUID() != null)
claimerName = Bukkit.getOfflinePlayer(ticket.getClaimerUUID()).getName();
}
// 3. Fallback: Falls immer noch kein Name da ist, nimm "Support" (nie "Unbekannt")
if (claimerName == null) claimerName = "Support";
String msg = plugin.formatMessage("messages.ticket-claimed-notify")
.replace("{id}", String.valueOf(ticket.getId()))
.replace("{id}", String.valueOf(ticket.getId()))
.replace("{claimer}", claimerName);
creator.sendMessage(msg);
}
// Persistiert setzen, damit Join-Listener weiß, dass Spieler bereits informiert ist
plugin.getDatabaseManager().markClaimerNotified(ticket.getId());
}
/**
* Wird beim Server-Join aufgerufen informiert den Spieler über Tickets,
* die geclaimt oder weitergeleitet wurden während er offline war.
*/
public void notifyClaimedWhileOffline(Player player) {
// Suche alle Tickets dieses Spielers, die CLAIMED/FORWARDED sind,
// aber noch nicht notified wurden
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
var tickets = plugin.getDatabaseManager().getTicketsByStatus(
TicketStatus.CLAIMED, TicketStatus.FORWARDED);
for (Ticket t : tickets) {
if (!t.getCreatorUUID().equals(player.getUniqueId())) continue;
if (t.isClaimerNotified()) continue; // wurde schon informiert
String claimerName = t.getClaimerName() != null ? t.getClaimerName() : "Support";
final String name = claimerName;
Bukkit.getScheduler().runTask(plugin, () -> {
if (!player.isOnline()) return;
if (t.getStatus() == TicketStatus.CLAIMED) {
String msg = plugin.formatMessage("messages.ticket-claimed-notify")
.replace("{id}", String.valueOf(t.getId()))
.replace("{claimer}", name);
player.sendMessage(msg);
} else {
String forwardedTo = t.getForwardedToName() != null ? t.getForwardedToName() : "einen Supporter";
String msg = plugin.formatMessage("messages.ticket-forwarded-creator-notify")
.replace("{id}", String.valueOf(t.getId()))
.replace("{supporter}", forwardedTo);
player.sendMessage(msg);
}
});
plugin.getDatabaseManager().markClaimerNotified(t.getId());
}
});
}
/**
@@ -105,68 +148,69 @@ public class TicketManager {
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("{id}", String.valueOf(ticket.getId()))
.replace("{supporter}", forwardedTo);
creator.sendMessage(msg);
}
// Auch hier notified setzen
plugin.getDatabaseManager().markClaimerNotified(ticket.getId());
}
/**
* Sendet dem weitergeleiteten Supporter eine Benachrichtigung
* und informiert optional Discord.
* Sendet dem weitergeleiteten Supporter eine Benachrichtigung.
*/
public void notifyForwardedTo(Ticket ticket, String fromName) {
Player target = Bukkit.getPlayer(ticket.getForwardedToUUID());
if (target != null && target.isOnline()) {
String creatorName = ticket.getCreatorName() != null ? ticket.getCreatorName() : "Unbekannt";
String msg = plugin.formatMessage("messages.ticket-forwarded-notify")
.replace("{player}", creatorName)
.replace("{id}", String.valueOf(ticket.getId()));
.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.
*/
public void notifyCreatorClosed(Ticket ticket) { notifyCreatorClosed(ticket, null); }
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 comment = (ticket.getCloseComment() != null && !ticket.getCloseComment().isEmpty())
? ticket.getCloseComment() : "";
if (creator != null && creator.isOnline()) {
String msg = plugin.formatMessage("messages.ticket-closed-notify")
.replace("{id}", String.valueOf(ticket.getId()))
.replace("{id}", String.valueOf(ticket.getId()))
.replace("{comment}", comment);
creator.sendMessage(msg);
if (!comment.isEmpty()) {
if (!comment.isEmpty())
creator.sendMessage(plugin.color("&7Kommentar des Supports: &f" + comment));
if (plugin.getConfig().getBoolean("rating-enabled", true)) {
creator.sendMessage(plugin.color("&8&m "));
creator.sendMessage(plugin.color("&6Wie zufrieden bist du mit dem Support?"));
creator.sendMessage(plugin.color("&a/ticket rate " + ticket.getId() + " good &7 👍 Gut"));
creator.sendMessage(plugin.color("&c/ticket rate " + ticket.getId() + " bad &7 👎 Schlecht"));
creator.sendMessage(plugin.color("&8&m "));
}
} else {
// Offline → ausstehende Benachrichtigung speichern
String pendingMsg = "&e[Ticket #" + ticket.getId() + "] &7Dein Ticket wurde geschlossen."
+ (comment.isEmpty() ? "" : " &7Kommentar: &f" + comment)
+ (plugin.getConfig().getBoolean("rating-enabled", true)
? " &7Bewertung: &e/ticket rate " + ticket.getId() + " good/bad" : "");
Bukkit.getScheduler().runTaskAsynchronously(plugin, () ->
plugin.getDatabaseManager().addPendingNotification(ticket.getCreatorUUID(), pendingMsg));
}
// 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);
}
@@ -183,15 +227,22 @@ public class TicketManager {
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 create [Kategorie] <Text> &7 Neues Ticket erstellen"));
player.sendMessage(plugin.color("&e/ticket list &7 Deine Tickets ansehen (GUI)"));
player.sendMessage(plugin.color("&e/ticket comment <ID> <Text> &7 Nachricht zu einem Ticket"));
if (plugin.getConfig().getBoolean("rating-enabled", true))
player.sendMessage(plugin.color("&e/ticket rate <ID> <good|bad> &7 Support bewerten"));
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 blacklist <add|remove|list> [Spieler] [Grund] &7 Blacklist verwalten"));
player.sendMessage(plugin.color("&e/ticket reload &7 Konfiguration neu laden"));
player.sendMessage(plugin.color("&e/ticket stats &7 Statistiken anzeigen"));
}
player.sendMessage(plugin.color("&8&m "));
}