From 6694c40842b497490a558bdc93d76b28c197d21a Mon Sep 17 00:00:00 2001 From: Git Manager GUI Date: Sun, 10 May 2026 23:10:34 +0200 Subject: [PATCH] Upload folder via GUI - src --- .../statusapibridge/StatusAPIBridge.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/StatusAPIBridge/src/main/java/net/viper/statusapibridge/StatusAPIBridge.java b/StatusAPIBridge/src/main/java/net/viper/statusapibridge/StatusAPIBridge.java index 559a2a7..131839e 100644 --- a/StatusAPIBridge/src/main/java/net/viper/statusapibridge/StatusAPIBridge.java +++ b/StatusAPIBridge/src/main/java/net/viper/statusapibridge/StatusAPIBridge.java @@ -39,6 +39,7 @@ public class StatusAPIBridge extends JavaPlugin implements Listener { private final Map lastPushedWorld = new ConcurrentHashMap<>(); private final Map lastPushedData = new ConcurrentHashMap<>(); private final Map lastPushedStats = new ConcurrentHashMap<>(); + private String lastPushedTicketGlobal = ""; private final ExecutorService httpExecutor = Executors.newSingleThreadExecutor(r -> { Thread t = new Thread(r, "StatusAPIBridge-HTTP"); @@ -66,6 +67,9 @@ public class StatusAPIBridge extends JavaPlugin implements Listener { Bukkit.getScheduler().runTaskTimer(this, this::pushScoreboardData, scoreboardSyncIntervalTicks, scoreboardSyncIntervalTicks); + // TicketSystem-Daten alle 5 Sekunden pushen (100 Ticks) + Bukkit.getScheduler().runTaskTimerAsynchronously(this, this::pushTicketData, 100L, 100L); + getLogger().info("StatusAPIBridge gestartet. Ziel: " + statusApiUrl); } @@ -298,6 +302,69 @@ public class StatusAPIBridge extends JavaPlugin implements Listener { }); } + // ── TicketSystem Push ────────────────────────────────────────────────── + + /** + * Pushed TicketSystem-Daten an die StatusAPI. + * Globale Werte (offene Tickets, Bewertungen) werden einmal pro Intervall gesendet. + * Pro Spieler wird die Anzahl eigener aktiver Tickets mitgeschickt. + * + * Voraussetzung: TicketSystem muss auf demselben Bukkit-Server laufen. + */ + private void pushTicketData() { + try { + Class pluginClass = Class.forName("de.ticketsystem.TicketPlugin"); + Object tsPlugin = Bukkit.getPluginManager().getPlugin("TicketSystem"); + if (tsPlugin == null) return; + + Object db = pluginClass.getMethod("getDatabaseManager").invoke(tsPlugin); + if (db == null) return; + + Class dbClass = db.getClass(); + Class statsClass = Class.forName("de.ticketsystem.database.DatabaseManager$TicketStats"); + + Object stats = dbClass.getMethod("getTicketStats").invoke(db); + int totalOpen = (int) statsClass.getField("open").get(stats); + int totalClaimed = (int) statsClass.getField("closed").get(stats); // "closed" im stats-Kontext = bearbeitet + + // CLAIMED direkt zählen via getTicketsByStatus + Class statusEnum = Class.forName("de.ticketsystem.model.TicketStatus"); + Object claimed = statusEnum.getField("CLAIMED").get(null); + @SuppressWarnings("unchecked") + java.util.List claimedTickets = (java.util.List) dbClass + .getMethod("getTicketsByStatus", statusEnum.arrayType()) + .invoke(db, (Object) new Object[]{claimed}); + int totalClaimedCount = claimedTickets == null ? 0 : claimedTickets.size(); + + int ratGood = (int) statsClass.getField("thumbsUp").get(stats); + int ratBad = (int) statsClass.getField("thumbsDown").get(stats); + + // Globale Werte nur senden wenn geändert + String globalKey = totalOpen + "," + totalClaimedCount + "," + ratGood + "," + ratBad; + if (!globalKey.equals(lastPushedTicketGlobal)) { + lastPushedTicketGlobal = globalKey; + String globalJson = "{\"total_open\":" + totalOpen + + ",\"total_claimed\":" + totalClaimedCount + + ",\"rating_good\":" + ratGood + + ",\"rating_bad\":" + ratBad + "}"; + sendPost(statusApiUrl + "/ticket/update", globalJson); + } + + // Pro Spieler: eigene aktive Tickets + for (org.bukkit.entity.Player player : Bukkit.getOnlinePlayers()) { + int myOpen = (int) dbClass + .getMethod("countOpenTicketsByPlayer", java.util.UUID.class) + .invoke(db, player.getUniqueId()); + String playerJson = "{\"uuid\":\"" + player.getUniqueId() + "\",\"my_open\":" + myOpen + "}"; + sendPost(statusApiUrl + "/ticket/update", playerJson); + } + } catch (ClassNotFoundException e) { + // TicketSystem nicht installiert – kein Fehler loggen + } catch (Exception e) { + getLogger().warning("[TicketPush] Fehler: " + e.getMessage()); + } + } + private void pushTpsAsync(UUID uuid, double tps) { httpExecutor.execute(() -> { try {