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

@@ -0,0 +1,53 @@
package de.ticketsystem.model;
import org.bukkit.Material;
/**
* Eine aus der config.yml geladene Ticket-Kategorie.
* Ersetzt das hardcodierte TicketCategory-Enum vollständig.
*
* Konfigurationsbeispiel (config.yml):
*
* categories:
* bug:
* name: "Bug"
* color: "&c"
* material: "REDSTONE"
* aliases:
* - "bug"
* - "fehler"
*/
public class ConfigCategory {
/** Interner Schlüssel aus der Config (z.B. "bug", "general") immer Kleinbuchstaben */
private final String key;
/** Anzeigename (z.B. "Bug", "Allgemein") */
private final String name;
/** Minecraft-Farbcode (z.B. "&c") */
private final String color;
/** GUI-Item-Material */
private final Material material;
public ConfigCategory(String key, String name, String color, Material material) {
this.key = key.toLowerCase();
this.name = name;
this.color = color;
this.material = material;
}
public String getKey() { return key; }
public String getName() { return name; }
public String getColor() { return color; }
public Material getMaterial() { return material; }
/** Gibt den farbigen Anzeigenamen zurück, z.B. "§cBug" */
public String getColored() {
return org.bukkit.ChatColor.translateAlternateColorCodes('&', color + name);
}
@Override
public String toString() { return key; }
}

View File

@@ -3,7 +3,6 @@ package de.ticketsystem.model;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.configuration.serialization.SerializableAs;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
@@ -17,215 +16,163 @@ import java.util.UUID;
@SerializableAs("Ticket")
public class Ticket implements ConfigurationSerializable {
private int id;
private UUID creatorUUID;
private int id;
private UUID creatorUUID;
private String creatorName;
private String message;
private String worldName;
private double x, y, z;
private float yaw, pitch;
private float yaw, pitch;
private TicketStatus status;
private UUID claimerUUID;
private String claimerName;
private UUID forwardedToUUID;
private String forwardedToName;
private Timestamp createdAt;
private Timestamp claimedAt;
private Timestamp closedAt;
private String closeComment;
private UUID claimerUUID;
private String claimerName;
private UUID forwardedToUUID;
private String forwardedToName;
private Timestamp createdAt;
private Timestamp claimedAt;
private Timestamp closedAt;
private String closeComment;
// ─── NEU: Soft Delete Flag ───
private boolean playerDeleted = false;
/** Kategorie-Key aus config.yml, z.B. "bug", "general" */
private String categoryKey = "general";
private TicketPriority priority = TicketPriority.NORMAL;
/** null = nicht bewertet | "THUMBS_UP" | "THUMBS_DOWN" */
private String playerRating = null;
private boolean claimerNotified = false;
public Ticket() {}
public Ticket(UUID creatorUUID, String creatorName, String message, Location location) {
this.creatorUUID = creatorUUID;
this.creatorName = creatorName;
this.message = message;
this.worldName = location.getWorld().getName();
this.x = location.getX();
this.y = location.getY();
this.z = location.getZ();
this.yaw = location.getYaw();
this.pitch = location.getPitch();
this.status = TicketStatus.OPEN;
this.message = message;
this.worldName = location.getWorld().getName();
this.x = location.getX(); this.y = location.getY(); this.z = location.getZ();
this.yaw = location.getYaw(); this.pitch = location.getPitch();
this.status = TicketStatus.OPEN;
this.createdAt = new Timestamp(System.currentTimeMillis());
}
// --- NEU: Konstruktor zum Laden aus der YAML (Deserialisierung) ---
public Ticket(Map<String, Object> map) {
this.id = (int) map.get("id");
// UUIDs sicher aus String konvertieren
Object creatorObj = map.get("creatorUUID");
this.creatorUUID = creatorObj instanceof UUID ? (UUID) creatorObj : UUID.fromString((String) creatorObj);
Object cObj = map.get("creatorUUID");
this.creatorUUID = cObj instanceof UUID ? (UUID) cObj : UUID.fromString((String) cObj);
this.creatorName = (String) map.get("creatorName");
this.message = (String) map.get("message");
this.worldName = (String) map.get("world");
// Koordinaten sicher parsen
this.x = map.get("x") instanceof Double ? (Double) map.get("x") : ((Number) map.get("x")).doubleValue();
this.y = map.get("y") instanceof Double ? (Double) map.get("y") : ((Number) map.get("y")).doubleValue();
this.z = map.get("z") instanceof Double ? (Double) map.get("z") : ((Number) map.get("z")).doubleValue();
this.yaw = map.get("yaw") instanceof Float ? (Float) map.get("yaw") : ((Number) map.get("yaw")).floatValue();
this.pitch = map.get("pitch") instanceof Float ? (Float) map.get("pitch") : ((Number) map.get("pitch")).floatValue();
this.message = (String) map.get("message");
this.worldName = (String) map.get("world");
this.x = toDouble(map.get("x")); this.y = toDouble(map.get("y")); this.z = toDouble(map.get("z"));
this.yaw = toFloat(map.get("yaw")); this.pitch = toFloat(map.get("pitch"));
this.status = TicketStatus.valueOf((String) map.get("status"));
// Timestamps aus Long (Millis) wieder zu Timestamp machen
if (map.get("createdAt") != null) {
this.createdAt = new Timestamp(((Number) map.get("createdAt")).longValue());
}
if (map.get("claimedAt") != null) {
this.claimedAt = new Timestamp(((Number) map.get("claimedAt")).longValue());
}
if (map.get("closedAt") != null) {
this.closedAt = new Timestamp(((Number) map.get("closedAt")).longValue());
}
if (map.get("createdAt") != null) this.createdAt = new Timestamp(toLong(map.get("createdAt")));
if (map.get("claimedAt") != null) this.claimedAt = new Timestamp(toLong(map.get("claimedAt")));
if (map.get("closedAt") != null) this.closedAt = new Timestamp(toLong(map.get("closedAt")));
this.closeComment = (String) map.get("closeComment");
// Optionale Felder
if (map.containsKey("claimerUUID") && map.get("claimerUUID") != null) {
Object claimerObj = map.get("claimerUUID");
this.claimerUUID = claimerObj instanceof UUID ? (UUID) claimerObj : UUID.fromString((String) claimerObj);
Object o = map.get("claimerUUID");
this.claimerUUID = o instanceof UUID ? (UUID) o : UUID.fromString((String) o);
this.claimerName = (String) map.get("claimerName");
}
if (map.containsKey("forwardedToUUID") && map.get("forwardedToUUID") != null) {
Object fwdObj = map.get("forwardedToUUID");
this.forwardedToUUID = fwdObj instanceof UUID ? (UUID) fwdObj : UUID.fromString((String) fwdObj);
Object o = map.get("forwardedToUUID");
this.forwardedToUUID = o instanceof UUID ? (UUID) o : UUID.fromString((String) o);
this.forwardedToName = (String) map.get("forwardedToName");
}
// ─── NEU: Laden des Soft Delete Flags ───
if (map.containsKey("playerDeleted")) {
this.playerDeleted = (boolean) map.get("playerDeleted");
}
if (map.containsKey("playerDeleted")) this.playerDeleted = (boolean) map.get("playerDeleted");
if (map.containsKey("category")) this.categoryKey = (String) map.get("category");
if (map.containsKey("priority")) this.priority = TicketPriority.fromString((String) map.get("priority"));
if (map.containsKey("playerRating")) this.playerRating = (String) map.get("playerRating");
if (map.containsKey("claimerNotified")) this.claimerNotified = (boolean) map.get("claimerNotified");
}
// --- NEU: Methode zum Speichern in die YAML (Serialisierung) ---
@Override
public Map<String, Object> serialize() {
Map<String, Object> map = new HashMap<>();
map.put("id", id);
// WICHTIG: UUID als String speichern, um !!java.util.UUID Tag zu vermeiden
map.put("creatorUUID", creatorUUID.toString());
map.put("creatorName", creatorName);
map.put("message", message);
map.put("world", worldName);
map.put("x", x);
map.put("y", y);
map.put("z", z);
map.put("yaw", yaw);
map.put("pitch", pitch);
map.put("message", message);
map.put("world", worldName);
map.put("x", x); map.put("y", y); map.put("z", z);
map.put("yaw", yaw); map.put("pitch", pitch);
map.put("status", status.name());
// Timestamps als Long speichern
if (createdAt != null) map.put("createdAt", createdAt.getTime());
if (claimedAt != null) map.put("claimedAt", claimedAt.getTime());
if (closedAt != null) map.put("closedAt", closedAt.getTime());
if (closedAt != null) map.put("closedAt", closedAt.getTime());
if (closeComment != null) map.put("closeComment", closeComment);
if (claimerUUID != null) {
map.put("claimerUUID", claimerUUID.toString());
map.put("claimerName", claimerName);
}
if (forwardedToUUID != null) {
map.put("forwardedToUUID", forwardedToUUID.toString());
map.put("forwardedToName", forwardedToName);
}
// ─── NEU: Speichern des Soft Delete Flags ───
map.put("playerDeleted", playerDeleted);
if (claimerUUID != null) { map.put("claimerUUID", claimerUUID.toString()); map.put("claimerName", claimerName); }
if (forwardedToUUID != null) { map.put("forwardedToUUID", forwardedToUUID.toString()); map.put("forwardedToName", forwardedToName); }
map.put("playerDeleted", playerDeleted);
map.put("category", categoryKey);
map.put("priority", priority.name());
if (playerRating != null) map.put("playerRating", playerRating);
map.put("claimerNotified", claimerNotified);
return map;
}
// --- NEU: Registrierung ---
public static void register() {
ConfigurationSerialization.registerClass(Ticket.class, "Ticket");
}
public static void register() { ConfigurationSerialization.registerClass(Ticket.class, "Ticket"); }
// --- Deine ursprüngliche getLocation Methode (beibehalten) ---
public Location getLocation() {
World world = Bukkit.getWorld(worldName);
if (world == null) return null;
return new Location(world, x, y, z, yaw, pitch);
return world == null ? null : new Location(world, x, y, z, yaw, pitch);
}
// ─────────────────────────── Getter & Setter ────────────────────────────
private static double toDouble(Object o) { return o instanceof Double d ? d : ((Number) o).doubleValue(); }
private static float toFloat(Object o) { return o instanceof Float f ? f : ((Number) o).floatValue(); }
private static long toLong(Object o) { return ((Number) o).longValue(); }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public UUID getCreatorUUID() { return creatorUUID; }
public void setCreatorUUID(UUID creatorUUID) { this.creatorUUID = creatorUUID; }
public String getCreatorName() { return creatorName; }
public void setCreatorName(String creatorName) { this.creatorName = creatorName; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public String getWorldName() { return worldName; }
public void setWorldName(String worldName) { this.worldName = worldName; }
public double getX() { return x; }
public void setX(double x) { this.x = x; }
public double getY() { return y; }
public void setY(double y) { this.y = y; }
public double getZ() { return z; }
public void setZ(double z) { this.z = z; }
public float getYaw() { return yaw; }
public void setYaw(float yaw) { this.yaw = yaw; }
public float getPitch() { return pitch; }
public void setPitch(float pitch) { this.pitch = pitch; }
public TicketStatus getStatus() { return status; }
public void setStatus(TicketStatus status) { this.status = status; }
public UUID getClaimerUUID() { return claimerUUID; }
public void setClaimerUUID(UUID claimerUUID) { this.claimerUUID = claimerUUID; }
public String getClaimerName() { return claimerName; }
public void setClaimerName(String claimerName) { this.claimerName = claimerName; }
public UUID getForwardedToUUID() { return forwardedToUUID; }
public void setForwardedToUUID(UUID forwardedToUUID) { this.forwardedToUUID = forwardedToUUID; }
public String getForwardedToName() { return forwardedToName; }
public void setForwardedToName(String forwardedToName) { this.forwardedToName = forwardedToName; }
public Timestamp getCreatedAt() { return createdAt; }
public void setCreatedAt(Timestamp createdAt) { this.createdAt = createdAt; }
public Timestamp getClaimedAt() { return claimedAt; }
public void setClaimedAt(Timestamp claimedAt) { this.claimedAt = claimedAt; }
public Timestamp getClosedAt() { return closedAt; }
public void setClosedAt(Timestamp closedAt) { this.closedAt = closedAt; }
public String getCloseComment() { return closeComment; }
public void setCloseComment(String closeComment) { this.closeComment = closeComment; }
// ─── NEU: Getter/Setter für Soft Delete ───
public boolean isPlayerDeleted() { return playerDeleted; }
public void setPlayerDeleted(boolean playerDeleted) { this.playerDeleted = playerDeleted; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public UUID getCreatorUUID() { return creatorUUID; }
public void setCreatorUUID(UUID v) { this.creatorUUID = v; }
public String getCreatorName() { return creatorName; }
public void setCreatorName(String v) { this.creatorName = v; }
public String getMessage() { return message; }
public void setMessage(String v) { this.message = v; }
public String getWorldName() { return worldName; }
public void setWorldName(String v) { this.worldName = v; }
public double getX() { return x; }
public void setX(double v) { this.x = v; }
public double getY() { return y; }
public void setY(double v) { this.y = v; }
public double getZ() { return z; }
public void setZ(double v) { this.z = v; }
public float getYaw() { return yaw; }
public void setYaw(float v) { this.yaw = v; }
public float getPitch() { return pitch; }
public void setPitch(float v) { this.pitch = v; }
public TicketStatus getStatus() { return status; }
public void setStatus(TicketStatus v) { this.status = v; }
public UUID getClaimerUUID() { return claimerUUID; }
public void setClaimerUUID(UUID v) { this.claimerUUID = v; }
public String getClaimerName() { return claimerName; }
public void setClaimerName(String v) { this.claimerName = v; }
public UUID getForwardedToUUID() { return forwardedToUUID; }
public void setForwardedToUUID(UUID v) { this.forwardedToUUID = v; }
public String getForwardedToName() { return forwardedToName; }
public void setForwardedToName(String v) { this.forwardedToName = v; }
public Timestamp getCreatedAt() { return createdAt; }
public void setCreatedAt(Timestamp v) { this.createdAt = v; }
public Timestamp getClaimedAt() { return claimedAt; }
public void setClaimedAt(Timestamp v) { this.claimedAt = v; }
public Timestamp getClosedAt() { return closedAt; }
public void setClosedAt(Timestamp v) { this.closedAt = v; }
public String getCloseComment() { return closeComment; }
public void setCloseComment(String v) { this.closeComment = v; }
public boolean isPlayerDeleted() { return playerDeleted; }
public void setPlayerDeleted(boolean v) { this.playerDeleted = v; }
public String getCategoryKey() { return categoryKey; }
public void setCategoryKey(String v) { this.categoryKey = v != null ? v.toLowerCase() : "general"; }
public TicketPriority getPriority() { return priority; }
public void setPriority(TicketPriority v) { this.priority = v; }
public String getPlayerRating() { return playerRating; }
public void setPlayerRating(String v) { this.playerRating = v; }
public boolean hasRating() { return playerRating != null; }
public boolean isClaimerNotified() { return claimerNotified; }
public void setClaimerNotified(boolean v) { this.claimerNotified = v; }
}

View File

@@ -0,0 +1,33 @@
package de.ticketsystem.model;
import org.bukkit.Material;
public enum TicketCategory {
GENERAL ("Allgemein", "§7", Material.PAPER),
BUG ("Bug", "§c", Material.REDSTONE),
QUESTION ("Frage", "§e", Material.BOOK),
COMPLAINT ("Beschwerde", "§6", Material.WRITABLE_BOOK),
OTHER ("Sonstiges", "§8", Material.FEATHER);
private final String displayName;
private final String color;
private final Material guiMaterial;
TicketCategory(String displayName, String color, Material guiMaterial) {
this.displayName = displayName;
this.color = color;
this.guiMaterial = guiMaterial;
}
public String getDisplayName() { return displayName; }
public String getColor() { return color; }
public String getColored() { return color + displayName; }
public Material getGuiMaterial() { return guiMaterial; }
/** Safely parse from stored string, fall back to GENERAL. */
public static TicketCategory fromString(String s) {
if (s == null) return GENERAL;
try { return valueOf(s.toUpperCase()); }
catch (IllegalArgumentException e) { return GENERAL; }
}
}

View File

@@ -0,0 +1,47 @@
package de.ticketsystem.model;
import java.sql.Timestamp;
import java.util.UUID;
/**
* Represents a player comment/reply on a ticket.
*/
public class TicketComment {
private int id;
private int ticketId;
private UUID authorUUID;
private String authorName;
private String message;
private Timestamp createdAt;
public TicketComment() {}
public TicketComment(int ticketId, UUID authorUUID, String authorName, String message) {
this.ticketId = ticketId;
this.authorUUID = authorUUID;
this.authorName = authorName;
this.message = message;
this.createdAt = new Timestamp(System.currentTimeMillis());
}
// ─────────────── Getters / Setters ────────────────────────────────────
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public int getTicketId() { return ticketId; }
public void setTicketId(int ticketId) { this.ticketId = ticketId; }
public UUID getAuthorUUID() { return authorUUID; }
public void setAuthorUUID(UUID authorUUID) { this.authorUUID = authorUUID; }
public String getAuthorName() { return authorName; }
public void setAuthorName(String authorName){ this.authorName = authorName; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
public Timestamp getCreatedAt() { return createdAt; }
public void setCreatedAt(Timestamp ts) { this.createdAt = ts; }
}

View File

@@ -0,0 +1,31 @@
package de.ticketsystem.model;
import org.bukkit.Material;
public enum TicketPriority {
LOW ("Niedrig", "§a", Material.GREEN_WOOL),
NORMAL ("Normal", "§e", Material.YELLOW_WOOL),
HIGH ("Hoch", "§6", Material.ORANGE_WOOL),
URGENT ("Dringend","§c", Material.RED_WOOL);
private final String displayName;
private final String color;
private final Material guiMaterial;
TicketPriority(String displayName, String color, Material guiMaterial) {
this.displayName = displayName;
this.color = color;
this.guiMaterial = guiMaterial;
}
public String getDisplayName() { return displayName; }
public String getColor() { return color; }
public String getColored() { return color + displayName; }
public Material getGuiMaterial() { return guiMaterial; }
public static TicketPriority fromString(String s) {
if (s == null) return NORMAL;
try { return valueOf(s.toUpperCase()); }
catch (IllegalArgumentException e) { return NORMAL; }
}
}