From b3b0ae042b4eb68c81e51248e9589cab9b580e44 Mon Sep 17 00:00:00 2001 From: Git Manager GUI Date: Mon, 11 May 2026 12:01:12 +0200 Subject: [PATCH] Upload folder via GUI - src --- .../de/mviper/spigot/IngameShopSpigot.java | 129 +++++++++++++++++- .../src/main/resources/plugin.yml | 7 + 2 files changed, 135 insertions(+), 1 deletion(-) diff --git a/IngameShopSpigot/src/main/java/de/mviper/spigot/IngameShopSpigot.java b/IngameShopSpigot/src/main/java/de/mviper/spigot/IngameShopSpigot.java index af703e6..cf3e526 100644 --- a/IngameShopSpigot/src/main/java/de/mviper/spigot/IngameShopSpigot.java +++ b/IngameShopSpigot/src/main/java/de/mviper/spigot/IngameShopSpigot.java @@ -1,6 +1,7 @@ package de.mviper.spigot; import org.bukkit.Bukkit; +import javax.annotation.Nullable; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Sound; @@ -216,6 +217,7 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { getCommand("abo").setExecutor(new AboOverviewCommand()); getCommand("itemabocancel").setExecutor(new ItemAboCancelCommand()); getCommand("sell").setExecutor(new SellCommand()); + getCommand("mycoupons").setExecutor(new MyCouponsCommand()); getCommand("wpis").setExecutor(new ReloadCommand()); startPolling(pollInterval); @@ -1288,6 +1290,7 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { // --- Commands (Fly / Rang / Generic) --- boolean anyCode = false; + boolean hasAsyncCompletion = false; // true wenn markOrderCompleted async aufgerufen wird if (rootObj != null && rootObj.has("commands")) { JsonArray commands = rootObj.getAsJsonArray("commands"); for (JsonElement ce : commands) { @@ -1302,9 +1305,12 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { ? cmdObj.get("label").getAsString() : flyManager.formatTime(durationSec) + " Fly"; final String pName = player.getName(); + final int finalOrderId = orderId; // orderId für async Block einfrieren new BukkitRunnable() { @Override public void run() { String code = flyCodeManager.generateCode(pName, durationSec, label); + // Erst Order abschließen (WP-Status → completed), dann Code senden + markOrderCompleted(finalOrderId, player); Bukkit.getScheduler().runTask(IngameShopSpigot.this, () -> { player.sendMessage(""); player.sendMessage(ChatColor.GOLD + "✈ ════════════════════════════"); @@ -1322,6 +1328,7 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { }); } }.runTaskAsynchronously(IngameShopSpigot.this); + hasAsyncCompletion = true; anyCode = true; } else if ("rank".equals(type)) { @@ -1452,6 +1459,11 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { } anyCode = true; + } else if ("gift_card".equals(type)) { + // Gutschein-Karte: Code wird nach markOrderCompleted via WP-Response gesendet. + // Hier nur anyCode setzen damit keine Fehlermeldung erscheint. + anyCode = true; + } else if ("generic".equals(type) && cmdObj.has("cmd")) { String cmd = cmdObj.get("cmd").getAsString() .replace("{player}", player.getName()); @@ -1469,7 +1481,10 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { player.sendMessage(ChatColor.RED + "⚠ Nichts verteilt – Admin kontaktieren."); } - markOrderCompleted(orderId); + // Fly-Codes rufen markOrderCompleted intern asynchron auf – kein Doppelaufruf + if (!hasAsyncCompletion) { + markOrderCompleted(orderId, player); + } orderCache.remove(orderId); } catch (Exception e) { @@ -1539,6 +1554,14 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { } private void markOrderCompleted(int orderId) { + markOrderCompleted(orderId, null); + } + + /** + * Markiert eine Order als abgeschlossen. Wenn player != null, werden + * etwaige gift_card_codes aus der WP-Antwort ingame an den Spieler gesendet. + */ + private void markOrderCompleted(int orderId, @Nullable Player player) { new BukkitRunnable() { @Override public void run() { try { @@ -1547,6 +1570,44 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { int code = conn.getResponseCode(); if (debug) getLogger().info( "Complete Order #" + orderId + " → HTTP " + code); + + // Gift-Card-Codes aus der WP-Antwort lesen und ingame anzeigen + if (code == 200 && player != null) { + try { + String body = readResponse(conn); + com.google.gson.JsonObject resp = + com.google.gson.JsonParser.parseString(body).getAsJsonObject(); + if (resp.has("gift_card_codes")) { + com.google.gson.JsonArray gcCodes = + resp.getAsJsonArray("gift_card_codes"); + if (gcCodes != null && gcCodes.size() > 0) { + Bukkit.getScheduler().runTask(IngameShopSpigot.this, () -> { + player.sendMessage(""); + player.sendMessage(ChatColor.GOLD + "🎟 ════════════════════════════"); + player.sendMessage(ChatColor.YELLOW + " Deine Gutschein-Karte(n):"); + for (com.google.gson.JsonElement el : gcCodes) { + com.google.gson.JsonObject gc = el.getAsJsonObject(); + String gcCode = gc.has("code") ? gc.get("code").getAsString() : "?"; + String gcAmount = gc.has("amount") ? gc.get("amount").getAsString() : "?"; + String gcLabel = gc.has("label") ? gc.get("label").getAsString() : ""; + player.sendMessage(ChatColor.GRAY + " " + gcLabel); + player.sendMessage(ChatColor.GRAY + " Code: " + + ChatColor.AQUA + ChatColor.BOLD + gcCode); + player.sendMessage(ChatColor.GRAY + " Wert: " + + ChatColor.WHITE + gcAmount + " " + currency); + } + player.sendMessage(ChatColor.GRAY + " Einlösen: im Shop beim nächsten Kauf"); + player.sendMessage(ChatColor.GOLD + " ════════════════════════════"); + player.sendMessage(""); + player.playSound(player.getLocation(), + Sound.ENTITY_PLAYER_LEVELUP, 1.0F, 1.2F); + }); + } + } + } catch (Exception ex) { + if (debug) getLogger().warning("Gift-Card Response Parse Error: " + ex.getMessage()); + } + } } catch (Exception e) { getLogger().log(Level.WARNING, "Complete Order Error #" + orderId, e); } @@ -3943,6 +4004,72 @@ public class IngameShopSpigot extends JavaPlugin implements Listener { // RELOAD COMMAND // =========================================================== + private class MyCouponsCommand implements CommandExecutor { + @Override + public boolean onCommand(CommandSender sender, Command command, + String label, String[] args) { + if (!(sender instanceof Player)) { + sender.sendMessage("Nur für Spieler."); + return true; + } + Player p = (Player) sender; + p.sendMessage(ChatColor.GOLD + "🎟 ══════════════════════════════"); + p.sendMessage(ChatColor.YELLOW + " Deine Gutschein-Karten:"); + p.sendMessage(ChatColor.GOLD + " ══════════════════════════════"); + + new BukkitRunnable() { + @Override public void run() { + try { + HttpURLConnection conn = openAuthConnection( + wpBase + "/my_coupons?player=" + p.getName(), "GET"); + int code = conn.getResponseCode(); + if (code != 200) { + Bukkit.getScheduler().runTask(IngameShopSpigot.this, () -> + p.sendMessage(ChatColor.RED + "❌ Fehler beim Abrufen (HTTP " + code + ").")); + return; + } + String body = readResponse(conn); + com.google.gson.JsonObject resp = + com.google.gson.JsonParser.parseString(body).getAsJsonObject(); + + Bukkit.getScheduler().runTask(IngameShopSpigot.this, () -> { + if (!resp.has("coupons") || resp.getAsJsonArray("coupons").size() == 0) { + p.sendMessage(ChatColor.GRAY + " Keine ungenutzten Gutscheine vorhanden."); + p.sendMessage(ChatColor.GOLD + "🎟 ══════════════════════════════"); + return; + } + com.google.gson.JsonArray coupons = resp.getAsJsonArray("coupons"); + for (com.google.gson.JsonElement el : coupons) { + com.google.gson.JsonObject c = el.getAsJsonObject(); + String gcCode = c.has("code") ? c.get("code").getAsString() : "?"; + String gcValue = c.has("value") ? c.get("value").getAsString() : "?"; + String gcCur = c.has("currency") ? c.get("currency").getAsString() : ""; + String gcLabel = c.has("label") ? c.get("label").getAsString() : ""; + String gcExpiry = (c.has("expiry") && !c.get("expiry").isJsonNull()) + ? " | Läuft ab: " + c.get("expiry").getAsString() : ""; + p.sendMessage(""); + if (!gcLabel.isEmpty()) + p.sendMessage(ChatColor.GRAY + " " + gcLabel); + p.sendMessage(ChatColor.GRAY + " Code: " + + ChatColor.AQUA + ChatColor.BOLD + gcCode); + p.sendMessage(ChatColor.GRAY + " Wert: " + + ChatColor.WHITE + gcValue + " " + gcCur + gcExpiry); + } + p.sendMessage(""); + p.sendMessage(ChatColor.GRAY + " Im Shop beim Kauf einlösen."); + p.sendMessage(ChatColor.GOLD + "🎟 ══════════════════════════════"); + }); + } catch (Exception e) { + getLogger().log(Level.WARNING, "MyCoupons Fehler", e); + Bukkit.getScheduler().runTask(IngameShopSpigot.this, () -> + p.sendMessage(ChatColor.RED + "❌ Interner Fehler.")); + } + } + }.runTaskAsynchronously(IngameShopSpigot.this); + return true; + } + } + private class ReloadCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, diff --git a/IngameShopSpigot/src/main/resources/plugin.yml b/IngameShopSpigot/src/main/resources/plugin.yml index 4fb133f..d867fe5 100644 --- a/IngameShopSpigot/src/main/resources/plugin.yml +++ b/IngameShopSpigot/src/main/resources/plugin.yml @@ -83,6 +83,10 @@ commands: description: Kündigt ein bestimmtes Item-Abo anhand der Nummer aus /abo usage: /itemabocancel [confirm] permission: ingameshop.itemabocancel + mycoupons: + description: Zeigt deine ungenutzten Gutschein-Karten + usage: /mycoupons + permission: ingameshop.mycoupons permissions: ingameshop.orders: @@ -141,4 +145,7 @@ permissions: default: op ingameshop.itemabocancel: description: Kann eigenes Item-Abo kündigen + default: true + ingameshop.mycoupons: + description: Kann eigene Gutschein-Karten einsehen default: true \ No newline at end of file