Update from Git Manager GUI

This commit is contained in:
2026-01-28 08:00:53 +01:00
parent d57bef3525
commit d06ddf1bf8
16 changed files with 559 additions and 946 deletions

View File

@@ -0,0 +1,43 @@
package net.mviper.eco.bridge;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class BackgroundTask {
private Eco m;
private long lastSave = System.currentTimeMillis();
public BackgroundTask(Eco m) {
this.m = m;
runTask();
}
private void runTask() {
Bukkit.getScheduler().runTaskTimerAsynchronously(m, () -> {
m.getEcoDataHandler().updateBalanceMap();
runSaveData();
}, 20L, 20L);
}
private void runSaveData() {
if (m.getConfigHandler().getBoolean("General.saveDataTask.enabled")) {
if (!Bukkit.getOnlinePlayers().isEmpty()) {
if (System.currentTimeMillis() - lastSave >= m.getConfigHandler().getInteger("General.saveDataTask.interval") * 60 * 1000) {
List<Player> onlinePlayers = new ArrayList<>(Bukkit.getOnlinePlayers());
lastSave = System.currentTimeMillis();
if (!m.getConfigHandler().getBoolean("General.saveDataTask.hideLogMessages")) {
Eco.log.info("Synchronisiere Online-Spieler mit MySQL...");
}
for (Player p : onlinePlayers) {
if (p.isOnline()) {
m.getEcoDataHandler().onDataSaveFunction(p, false, "false", false);
}
}
}
}
}
}
}

View File

@@ -0,0 +1,60 @@
package net.mviper.eco.bridge;
import java.io.File;
public class ConfigHandler {
private Eco eco;
public ConfigHandler(Eco eco) {
this.eco = eco;
loadConfig();
}
public void loadConfig() {
File pluginFolder = new File("plugins" + System.getProperty("file.separator") + Eco.pluginName);
if (pluginFolder.exists() == false) {
pluginFolder.mkdir();
}
File configFile = new File("plugins" + System.getProperty("file.separator") + Eco.pluginName + System.getProperty("file.separator") + "config.yml");
if (configFile.exists() == false) {
Eco.log.info("No config file found! Creating new one...");
eco.saveDefaultConfig();
}
try {
Eco.log.info("Loading the config file...");
eco.getConfig().load(configFile);
} catch (Exception e) {
Eco.log.severe("Could not load the config file! You need to regenerate the config! Error: " + e.getMessage());
e.printStackTrace();
}
}
public String getString(String key) {
if (!eco.getConfig().contains(key)) {
eco.getLogger().severe("Could not locate " + key + " in the config.yml inside of the " + Eco.pluginName + " folder! (Try generating a new one by deleting the current)");
return "errorCouldNotLocateInConfigYml:" + key;
} else {
return eco.getConfig().getString(key);
}
}
public Integer getInteger(String key) {
if (!eco.getConfig().contains(key)) {
eco.getLogger().severe("Could not locate " + key + " in the config.yml inside of the " + Eco.pluginName + " folder! (Try generating a new one by deleting the current)");
return null;
} else {
return eco.getConfig().getInt(key);
}
}
public Boolean getBoolean(String key) {
if (!eco.getConfig().contains(key)) {
eco.getLogger().severe("Could not locate " + key + " in the config.yml inside of the " + Eco.pluginName + " folder! (Try generating a new one by deleting the current)");
return null;
} else {
return eco.getConfig().getBoolean(key);
}
}
}

View File

@@ -0,0 +1,77 @@
package net.mviper.eco.bridge;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import net.mviper.eco.bridge.database.EcoMysqlHandler;
import net.mviper.eco.bridge.database.MysqlSetup;
import net.mviper.eco.bridge.events.PlayerDisconnect;
import net.mviper.eco.bridge.events.PlayerJoin;
import net.mviper.eco.bridge.events.handlers.EcoDataHandler;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
public class Eco extends JavaPlugin {
public static Logger log;
public static Economy vault = null;
public static String pluginName = "MysqlEcoBridge";
public Map<Player, Integer> syncCompleteTasks = new HashMap<Player, Integer>();
private static ConfigHandler configHandler;
private static MysqlSetup mysqlSetup;
private static EcoMysqlHandler ecoMysqlHandler;
private static EcoDataHandler edH;
private static BackgroundTask bt;
@Override
public void onEnable() {
log = getLogger();
if (!setupEconomy()) {
log.severe(String.format("[%s] - Deaktiviert aufgrund fehlender Vault-Abhängigkeit!", getDescription().getName()));
getServer().getPluginManager().disablePlugin(this);
return;
}
configHandler = new ConfigHandler(this);
mysqlSetup = new MysqlSetup(this);
ecoMysqlHandler = new EcoMysqlHandler(this);
edH = new EcoDataHandler(this);
bt = new BackgroundTask(this);
PluginManager pm = getServer().getPluginManager();
pm.registerEvents(new PlayerJoin(this), this);
pm.registerEvents(new PlayerDisconnect(this), this);
log.info(pluginName + " erfolgreich geladen!");
}
@Override
public void onDisable() {
Bukkit.getScheduler().cancelTasks(this);
HandlerList.unregisterAll(this);
if (mysqlSetup != null && mysqlSetup.getConnection() != null) {
edH.onShutDownDataSave();
mysqlSetup.closeConnection();
}
log.info(pluginName + " wurde deaktiviert!");
}
private boolean setupEconomy() {
if (getServer().getPluginManager().getPlugin("Vault") == null) return false;
RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
if (rsp == null) return false;
vault = rsp.getProvider();
return vault != null;
}
public ConfigHandler getConfigHandler() { return configHandler; }
public MysqlSetup getMysqlSetup() { return mysqlSetup; }
public EcoMysqlHandler getEcoMysqlHandler() { return ecoMysqlHandler; }
public EcoDataHandler getEcoDataHandler() { return edH; }
}

View File

@@ -0,0 +1,86 @@
package net.mviper.eco.bridge.database;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.bukkit.entity.Player;
import net.mviper.eco.bridge.Eco;
public class EcoMysqlHandler {
private Eco eco;
public EcoMysqlHandler(Eco eco) {
this.eco = eco;
}
public String[] getData(Player player) {
if (!hasAccount(player)) {
createAccount(player);
}
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
try (PreparedStatement pst = conn.prepareStatement("SELECT * FROM `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` WHERE `player_uuid` = ? LIMIT 1")) {
pst.setString(1, player.getUniqueId().toString());
try (ResultSet rs = pst.executeQuery()) {
if (rs.next()) {
return new String[]{String.valueOf(rs.getDouble("money")), rs.getString("sync_complete"), rs.getString("last_seen")};
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return new String[]{"0.0", "true", String.valueOf(System.currentTimeMillis())};
}
public void setData(Player player, double money, String syncComplete) {
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
String sql = "UPDATE `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` SET `money` = ?, `sync_complete` = ?, `last_seen` = ? WHERE `player_uuid` = ?";
try (PreparedStatement pst = conn.prepareStatement(sql)) {
pst.setDouble(1, money);
pst.setString(2, syncComplete);
pst.setString(3, String.valueOf(System.currentTimeMillis()));
pst.setString(4, player.getUniqueId().toString());
pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public boolean hasAccount(Player player) {
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
try (PreparedStatement pst = conn.prepareStatement("SELECT `player_uuid` FROM `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` WHERE `player_uuid` = ? LIMIT 1")) {
pst.setString(1, player.getUniqueId().toString());
try (ResultSet rs = pst.executeQuery()) {
return rs.next();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return false;
}
private void createAccount(Player player) {
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
try (PreparedStatement pst = conn.prepareStatement("INSERT INTO `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` (player_uuid, player_name, money, sync_complete, last_seen) VALUES (?, ?, ?, ?, ?)")) {
pst.setString(1, player.getUniqueId().toString());
pst.setString(2, player.getName());
pst.setDouble(3, 0.0);
pst.setString(4, "true");
pst.setString(5, String.valueOf(System.currentTimeMillis()));
pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

View File

@@ -0,0 +1,62 @@
package net.mviper.eco.bridge.database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
import net.mviper.eco.bridge.Eco;
import org.bukkit.Bukkit;
public class MysqlSetup {
private Connection conn = null;
private Eco eco;
public MysqlSetup(Eco eco) {
this.eco = eco;
connectToDatabase();
setupDatabase();
}
public void connectToDatabase() {
try {
Class.forName("com.mysql.jdbc.Driver");
Properties props = new Properties();
props.setProperty("user", eco.getConfigHandler().getString("database.mysql.user"));
props.setProperty("password", eco.getConfigHandler().getString("database.mysql.password"));
props.setProperty("autoReconnect", "true");
props.setProperty("useSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled"));
String url = "jdbc:mysql://" + eco.getConfigHandler().getString("database.mysql.host") + ":" +
eco.getConfigHandler().getString("database.mysql.port") + "/" +
eco.getConfigHandler().getString("database.mysql.databaseName");
conn = DriverManager.getConnection(url, props);
} catch (Exception e) {
Eco.log.severe("MySQL Verbindung fehlgeschlagen: " + e.getMessage());
}
}
private void setupDatabase() {
if (conn != null) {
String query = "CREATE TABLE IF NOT EXISTS `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` (" +
"`id` int(11) NOT NULL AUTO_INCREMENT," +
"`player_uuid` varchar(45) NOT NULL," +
"`player_name` varchar(16) NOT NULL," +
"`money` double NOT NULL DEFAULT '0'," +
"`sync_complete` varchar(5) NOT NULL DEFAULT 'true'," +
"`last_seen` varchar(30) NOT NULL," +
"PRIMARY KEY (`id`), UNIQUE KEY `player_uuid_UNIQUE` (`player_uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
try (PreparedStatement pst = conn.prepareStatement(query)) {
pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public Connection getConnection() { return conn; }
public void closeConnection() {
try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}

View File

@@ -0,0 +1,42 @@
package net.mviper.eco.bridge.events;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import net.mviper.eco.bridge.Eco;
public class PlayerDisconnect implements Listener {
private Eco eco;
public PlayerDisconnect(Eco eco) {
this.eco = eco;
}
@EventHandler
public void onDisconnect(final PlayerQuitEvent event) {
Bukkit.getScheduler().runTaskLaterAsynchronously(eco, new Runnable() {
@Override
public void run() {
if (event.getPlayer() != null) {
Player p = event.getPlayer();
cleanup(p);
eco.getEcoDataHandler().onDataSaveFunction(p, true, "true", false);
}
}
}, 1L);
}
private void cleanup(Player p) {
if (eco.syncCompleteTasks.containsKey(p) == true) {
Bukkit.getScheduler().cancelTask(eco.syncCompleteTasks.get(p));
eco.syncCompleteTasks.remove(p);
}
}
}

View File

@@ -0,0 +1,21 @@
package net.mviper.eco.bridge.events;
import net.mviper.eco.bridge.Eco;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
public class PlayerJoin implements Listener {
private Eco eco;
public PlayerJoin(Eco eco) { this.eco = eco; }
@EventHandler
public void onJoin(PlayerJoinEvent event) {
Bukkit.getScheduler().runTaskLaterAsynchronously(eco, () -> {
if (event.getPlayer().isOnline()) {
eco.getEcoDataHandler().onJoinFunction(event.getPlayer());
}
}, 5L);
}
}

View File

@@ -0,0 +1,107 @@
package net.mviper.eco.bridge.events.handlers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import net.mviper.eco.bridge.Eco;
public class EcoDataHandler {
private Eco eco;
private Map<Player, Double> backupMoney = new HashMap<Player, Double>();
private Map<Player, Double> balanceMap = new HashMap<Player, Double>();
private Map<Player, Integer> runningTasks = new HashMap<Player, Integer>();
private Set<Player> playersInSync = new HashSet<Player>();
public EcoDataHandler(Eco eco) {
this.eco = eco;
}
public void onShutDownDataSave() {
Eco.log.info("Speichere Daten aller Online-Spieler...");
List<Player> onlinePlayers = new ArrayList<Player>(Bukkit.getOnlinePlayers());
for (Player p : onlinePlayers) {
if (p.isOnline()) {
onDataSaveFunction(p, true, "true", true);
}
}
Eco.log.info("Speicherung abgeschlossen für " + onlinePlayers.size() + " Spieler.");
}
public void onJoinFunction(final Player p) {
playersInSync.remove(p);
final double balance = Eco.vault.getBalance(p);
backupMoney.put(p, balance);
Bukkit.getScheduler().runTask(eco, () -> {
if (balance != 0.0) {
Eco.vault.withdrawPlayer(p, balance);
}
String[] data = eco.getEcoMysqlHandler().getData(p);
if (data[1].equalsIgnoreCase("true")) {
setPlayerData(p, data, false);
} else {
startSyncTask(p);
}
});
}
private void startSyncTask(final Player p) {
final long taskStart = System.currentTimeMillis();
BukkitTask task = Bukkit.getScheduler().runTaskTimerAsynchronously(eco, () -> {
if (p.isOnline()) {
final String[] data = eco.getEcoMysqlHandler().getData(p);
Bukkit.getScheduler().runTask(eco, () -> {
if (data[1].equalsIgnoreCase("true") || (System.currentTimeMillis() - Long.parseLong(data[2]) >= 15 * 1000)) {
setPlayerData(p, data, true);
}
});
}
}, 10L, 20L);
runningTasks.put(p, task.getTaskId());
}
public void setPlayerData(Player p, String[] data, boolean cancelTask) {
if (cancelTask && runningTasks.containsKey(p)) {
Bukkit.getScheduler().cancelTask(runningTasks.get(p));
runningTasks.remove(p);
}
double money = Double.parseDouble(data[0]);
Eco.vault.depositPlayer(p, money);
playersInSync.add(p);
balanceMap.put(p, money);
backupMoney.remove(p);
}
public void onDataSaveFunction(Player p, boolean removeData, String syncStatus, boolean isShutdown) {
if (playersInSync.contains(p)) {
double currentBalance = Eco.vault.getBalance(p);
eco.getEcoMysqlHandler().setData(p, currentBalance, syncStatus);
if (removeData) {
playersInSync.remove(p);
balanceMap.remove(p);
}
} else if (backupMoney.containsKey(p)) {
Eco.vault.depositPlayer(p, backupMoney.get(p));
backupMoney.remove(p);
}
}
public boolean isSyncComplete(Player p) {
return playersInSync.contains(p);
}
public void updateBalanceMap() {
for (Player p : playersInSync) {
balanceMap.put(p, Eco.vault.getBalance(p));
}
}
}