diff --git a/src/main/java/net/viper/money/database/AccountDatabaseInterface.java b/src/main/java/net/viper/money/database/AccountDatabaseInterface.java new file mode 100644 index 0000000..7230a35 --- /dev/null +++ b/src/main/java/net/viper/money/database/AccountDatabaseInterface.java @@ -0,0 +1,17 @@ +package net.craftersland.money.database; + +import java.util.UUID; + +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +public interface AccountDatabaseInterface { + //Accountmethods + public boolean hasAccount(OfflinePlayer player); + public boolean hasAccount(UUID player); + public boolean createAccount(Player player); + public Double getBalance(OfflinePlayer player); + public Double getBalance(UUID player); + public boolean setBalance(OfflinePlayer player, Double amount); + public boolean setBalance(UUID player, Double amount); +} diff --git a/src/main/java/net/viper/money/database/DatabaseManagerFlatFile.java b/src/main/java/net/viper/money/database/DatabaseManagerFlatFile.java new file mode 100644 index 0000000..02c0592 --- /dev/null +++ b/src/main/java/net/viper/money/database/DatabaseManagerFlatFile.java @@ -0,0 +1,33 @@ +package net.craftersland.money.database; + +import java.sql.Connection; + +import net.craftersland.money.Money; + +public class DatabaseManagerFlatFile implements DatabaseManagerInterface { + + @SuppressWarnings("unused") + private Money money; + + public DatabaseManagerFlatFile(Money money) { + this.money = money; + + setupDatabase(); + } + + @Override + public boolean setupDatabase() { + return true; + } + + @Override + public boolean closeDatabase() { + return true; + } + + @Override + public Connection getConnection() { + return null; + } + +} diff --git a/src/main/java/net/viper/money/database/DatabaseManagerInterface.java b/src/main/java/net/viper/money/database/DatabaseManagerInterface.java new file mode 100644 index 0000000..21a778a --- /dev/null +++ b/src/main/java/net/viper/money/database/DatabaseManagerInterface.java @@ -0,0 +1,10 @@ +package net.craftersland.money.database; + +import java.sql.Connection; + +public interface DatabaseManagerInterface { + + public boolean setupDatabase(); + public boolean closeDatabase(); + public Connection getConnection(); +} diff --git a/src/main/java/net/viper/money/database/DatabaseManagerMysql.java b/src/main/java/net/viper/money/database/DatabaseManagerMysql.java new file mode 100644 index 0000000..7c88937 --- /dev/null +++ b/src/main/java/net/viper/money/database/DatabaseManagerMysql.java @@ -0,0 +1,205 @@ +package net.craftersland.money.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 net.craftersland.money.Money; + +public class DatabaseManagerMysql implements DatabaseManagerInterface{ + + private Connection conn = null; + private Money money; + + public DatabaseManagerMysql(Money money) { + this.money = money; + connectToDatabase(); + setupDatabase(); + } + + private void connectToDatabase() { + Money.log.info("Connecting to the database..."); + try { + //Load Drivers + Class.forName("com.mysql.jdbc.Driver"); + Properties properties = new Properties(); + properties.setProperty("user", money.getConfigurationHandler().getString("database.mysql.user")); + properties.setProperty("password", money.getConfigurationHandler().getString("database.mysql.password")); + properties.setProperty("autoReconnect", "true"); + properties.setProperty("verifyServerCertificate", "false"); + properties.setProperty("useSSL", money.getConfigurationHandler().getString("database.mysql.ssl")); + properties.setProperty("requireSSL", money.getConfigurationHandler().getString("database.mysql.ssl")); + //Connect to database + conn = DriverManager.getConnection("jdbc:mysql://" + money.getConfigurationHandler().getString("database.mysql.host") + ":" + money.getConfigurationHandler().getString("database.mysql.port") + "/" + money.getConfigurationHandler().getString("database.mysql.databaseName"), properties); + + } catch (ClassNotFoundException e) { + Money.log.severe("Could not locate drivers for mysql! Error: " + e.getMessage()); + return; + } catch (SQLException e) { + Money.log.severe("Could not connect to mysql database! Error: " + e.getMessage()); + return; + } + Money.log.info("Database connection successful!"); + } + + @Override + public boolean setupDatabase() { + PreparedStatement query = null; + try { + String data = "CREATE TABLE IF NOT EXISTS `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` (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, last_seen varchar(30) NOT NULL, sync_complete varchar(5) NOT NULL, PRIMARY KEY(id));"; + query = conn.prepareStatement(data); + query.execute(); + } catch (SQLException e) { + e.printStackTrace(); + return false; + } finally { + try { + if (query != null) { + query.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + //Update Tables + updateTables(); + return true; + } + + @Override + public Connection getConnection() { + checkConnection(); + return conn; + } + + public boolean checkConnection() { + try { + if (conn == null) { + Money.log.warning("Connection failed. Reconnecting..."); + if (reConnect() == true) return true; + return false; + } + if (!conn.isValid(3)) { + Money.log.warning("Connection is idle or terminated. Reconnecting..."); + if (reConnect() == true) return true; + return false; + } + if (conn.isClosed() == true) { + Money.log.warning("Connection is closed. Reconnecting..."); + if (reConnect() == true) return true; + return false; + } + return true; + } catch (Exception e) { + Money.log.severe("Could not reconnect to Database!"); + } + return true; + } + + public boolean reConnect() { + try { + long start = 0; + long end = 0; + + start = System.currentTimeMillis(); + Money.log.info("Attempting to establish a connection to the MySQL server!"); + Class.forName("com.mysql.jdbc.Driver"); + Properties properties = new Properties(); + properties.setProperty("user", money.getConfigurationHandler().getString("database.mysql.user")); + properties.setProperty("password", money.getConfigurationHandler().getString("database.mysql.password")); + properties.setProperty("autoReconnect", "true"); + properties.setProperty("verifyServerCertificate", "false"); + properties.setProperty("useSSL", money.getConfigurationHandler().getString("database.mysql.ssl")); + properties.setProperty("requireSSL", money.getConfigurationHandler().getString("database.mysql.ssl")); + conn = DriverManager.getConnection("jdbc:mysql://" + money.getConfigurationHandler().getString("database.mysql.host") + ":" + money.getConfigurationHandler().getString("database.mysql.port") + "/" + money.getConfigurationHandler().getString("database.mysql.databaseName"), properties); + end = System.currentTimeMillis(); + Money.log.info("Connection to MySQL server established!"); + Money.log.info("Connection took " + ((end - start)) + "ms!"); + return true; + } catch (Exception e) { + Money.log.severe("Could not connect to MySQL server! because: " + e.getMessage()); + return false; + } + } + + @Override + public boolean closeDatabase() { + try { + conn.close(); + conn = null; + return true; + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + + private void updateTables() { + if (conn != null) { + DatabaseMetaData md = null; + ResultSet rs1 = null; + ResultSet rs2 = null; + ResultSet rs3 = null; + PreparedStatement query1 = null; + PreparedStatement query2 = null; + PreparedStatement query3 = null; + try { + md = conn.getMetaData(); + rs1 = md.getColumns(null, null, money.getConfigurationHandler().getString("database.mysql.tableName"), "sync_complete"); + if (rs1.next()) { + } else { + String data = "ALTER TABLE `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` ADD sync_complete varchar(5) NOT NULL DEFAULT 'true';"; + query1 = conn.prepareStatement(data); + query1.execute(); + } + rs2 = md.getColumns(null, null, money.getConfigurationHandler().getString("database.mysql.tableName"), "player_name"); + if (rs2.next()) { + } else { + String data = "ALTER TABLE `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` ADD player_name varchar(50) NOT NULL DEFAULT 'true';"; + query2 = conn.prepareStatement(data); + query2.execute(); + } + rs3 = md.getColumns(null, null, money.getConfigurationHandler().getString("database.mysql.tableName"), "last_seen"); + if (rs3.next()) { + } else { + String data = "ALTER TABLE `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` ADD last_seen varchar(30) NOT NULL DEFAULT 'true';"; + query3 = conn.prepareStatement(data); + query3.execute(); + } + } catch (Exception e) { + Money.log.severe("Error updating inventory table! Error: " + e.getMessage()); + e.printStackTrace(); + } finally { + try { + if (query1 != null) { + query1.close(); + } + if (query2 != null) { + query2.close(); + } + if (query3 != null) { + query3.close(); + } + if (rs1 != null) { + rs1.close(); + } + if (rs2 != null) { + rs2.close(); + } + if (rs3 != null) { + rs3.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + +} diff --git a/src/main/java/net/viper/money/database/MoneyFlatFileInterface.java b/src/main/java/net/viper/money/database/MoneyFlatFileInterface.java new file mode 100644 index 0000000..64ceb41 --- /dev/null +++ b/src/main/java/net/viper/money/database/MoneyFlatFileInterface.java @@ -0,0 +1,150 @@ +package net.craftersland.money.database; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.util.UUID; + +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +import net.craftersland.money.Money; + +public class MoneyFlatFileInterface implements AccountDatabaseInterface { + + private Money money; + + public MoneyFlatFileInterface(Money money) { + this.money = money; + } + + @Override + public boolean hasAccount(OfflinePlayer player) { + (new File("plugins"+System.getProperty("file.separator") + "MysqlEconomyBank" + System.getProperty("file.separator") + "Accounts" + System.getProperty("file.separator") + player.getUniqueId().toString() + ".yml")).exists(); + + + return (new File("plugins"+System.getProperty("file.separator") + "MysqlEconomyBank" + System.getProperty("file.separator") + "Accounts" + System.getProperty("file.separator") + player.getUniqueId().toString() + ".yml")).exists(); + } + + @Override + public boolean hasAccount(UUID playerUUID) { + return (new File("plugins"+System.getProperty("file.separator") + "MysqlEconomyBank" + System.getProperty("file.separator") + "Accounts" + System.getProperty("file.separator") + playerUUID.toString() + ".yml")).exists(); + } + + @Override + public boolean createAccount(Player player) { + try { + File accountFile = new File("plugins" + System.getProperty("file.separator") + "MysqlEconomyBank" + System.getProperty("file.separator") + "Accounts" + System.getProperty("file.separator") + player.getUniqueId().toString() + ".yml"); + accountFile.createNewFile(); + + FileWriter fw = new FileWriter(accountFile, false); + BufferedWriter bw = new BufferedWriter(fw); + bw.write("Balance: 0"); + bw.close(); + fw.close(); + return true; + + } catch (Exception e) { + money.getLogger().severe("Could not create Account file " + player.getName() + "!"); + } + return false; + } + + @Override + public Double getBalance(OfflinePlayer player) { + if (!hasAccount(player)) { + createAccount(player.getPlayer()); + } + + try { + File accountFile = new File("plugins" + System.getProperty("file.separator") + "MysqlEconomyBank" + System.getProperty("file.separator") + "Accounts" + System.getProperty("file.separator") + player.getUniqueId().toString() + ".yml"); + + FileReader fr = new FileReader(accountFile); + BufferedReader br = new BufferedReader(fr); + Double balance = Double.parseDouble(br.readLine().split(":")[1]); + br.close(); + fr.close(); + return balance; + + } catch (Exception e) { + money.getLogger().severe("Could not get Balance of " + player.getName() + "!"); + } + return null; + } + + @Override + public Double getBalance(UUID playerUUID) { + try { + File accountFile = new File("plugins" + System.getProperty("file.separator") + "MysqlEconomyBank" + System.getProperty("file.separator") + "Accounts" + System.getProperty("file.separator") + playerUUID.toString() + ".yml"); + + FileReader fr = new FileReader(accountFile); + BufferedReader br = new BufferedReader(fr); + Double balance = Double.parseDouble(br.readLine().split(":")[1]); + br.close(); + fr.close(); + return balance; + + } catch (Exception e) { + money.getLogger().severe("Could not get Balance of " + playerUUID + "!"); + } + return null; + } + + @Override + public boolean setBalance(OfflinePlayer player, Double amount) { + if (!hasAccount(player)) { + createAccount(player.getPlayer()); + } + + try { + File accountFile = new File("plugins" + System.getProperty("file.separator") + "MysqlEconomyBank" + System.getProperty("file.separator") + "Accounts"+System.getProperty("file.separator") + player.getUniqueId().toString() + ".yml"); + + FileReader fr = new FileReader(accountFile); + BufferedReader br = new BufferedReader(fr); + String balances = br.readLine(); + br.close(); + fr.close(); + + + FileWriter fw = new FileWriter(accountFile, false); + BufferedWriter bw = new BufferedWriter(fw); + bw.write(balances.split(":")[0]+": "+amount); + bw.close(); + fw.close(); + + return true; + + } catch (Exception e) { + money.getLogger().severe("Could not set Balance of "+player.getName()+"!"); + } + return false; + } + + @Override + public boolean setBalance(UUID playerUUID, Double amount) { + try { + File accountFile = new File("plugins" + System.getProperty("file.separator") + "MysqlEconomyBank" + System.getProperty("file.separator") + "Accounts"+System.getProperty("file.separator") + playerUUID.toString() + ".yml"); + + FileReader fr = new FileReader(accountFile); + BufferedReader br = new BufferedReader(fr); + String balances = br.readLine(); + br.close(); + fr.close(); + + + FileWriter fw = new FileWriter(accountFile, false); + BufferedWriter bw = new BufferedWriter(fw); + bw.write(balances.split(":")[0]+": "+amount); + bw.close(); + fw.close(); + + return true; + + } catch (Exception e) { + money.getLogger().severe("Could not set Balance of " + playerUUID + "!"); + } + return false; + } +} diff --git a/src/main/java/net/viper/money/database/MoneyMysqlInterface.java b/src/main/java/net/viper/money/database/MoneyMysqlInterface.java new file mode 100644 index 0000000..dc8bd44 --- /dev/null +++ b/src/main/java/net/viper/money/database/MoneyMysqlInterface.java @@ -0,0 +1,236 @@ +package net.craftersland.money.database; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +import net.craftersland.money.Money; + +public class MoneyMysqlInterface implements AccountDatabaseInterface { + + private Money money; + + public MoneyMysqlInterface(Money money) { + this.money = money; + } + + @Override + public boolean hasAccount(OfflinePlayer player) { + Connection conn = money.getDatabaseManagerInterface().getConnection(); + PreparedStatement preparedUpdateStatement = null; + ResultSet result = null; + try { + String sql = "SELECT `player_uuid` FROM `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` 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) { + e.printStackTrace(); + } finally { + try { + if (result != null) { + result.close(); + } + if (preparedUpdateStatement != null) { + preparedUpdateStatement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return false; + } + + @Override + public boolean hasAccount(UUID playerUUID) { + Connection conn = money.getDatabaseManagerInterface().getConnection(); + PreparedStatement preparedUpdateStatement = null; + ResultSet result = null; + try { + String sql = "SELECT `player_uuid` FROM `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` WHERE `player_uuid` = ? LIMIT 1"; + preparedUpdateStatement = conn.prepareStatement(sql); + preparedUpdateStatement.setString(1, playerUUID.toString()); + + result = preparedUpdateStatement.executeQuery(); + while (result.next()) { + return true; + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + try { + if (result != null) { + result.close(); + } + if (preparedUpdateStatement != null) { + preparedUpdateStatement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return false; + } + + @Override + public boolean createAccount(Player player) { + Connection conn = money.getDatabaseManagerInterface().getConnection(); + PreparedStatement preparedStatement = null; + try { + String sql = "INSERT INTO `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "`(`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, System.currentTimeMillis() + ""); + preparedStatement.setString(5, "true"); + + preparedStatement.executeUpdate(); + return true; + } catch (SQLException e) { + e.printStackTrace(); + } finally { + try { + if (preparedStatement != null) { + preparedStatement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return false; + } + + @Override + public Double getBalance(OfflinePlayer player) { + if (!hasAccount(player)) { + createAccount(player.getPlayer()); + } + Connection conn = money.getDatabaseManagerInterface().getConnection(); + PreparedStatement preparedUpdateStatement = null; + ResultSet result = null; + try { + String sql = "SELECT `money` FROM `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` WHERE `player_uuid` = ? LIMIT 1"; + + preparedUpdateStatement = conn.prepareStatement(sql); + preparedUpdateStatement.setString(1, player.getUniqueId().toString()); + result = preparedUpdateStatement.executeQuery(); + + while (result.next()) { + return Double.parseDouble(result.getString("money")); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + try { + if (result != null) { + result.close(); + } + if (preparedUpdateStatement != null) { + preparedUpdateStatement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public Double getBalance(UUID playerUUID) { + Connection conn = money.getDatabaseManagerInterface().getConnection(); + PreparedStatement preparedUpdateStatement = null; + ResultSet result = null; + try { + String sql = "SELECT `money` FROM `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` WHERE `player_uuid` = ? LIMIT 1"; + + preparedUpdateStatement = conn.prepareStatement(sql); + preparedUpdateStatement.setString(1, playerUUID.toString()); + result = preparedUpdateStatement.executeQuery(); + + while (result.next()) { + return Double.parseDouble(result.getString("money")); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + try { + if (result != null) { + result.close(); + } + if (preparedUpdateStatement != null) { + preparedUpdateStatement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public boolean setBalance(OfflinePlayer player, Double amount) { + if (!hasAccount(player)) { + createAccount(player.getPlayer()); + } + Connection conn = money.getDatabaseManagerInterface().getConnection(); + PreparedStatement preparedUpdateStatement = null; + try { + String updateSql = "UPDATE `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` " + "SET `money` = ?" + "WHERE `player_uuid` = ?"; + preparedUpdateStatement = conn.prepareStatement(updateSql); + preparedUpdateStatement.setDouble(1, amount); + preparedUpdateStatement.setString(2, player.getUniqueId().toString()); + + preparedUpdateStatement.executeUpdate(); + return true; + } catch (SQLException e) { + e.printStackTrace(); + } finally { + try { + if (preparedUpdateStatement != null) { + preparedUpdateStatement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return false; + } + + @Override + public boolean setBalance(UUID playerUUID, Double amount) { + Connection conn = money.getDatabaseManagerInterface().getConnection(); + PreparedStatement preparedUpdateStatement = null; + try { + String updateSql = "UPDATE `" + money.getConfigurationHandler().getString("database.mysql.tableName") + "` " + "SET `money` = ?" + "WHERE `player_uuid` = ?"; + preparedUpdateStatement = conn.prepareStatement(updateSql); + preparedUpdateStatement.setDouble(1, amount); + preparedUpdateStatement.setString(2, playerUUID.toString()); + + preparedUpdateStatement.executeUpdate(); + return true; + } catch (SQLException e) { + e.printStackTrace(); + } finally { + try { + if (preparedUpdateStatement != null) { + preparedUpdateStatement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return false; + } + +}