Upload folder via GUI - src

This commit is contained in:
Git Manager GUI
2026-05-11 12:01:12 +02:00
parent 876b9cd005
commit b3b0ae042b
2 changed files with 135 additions and 1 deletions

View File

@@ -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,

View File

@@ -83,6 +83,10 @@ commands:
description: Kündigt ein bestimmtes Item-Abo anhand der Nummer aus /abo
usage: /itemabocancel <Nr> [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