Upload folder via GUI - src
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user