Soft-delete copy _trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/economy/EconomyManager.java
This commit is contained in:
@@ -0,0 +1,109 @@
|
|||||||
|
package net.viper.status.modules.economy;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.plugin.Plugin;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Kein Cache – jeder Zugriff geht direkt in die Datenbank.
|
||||||
|
* Damit ist der Kontostand immer aktuell, egal von welchem Server
|
||||||
|
* er zuletzt geändert wurde (SurvivalPlus, CMI, etc.).
|
||||||
|
*/
|
||||||
|
public class EconomyManager {
|
||||||
|
|
||||||
|
private final Plugin plugin;
|
||||||
|
private final EconomyDatabase db;
|
||||||
|
private final double startBalance;
|
||||||
|
|
||||||
|
public EconomyManager(Plugin plugin, EconomyDatabase db, double startBalance) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.db = db;
|
||||||
|
this.startBalance = startBalance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveNameMapping(UUID uuid, String name) {
|
||||||
|
db.saveNameMapping(uuid, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID resolveUUID(String name) {
|
||||||
|
// 1. Online-Spieler auf dem Proxy (case-insensitive)
|
||||||
|
for (net.md_5.bungee.api.connection.ProxiedPlayer p : plugin.getProxy().getPlayers()) {
|
||||||
|
if (p.getName().equalsIgnoreCase(name)) return p.getUniqueId();
|
||||||
|
}
|
||||||
|
// 2. Eigene bc_player_names Tabelle
|
||||||
|
UUID uuid = db.findUUIDByNameOwn(name);
|
||||||
|
if (uuid != null) return uuid;
|
||||||
|
// 3. CMI_users Fallback
|
||||||
|
uuid = db.findUUIDByName(name);
|
||||||
|
if (uuid != null) return uuid;
|
||||||
|
// 4. Mojang API als letzter Ausweg
|
||||||
|
return lookupMojang(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** UUID via Mojang API holen (nur wenn alle lokalen Lookups fehlschlagen). */
|
||||||
|
private UUID lookupMojang(String name) {
|
||||||
|
try {
|
||||||
|
java.net.URL url = new java.net.URL("https://api.mojang.com/users/profiles/minecraft/" + name);
|
||||||
|
java.net.HttpURLConnection con = (java.net.HttpURLConnection) url.openConnection();
|
||||||
|
con.setConnectTimeout(3000);
|
||||||
|
con.setReadTimeout(3000);
|
||||||
|
con.setRequestMethod("GET");
|
||||||
|
if (con.getResponseCode() != 200) return null;
|
||||||
|
java.io.BufferedReader br = new java.io.BufferedReader(
|
||||||
|
new java.io.InputStreamReader(con.getInputStream()));
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
String line;
|
||||||
|
while ((line = br.readLine()) != null) sb.append(line);
|
||||||
|
br.close();
|
||||||
|
String json = sb.toString();
|
||||||
|
int idIdx = json.indexOf("\"id\":\"");
|
||||||
|
if (idIdx < 0) return null;
|
||||||
|
String raw = json.substring(idIdx + 6, idIdx + 38);
|
||||||
|
String formatted = raw.replaceFirst(
|
||||||
|
"(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5");
|
||||||
|
UUID uuid = UUID.fromString(formatted);
|
||||||
|
// Für künftige Lookups speichern
|
||||||
|
db.saveNameMapping(uuid, name);
|
||||||
|
plugin.getLogger().info("[Economy] Mojang-Lookup: " + name + " → " + uuid);
|
||||||
|
return uuid;
|
||||||
|
} catch (Exception e) {
|
||||||
|
plugin.getLogger().warning("[Economy] Mojang-Lookup fehlgeschlagen für " + name + ": " + e.getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getBalance(UUID uuid) {
|
||||||
|
double bal = db.load(uuid);
|
||||||
|
if (bal < 0) {
|
||||||
|
// Neuer Spieler – Startkonto anlegen
|
||||||
|
db.save(uuid, startBalance);
|
||||||
|
return startBalance;
|
||||||
|
}
|
||||||
|
return bal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBalance(UUID uuid, double amount) {
|
||||||
|
db.save(uuid, Math.max(0.0, amount));
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean deposit(UUID uuid, double amount) {
|
||||||
|
if (amount <= 0) return false;
|
||||||
|
double current = db.load(uuid);
|
||||||
|
if (current < 0) current = startBalance;
|
||||||
|
db.save(uuid, current + amount);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean withdraw(UUID uuid, double amount) {
|
||||||
|
if (amount <= 0) return false;
|
||||||
|
double current = db.load(uuid);
|
||||||
|
if (current < 0) current = 0;
|
||||||
|
if (current < amount) return false;
|
||||||
|
db.save(uuid, current - amount);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasAccount(UUID uuid) {
|
||||||
|
return db.load(uuid) >= 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user