5 Commits
3.5 ... 3.6

Author SHA1 Message Date
34b41ca858 Update from Git Manager GUI 2026-01-28 08:02:00 +01:00
6748378055 Upload pom.xml via GUI 2026-01-28 07:01:59 +00:00
d06ddf1bf8 Update from Git Manager GUI 2026-01-28 08:00:53 +01:00
d57bef3525 Upload pom.xml via GUI 2026-01-28 07:00:52 +00:00
22b87b1e3e Dateien nach "/" hochladen 2025-08-12 22:10:45 +00:00
17 changed files with 625 additions and 946 deletions

66
pom.xml Normal file
View File

@@ -0,0 +1,66 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.mviper</groupId>
<artifactId>mysql-eco-bridge</artifactId>
<version>2.7</version>
<packaging>jar</packaging>
<name>MySQL Eco Bridge Reborn</name>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.15-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<mainClass>net.mviper.eco.bridge.Eco</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,59 +0,0 @@
package net.craftersland.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() {
if (m.getConfigHandler().getBoolean("General.saveDataTask.enabled") == true) {
Eco.log.info("Data save task is enabled.");
} else {
Eco.log.info("Data save task is disabled.");
}
Bukkit.getScheduler().runTaskTimerAsynchronously(m, new Runnable() {
@Override
public void run() {
m.getEcoDataHandler().updateBalanceMap();
runSaveData();
}
}, 20L, 20L);
}
private void runSaveData() {
if (m.getConfigHandler().getBoolean("General.saveDataTask.enabled") == true) {
if (Bukkit.getOnlinePlayers().isEmpty() == false) {
if (System.currentTimeMillis() - lastSave >= m.getConfigHandler().getInteger("General.saveDataTask.interval") * 60 * 1000) {
List<Player> onlinePlayers = new ArrayList<Player>(Bukkit.getOnlinePlayers());
lastSave = System.currentTimeMillis();
if (m.getConfigHandler().getBoolean("General.saveDataTask.hideLogMessages") == false) {
Eco.log.info("Saving online players data...");
}
for (Player p : onlinePlayers) {
if (p.isOnline() == true) {
m.getEcoDataHandler().onDataSaveFunction(p, false, "false", false);
}
}
if (m.getConfigHandler().getBoolean("General.saveDataTask.hideLogMessages") == false) {
Eco.log.info("Data save complete for " + onlinePlayers.size() + " players.");
}
onlinePlayers.clear();
}
}
}
}
}

View File

@@ -1,97 +0,0 @@
package net.craftersland.eco.bridge;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import net.craftersland.eco.bridge.database.EcoMysqlHandler;
import net.craftersland.eco.bridge.database.MysqlSetup;
import net.craftersland.eco.bridge.events.PlayerDisconnect;
import net.craftersland.eco.bridge.events.PlayerJoin;
import net.craftersland.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();
//Setup Vault for economy
if (setupEconomy() == false) {
log.severe("Warning! - Vault installed? If yes Economy system installed?");
getServer().getPluginManager().disablePlugin(this);
return;
}
//Load Configuration
configHandler = new ConfigHandler(this);
//Setup MySQL
mysqlSetup = new MysqlSetup(this);
ecoMysqlHandler = new EcoMysqlHandler(this);
edH = new EcoDataHandler(this);
bt = new BackgroundTask(this);
//Register Listeners
PluginManager pm = getServer().getPluginManager();
pm.registerEvents(new PlayerJoin(this), this);
pm.registerEvents(new PlayerDisconnect(this), this);
log.info(pluginName + " loaded successfully!");
}
@Override
public void onDisable() {
Bukkit.getScheduler().cancelTasks(this);
HandlerList.unregisterAll(this);
if (mysqlSetup.getConnection() != null) {
edH.onShutDownDataSave();
mysqlSetup.closeConnection();
}
log.info(pluginName + " is disabled!");
}
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();
log.info("Using economy system: " + rsp.getProvider().getName());
return vault != null;
}
public ConfigHandler getConfigHandler() {
return configHandler;
}
public MysqlSetup getMysqlSetup() {
return mysqlSetup;
}
public EcoMysqlHandler getEcoMysqlHandler() {
return ecoMysqlHandler;
}
public EcoDataHandler getEcoDataHandler() {
return edH;
}
public BackgroundTask getBackgroundTask() {
return bt;
}
}

View File

@@ -1,179 +0,0 @@
package net.craftersland.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.craftersland.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);
}
PreparedStatement preparedUpdateStatement = null;
ResultSet result = null;
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
try {
String sql = "SELECT * FROM `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` WHERE `player_uuid` = ? LIMIT 1";
preparedUpdateStatement = conn.prepareStatement(sql);
preparedUpdateStatement.setString(1, player.getUniqueId().toString());
result = preparedUpdateStatement.executeQuery();
while (result.next()) {
String[] data = {"" + result.getDouble("money"), result.getString("sync_complete"), result.getString("last_seen")};
return data;
}
} catch (SQLException e) {
Eco.log.warning("Error: " + e.getMessage());
e.printStackTrace();
} finally {
try {
if (result != null) {
result.close();
}
if (preparedUpdateStatement != null) {
preparedUpdateStatement.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}
public void setSyncStatus(Player player, String syncStatus) {
PreparedStatement preparedUpdateStatement = null;
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
try {
String data = "UPDATE `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` " + "SET `sync_complete` = ?" + ", `last_seen` = ?" + " WHERE `player_uuid` = ?";
preparedUpdateStatement = conn.prepareStatement(data);
preparedUpdateStatement.setString(1, syncStatus);
preparedUpdateStatement.setString(2, String.valueOf(System.currentTimeMillis()));
preparedUpdateStatement.setString(3, player.getUniqueId().toString());
preparedUpdateStatement.executeUpdate();
} catch (SQLException e) {
Eco.log.warning("Error: " + e.getMessage());
e.printStackTrace();
} finally {
try {
if (preparedUpdateStatement != null) {
preparedUpdateStatement.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void setData(Player player, Double money, String syncComplete) {
if (!hasAccount(player)) {
createAccount(player);
}
PreparedStatement preparedUpdateStatement = null;
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
try {
String data = "UPDATE `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` " + "SET `player_name` = ?" + ", `money` = ?" + ", `sync_complete` = ?" + ", `last_seen` = ?" + " WHERE `player_uuid` = ?";
preparedUpdateStatement = conn.prepareStatement(data);
preparedUpdateStatement.setString(1, player.getName());
preparedUpdateStatement.setDouble(2, money);
preparedUpdateStatement.setString(3, syncComplete);
preparedUpdateStatement.setString(4, String.valueOf(System.currentTimeMillis()));
preparedUpdateStatement.setString(5, player.getUniqueId().toString());
preparedUpdateStatement.executeUpdate();
} catch (SQLException e) {
Eco.log.warning("Error: " + e.getMessage());
e.printStackTrace();
} finally {
try {
if (preparedUpdateStatement != null) {
preparedUpdateStatement.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void createAccount(Player player) {
PreparedStatement preparedStatement = null;
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
try {
String sql = "INSERT INTO `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "`(`player_uuid`, `player_name`, `money`, `last_seen`, `sync_complete`) " + "VALUES(?, ?, ?, ?, ?)";
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, player.getUniqueId().toString());
preparedStatement.setString(2, player.getName());
preparedStatement.setDouble(3, 0.0);
preparedStatement.setString(4, String.valueOf(System.currentTimeMillis()));
preparedStatement.setString(5, "true");
preparedStatement.executeUpdate();
} catch (SQLException e) {
Eco.log.warning("Error: " + e.getMessage());
e.printStackTrace();
} finally {
try {
if (preparedStatement != null) {
preparedStatement.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public boolean hasAccount(Player player) {
PreparedStatement preparedUpdateStatement = null;
ResultSet result = null;
Connection conn = eco.getMysqlSetup().getConnection();
if (conn != null) {
try {
String sql = "SELECT `player_uuid` FROM `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` WHERE `player_uuid` = ? LIMIT 1";
preparedUpdateStatement = conn.prepareStatement(sql);
preparedUpdateStatement.setString(1, player.getUniqueId().toString());
result = preparedUpdateStatement.executeQuery();
while (result.next()) {
return true;
}
} catch (SQLException e) {
Eco.log.warning("Error: " + e.getMessage());
e.printStackTrace();
} finally {
try {
if (result != null) {
result.close();
}
if (preparedUpdateStatement != null) {
preparedUpdateStatement.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return false;
}
}

View File

@@ -1,208 +0,0 @@
package net.craftersland.eco.bridge.database;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import org.bukkit.Bukkit;
import net.craftersland.eco.bridge.Eco;
public class MysqlSetup {
private Connection conn = null;
private Eco eco;
public MysqlSetup(Eco eco) {
this.eco = eco;
connectToDatabase();
setupDatabase();
updateTables();
databaseMaintenanceTask();
}
public void connectToDatabase() {
Eco.log.info("Connecting to the database...");
try {
//Load Drivers
Class.forName("com.mysql.jdbc.Driver");
Properties properties = new Properties();
properties.setProperty("user", eco.getConfigHandler().getString("database.mysql.user"));
properties.setProperty("password", eco.getConfigHandler().getString("database.mysql.password"));
properties.setProperty("autoReconnect", "true");
properties.setProperty("verifyServerCertificate", "false");
properties.setProperty("useSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled"));
properties.setProperty("requireSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled"));
//Connect to database
conn = DriverManager.getConnection("jdbc:mysql://" + eco.getConfigHandler().getString("database.mysql.host") + ":" + eco.getConfigHandler().getString("database.mysql.port") + "/" + eco.getConfigHandler().getString("database.mysql.databaseName"), properties);
} catch (ClassNotFoundException e) {
Eco.log.severe("Could not locate drivers for mysql! Error: " + e.getMessage());
return;
} catch (SQLException e) {
Eco.log.severe("Could not connect to mysql database! Error: " + e.getMessage());
return;
}
Eco.log.info("Database connection successful!");
}
public void setupDatabase() {
if (conn == null) return;
//Create tables if needed
PreparedStatement query = null;
try {
String data = "CREATE TABLE IF NOT EXISTS `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` (id int(10) AUTO_INCREMENT, player_uuid varchar(50) NOT NULL UNIQUE, player_name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, money double(30,2) NOT NULL, sync_complete varchar(5) NOT NULL, last_seen varchar(30) NOT NULL, PRIMARY KEY(id));";
query = conn.prepareStatement(data);
query.execute();
} catch (SQLException e) {
e.printStackTrace();
Eco.log.severe("Error creating tables! Error: " + e.getMessage());
} finally {
try {
if (query != null) {
query.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Connection getConnection() {
checkConnection();
return conn;
}
public void checkConnection() {
try {
if (conn == null) {
Eco.log.warning("Connection failed. Reconnecting...");
reConnect();
}
if (!conn.isValid(3)) {
Eco.log.warning("Connection is idle or terminated. Reconnecting...");
reConnect();
}
if (conn.isClosed() == true) {
Eco.log.warning("Connection is closed. Reconnecting...");
reConnect();
}
} catch (Exception e) {
Eco.log.severe("Could not reconnect to Database! Error: " + e.getMessage());
}
}
public boolean reConnect() {
try {
long start = 0;
long end = 0;
start = System.currentTimeMillis();
Eco.log.info("Attempting to establish a connection to the MySQL server!");
Class.forName("com.mysql.jdbc.Driver");
Properties properties = new Properties();
properties.setProperty("user", eco.getConfigHandler().getString("database.mysql.user"));
properties.setProperty("password", eco.getConfigHandler().getString("database.mysql.password"));
properties.setProperty("autoReconnect", "true");
properties.setProperty("verifyServerCertificate", "false");
properties.setProperty("useSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled"));
properties.setProperty("requireSSL", eco.getConfigHandler().getString("database.mysql.sslEnabled"));
//properties.setProperty("useUnicode", "true");
//properties.setProperty("characterEncoding", "utf8");
//properties.setProperty("characterSetResults", "utf8");
//properties.setProperty("connectionCollation", "utf8mb4_unicode_ci");
conn = DriverManager.getConnection("jdbc:mysql://" + eco.getConfigHandler().getString("database.mysql.host") + ":" + eco.getConfigHandler().getString("database.mysql.port") + "/" + eco.getConfigHandler().getString("database.mysql.databaseName"), properties);
end = System.currentTimeMillis();
Eco.log.info("Connection to MySQL server established in " + ((end - start)) + " ms!");
return true;
} catch (Exception e) {
Eco.log.severe("Error re-connecting to the database! Error: " + e.getMessage());
return false;
}
}
public void closeConnection() {
try {
Eco.log.info("Closing database connection...");
conn.close();
conn = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
private void updateTables() {
if (conn != null) {
DatabaseMetaData md = null;
ResultSet rs1 = null;
PreparedStatement query1 = null;
try {
md = conn.getMetaData();
rs1 = md.getColumns(null, null, eco.getConfigHandler().getString("database.mysql.dataTableName"), "sync_complete");
if (rs1.next()) {
} else {
String data = "ALTER TABLE `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` ADD sync_complete varchar(5) NOT NULL DEFAULT 'true';";
query1 = conn.prepareStatement(data);
query1.execute();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (query1 != null) {
query1.close();
}
if (rs1 != null) {
rs1.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private void databaseMaintenanceTask() {
if (eco.getConfigHandler().getBoolean("database.removeOldAccounts.enabled") == true) {
Bukkit.getScheduler().runTaskLaterAsynchronously(eco, new Runnable() {
@Override
public void run() {
if (conn != null) {
long inactivityDays = Long.parseLong(eco.getConfigHandler().getString("database.removeOldAccounts.inactivity"));
long inactivityMils = inactivityDays * 24 * 60 * 60 * 1000;
long curentTime = System.currentTimeMillis();
long inactiveTime = curentTime - inactivityMils;
Eco.log.info("Database maintenance task started...");
PreparedStatement preparedStatement = null;
try {
String sql = "DELETE FROM `" + eco.getConfigHandler().getString("database.mysql.dataTableName") + "` WHERE `last_seen` < ?";
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, String.valueOf(inactiveTime));
preparedStatement.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (preparedStatement != null) {
preparedStatement.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Eco.log.info("Database maintenance complete!");
}
}
}, 100 * 20L);
}
}
}

View File

@@ -1,71 +0,0 @@
package net.craftersland.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.PlayerJoinEvent;
import org.bukkit.scheduler.BukkitTask;
import net.craftersland.eco.bridge.Eco;
public class PlayerJoin implements Listener {
private Eco eco;
public PlayerJoin(Eco eco) {
this.eco = eco;
}
@EventHandler
public void onJoin(final PlayerJoinEvent event) {
Bukkit.getScheduler().runTaskLaterAsynchronously(eco, new Runnable() {
@Override
public void run() {
if (event.getPlayer() != null) {
if (event.getPlayer().isOnline() == true) {
Player p = event.getPlayer();
eco.getEcoDataHandler().onJoinFunction(p);
syncCompleteTask(p);
}
}
}
}, 5L);
}
private void syncCompleteTask(final Player p) {
if (p != null) {
if (p.isOnline() == true) {
final long startTime = System.currentTimeMillis();
BukkitTask task = Bukkit.getScheduler().runTaskTimerAsynchronously(eco, new Runnable() {
@Override
public void run() {
if (p.isOnline() == true) {
if (eco.getEcoDataHandler().isSyncComplete(p)) {
if (eco.syncCompleteTasks.containsKey(p) == true) {
int taskID = eco.syncCompleteTasks.get(p);
eco.syncCompleteTasks.remove(p);
Bukkit.getScheduler().cancelTask(taskID);
}
} else {
if (System.currentTimeMillis() - startTime >= 10 * 1000) {
if (eco.syncCompleteTasks.containsKey(p) == true) {
int taskID = eco.syncCompleteTasks.get(p);
eco.syncCompleteTasks.remove(p);
Bukkit.getScheduler().cancelTask(taskID);
}
}
}
}
}
}, 5L, 20L);
eco.syncCompleteTasks.put(p, task.getTaskId());
}
}
}
}

View File

@@ -1,191 +0,0 @@
package net.craftersland.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.craftersland.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("Saving online players data...");
List<Player> onlinePlayers = new ArrayList<Player>(Bukkit.getOnlinePlayers());
for (Player p : onlinePlayers) {
if (p.isOnline() == true) {
onDataSaveFunction(p, true, "true", true);
}
}
Eco.log.info("Data save complete for " + onlinePlayers.size() + " players.");
}
public void updateBalanceMap() {
List<Player> onlinePlayers = new ArrayList<Player>(Bukkit.getOnlinePlayers());
if (onlinePlayers.isEmpty() == false) {
for (Player p : onlinePlayers) {
if (playersInSync.contains(p) == true) {
balanceMap.put(p, Eco.vault.getBalance(p));
}
}
}
}
public boolean isSyncComplete(Player p) {
if (playersInSync.contains(p) == true) {
return true;
} else {
return false;
}
}
private void dataCleanup(Player p, Boolean isDisabling) {
if (isDisabling == false) {
playersInSync.remove(p);
backupMoney.remove(p);
balanceMap.remove(p);
if (runningTasks.containsKey(p) == true) {
Bukkit.getScheduler().cancelTask(runningTasks.get(p));
runningTasks.remove(p);
}
}
}
private void setPlayerData(final Player p, String[] data, boolean cancelTask) {
try {
Double bal = Eco.vault.getBalance(p);
if (bal != null) {
if (bal != 0.0) {
Eco.vault.withdrawPlayer(p, bal);
}
Double mysqlBal = Double.parseDouble(data[0]);
Double localBal = Eco.vault.getBalance(p);
if (mysqlBal >= localBal) {
Double finalBalance = mysqlBal - localBal;
Eco.vault.depositPlayer(p, finalBalance);
} else if (mysqlBal < localBal) {
Double finalBalance = localBal - mysqlBal;
Eco.vault.withdrawPlayer(p, finalBalance);
}
}
} catch (Exception e) {
e.printStackTrace();
Double backupBalance = backupMoney.get(p);
if (backupBalance != 0.0) {
Double bal = Eco.vault.getBalance(p);
if (bal != null) {
if (bal != 0.0) {
Eco.vault.withdrawPlayer(p, bal);
}
Double localBal = Eco.vault.getBalance(p);
if (backupBalance >= localBal) {
Double finalBalance = backupBalance - localBal;
Eco.vault.depositPlayer(p, finalBalance);
} else if (backupBalance < localBal) {
Double finalBalance = localBal - backupBalance;
Eco.vault.depositPlayer(p, finalBalance);
}
}
}
}
eco.getEcoMysqlHandler().setSyncStatus(p, "false");
playersInSync.add(p);
backupMoney.remove(p);
if (cancelTask == true) {
int taskID = runningTasks.get(p);
runningTasks.remove(p);
Bukkit.getScheduler().cancelTask(taskID);
}
}
public void onDataSaveFunction(Player p, Boolean datacleanup, String syncStatus, Boolean isDisabling) {
boolean isPlayerInSync = playersInSync.contains(p);
if (isDisabling == false) {
if (datacleanup == true) {
dataCleanup(p, isDisabling);
}
if (isPlayerInSync == true) {
eco.getEcoMysqlHandler().setData(p, Eco.vault.getBalance(p), syncStatus);
}
} else {
if (isPlayerInSync == true) {
if (balanceMap.containsKey(p) == true) {
eco.getEcoMysqlHandler().setData(p, balanceMap.get(p), syncStatus);
}
}
}
}
public void onJoinFunction(final Player p) {
if (eco.getEcoMysqlHandler().hasAccount(p) == true) {
final double balance = Eco.vault.getBalance(p);
backupMoney.put(p, balance);
Bukkit.getScheduler().runTask(eco, new Runnable() {
@Override
public void run() {
if (balance != 0.0) {
Eco.vault.withdrawPlayer(p, balance);
}
String[] data = eco.getEcoMysqlHandler().getData(p);
if (data[1].matches("true")) {
setPlayerData(p, data, false);
} else {
final long taskStart = System.currentTimeMillis();
BukkitTask task = Bukkit.getScheduler().runTaskTimerAsynchronously(eco, new Runnable() {
@Override
public void run() {
if (p.isOnline() == true) {
final String[] data = eco.getEcoMysqlHandler().getData(p);
Bukkit.getScheduler().runTask(eco, new Runnable() {
@Override
public void run() {
if (data[1].matches("true")) {
setPlayerData(p, data, true);
} else if (System.currentTimeMillis() - Long.parseLong(data[2]) >= 15 * 1000) {
setPlayerData(p, data, true);
}
}
});
}
if (System.currentTimeMillis() - taskStart >= 10 * 1000) {
int taskID = runningTasks.get(p);
runningTasks.remove(p);
Bukkit.getScheduler().cancelTask(taskID);
}
}
}, 20L, 20L);
runningTasks.put(p, task.getTaskId());
}
}
});
} else {
playersInSync.add(p);
onDataSaveFunction(p, false, "false", false);
}
}
}

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

@@ -1,4 +1,4 @@
package net.craftersland.eco.bridge;
package net.mviper.eco.bridge;
import java.io.File;

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

@@ -1,4 +1,4 @@
package net.craftersland.eco.bridge.events;
package net.mviper.eco.bridge.events;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -6,7 +6,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import net.craftersland.eco.bridge.Eco;
import net.mviper.eco.bridge.Eco;
public class PlayerDisconnect implements Listener {

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));
}
}
}

View File

@@ -1,39 +1,59 @@
# default config.yml for MysqlEcoBridge
# config version 3.4.1
# +-----------------------------------------------------------------------+
# | MySQL Eco Bridge 3 |
# | Version: 2.7 | by M-Viper |
# +-----------------------------------------------------------------------+
#MySQL Database details
# -------------------------------------------------------------------------
# DATENBANK-EINSTELLUNGEN
# -------------------------------------------------------------------------
# Hier konfigurierst du die Verbindung zu deinem MySQL/MariaDB Server.
# HINWEIS: Die Datenbank muss bereits existieren, Tabellen werden erstellt.
database:
mysql:
#MySQL server address
host: 127.0.0.1
#MySQL server port (default 3306)
port: 3306
#Database name (NOTE! You need to create the database, then the plugin will create the tables.)
databaseName: 'mydatabase'
#Tables name (the plugin will auto create it)
dataTableName: 'eco_accounts'
#User name
user: 'admin'
#User password
password: 'cheesecake'
#SSL connection.
password: 'password123'
# SSL verschlüsselt die Verbindung zwischen Server und Datenbank.
sslEnabled: false
#This maintenance task runs async with a 2 min delay after the server starts.
# -----------------------------------------------------------------------
# DATENBANK-WARTUNG (CLEANUP)
# -----------------------------------------------------------------------
# Diese Aufgabe läuft automatisch im Hintergrund (2 Min. nach Start).
# Sie hilft dabei, die Datenbank schlank zu halten.
removeOldAccounts:
#Enable or disable database clean up of old accounts. | (true or false)
# Sollen inaktive Accounts automatisch gelöscht werden?
enabled: false
#Inactivity in days. Default 60 days.
# Ab wie vielen Tagen Inaktivität gilt ein Account als veraltet?
inactivity: 60
#Other configurable options
# -------------------------------------------------------------------------
# ALLGEMEINE PLUGIN-OPTIONEN
# -------------------------------------------------------------------------
General:
#Save online players accounts to database task. Disable this task and data will only be saved when the player disconnects.
#To limit data loss in case the server crashes enable this saving task. It runs async so there will be no lag involved.
# BACKUP-SYSTEM (AUTOSAVE)
# Verhindert Datenverlust bei Serverabstürzen. Wenn deaktiviert, wird
# das Geld NUR beim Verlassen des Servers (Disconnect) gespeichert.
saveDataTask:
#Enable or disable the data save task. | (true or false)
# Automatisches Speichern im Hintergrund aktivieren?
enabled: true
#Time between data saves in minutes. | Default 3 min.
# Intervall in Minuten (Standard: 3).
interval: 3
#Hide the data save task log messages.
# Wenn true, werden die "Saving online players..." Nachrichten in der
# Konsole unterdrückt, um den Log sauber zu halten.
hideLogMessages: false
# -------------------------------------------------------------------------
# NACHRICHTEN & FEEDBACK (Optional/Erweiterbar)
# -------------------------------------------------------------------------
ChatMessages:
# Nachricht, die gesendet wird, wenn die Synchronisation abgeschlossen ist.
# Nutze "" um die Nachricht zu deaktivieren. Farbcodes mit & möglich.
syncComplete: "&a[Eco] &7Deine Kontodaten wurden erfolgreich synchronisiert!"
# +-----------------------------------------------------------------------+
# | HINWEIS: Änderungen werden erst nach einem Server-Neustart aktiv. |
# +-----------------------------------------------------------------------+

View File

@@ -1,7 +1,9 @@
name: MysqlEcoBridge
main: net.craftersland.eco.bridge.Eco
version: 3.5
main: net.mviper.eco.bridge.Eco
version: 2.7
api-version: 1.15
depend: [Vault]
author: M_Viper
website: www.m-viper.de
load: STARTUP
description: Sync your economy accounts over many servers using MySQL.
description: Synchronisiert Vault-Economy-Accounts über mehrere Server hinweg via MySQL.