Update from Git Manager GUI
This commit is contained in:
43
src/main/java/mviper/eco/bridge/BackgroundTask.java
Normal file
43
src/main/java/mviper/eco/bridge/BackgroundTask.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
60
src/main/java/mviper/eco/bridge/ConfigHandler.java
Normal file
60
src/main/java/mviper/eco/bridge/ConfigHandler.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
77
src/main/java/mviper/eco/bridge/Eco.java
Normal file
77
src/main/java/mviper/eco/bridge/Eco.java
Normal 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; }
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
62
src/main/java/mviper/eco/bridge/database/MysqlSetup.java
Normal file
62
src/main/java/mviper/eco/bridge/database/MysqlSetup.java
Normal 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(); }
|
||||
}
|
||||
}
|
||||
42
src/main/java/mviper/eco/bridge/events/PlayerDisconnect.java
Normal file
42
src/main/java/mviper/eco/bridge/events/PlayerDisconnect.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
21
src/main/java/mviper/eco/bridge/events/PlayerJoin.java
Normal file
21
src/main/java/mviper/eco/bridge/events/PlayerJoin.java
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user