MySQLPluginData.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package de.Linus122.TimeIsMoney.data;
  2. import de.Linus122.TimeIsMoney.Main;
  3. import org.bukkit.Bukkit;
  4. import org.bukkit.entity.Player;
  5. import org.jetbrains.annotations.Blocking;
  6. import org.jetbrains.annotations.NotNull;
  7. import java.sql.*;
  8. import java.sql.Date;
  9. import java.util.*;
  10. public class MySQLPluginData extends PluginData{
  11. private Connection connection;
  12. public class PendingPayout {
  13. }
  14. /**
  15. * Loads data from file if {@link #dataFile} exists.
  16. */
  17. public MySQLPluginData(Main main, String host, int port, String username, String database, String password) {
  18. super(main);
  19. try {
  20. this.plugin.getLogger().info(String.format("Trying to connect to jdbc:mysql://%s:%d/%s", host, port, database));
  21. connection = DriverManager.getConnection(String.format("jdbc:mysql://%s:%d/%s", host, port, database), username, password);
  22. this.plugin.getLogger().info(String.format("MySQL connected!", host, port, database));
  23. // table for the player data
  24. String sqlCreate = "CREATE TABLE IF NOT EXISTS payoutData ("
  25. + " uuid VARCHAR(36),"
  26. + " id INT,"
  27. + " receivedToday DOUBLE,"
  28. + " secondsSinceLastPayout INTEGER,"
  29. + " lastPayoutDate DATE,"
  30. + " primary key (uuid, id))";
  31. Statement statement = connection.createStatement();
  32. statement.execute(sqlCreate);
  33. // table for tracking pending payouts for other servers
  34. String sqlCreate2 = "CREATE TABLE IF NOT EXISTS pendingPayouts ("
  35. + " id INT NOT NULL AUTO_INCREMENT,"
  36. + " uuid VARCHAR(36),"
  37. + " date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,"
  38. + " PRIMARY KEY (id))";
  39. Statement statement2 = connection.createStatement();
  40. statement2.execute(sqlCreate2);
  41. // table for paid payouts
  42. String sqlCreate3 = "CREATE TABLE IF NOT EXISTS paidPayouts ("
  43. + " payout_id INT NOT NULL,"
  44. + " server VARCHAR(24),"
  45. + " FOREIGN KEY (payout_id) REFERENCES pendingPayouts(id) ON DELETE CASCADE)";
  46. Statement statement3 = connection.createStatement();
  47. statement3.execute(sqlCreate3);
  48. } catch (SQLException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. /**
  53. * Saves the data on disc to file {@link #dataFile}
  54. */
  55. public void saveData() {
  56. playerDataMap.forEach(this::savePlayerData);
  57. }
  58. public void savePlayerData(UUID uuid, PlayerData playerData) {
  59. playerData.getPayoutDataMap().forEach((payoutID, payoutData) -> {
  60. try {
  61. PreparedStatement preparedStatement = connection
  62. .prepareStatement("REPLACE INTO playerData (uuid, payout_id receivedToday, secondsSinceLastPayout, lastPayoutDate) VALUES (?, ?, ?, ? ,?)");
  63. preparedStatement.setString(1, uuid.toString());
  64. preparedStatement.setInt(1, payoutID);
  65. preparedStatement.setDouble(2, payoutData.getReceivedToday());
  66. preparedStatement.setInt(3, payoutData.getSecondsSinceLastPayout());
  67. preparedStatement.setDate(4, new java.sql.Date(payoutData.getLastPayoutDate().getTime()));
  68. preparedStatement.execute();
  69. } catch (SQLException e) {
  70. e.printStackTrace();
  71. }
  72. });
  73. }
  74. @Override
  75. public void loadData() {
  76. }
  77. private PayoutData readPayoutData(ResultSet result) throws SQLException {
  78. double receivedToday = result.getDouble("receivedToday");
  79. int secondsOnline = result.getInt("secondsSinceLastPayout");
  80. Date date = new Date(result.getDate("lastPayoutDate").getTime());
  81. return new PayoutData(receivedToday, date, secondsOnline);
  82. }
  83. @Blocking
  84. public PlayerData getPlayerData(@NotNull Player player) {
  85. if(playerDataMap.containsKey(player.getUniqueId())) {
  86. return playerDataMap.get(player.getUniqueId());
  87. }
  88. try{
  89. PlayerData playerData = new PlayerData();
  90. // get data from DB
  91. ResultSet result = connection.prepareStatement("SELECT * FROM playerData WHERE uuid='" + player.getUniqueId() + "'").executeQuery();
  92. while(result.next()) {
  93. UUID uuid = UUID.fromString(result.getString("uuid"));
  94. int payoutID = result.getInt("payout_id");
  95. PayoutData payoutData = this.readPayoutData(result);
  96. playerData.getPayoutDataMap().put(payoutID, payoutData);
  97. playerDataMap.put(uuid, playerData);
  98. }
  99. } catch (SQLException e) {
  100. e.printStackTrace();
  101. }
  102. return playerDataMap.get(player.getUniqueId());
  103. }
  104. public void createPendingPayout(Player player) {
  105. try {
  106. PreparedStatement preparedStatement = connection
  107. .prepareStatement("INSERT INTO pendingPayouts (uuid) VALUES (?)");
  108. preparedStatement.setString(1, player.getUniqueId().toString());
  109. preparedStatement.execute();
  110. } catch (SQLException e) {
  111. e.printStackTrace();
  112. }
  113. }
  114. private String getServerName() {
  115. return Bukkit.getServer().getWorlds().get(0).getUID().toString().substring(0,16) + ":" + Bukkit.getServer().getPort();
  116. }
  117. public List<Integer> getPendingPayouts(Date dateFrom, Player player) {
  118. List<Integer> pendingPayouts = new ArrayList<>();
  119. try{
  120. //ResultSet result = connection.prepareStatement("SELECT * FROM `pendingPayouts` WHERE NOT EXISTS (SELECT * FROM paidPayouts WHERE server='" + this.getServerName() + "' AND pendingPayouts.id = paidPayouts.payout_id) AND uuid='" + player.getUniqueId() + "';").executeQuery();
  121. PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `pendingPayouts` WHERE uuid=? AND date>?");
  122. preparedStatement.setString(1, player.getUniqueId().toString());
  123. preparedStatement.setTimestamp(2, new Timestamp(dateFrom.getTime()));
  124. ResultSet result = preparedStatement.executeQuery();
  125. while(result.next()) {
  126. int id = result.getInt("id");
  127. pendingPayouts.add(id);
  128. }
  129. } catch (SQLException e) {
  130. e.printStackTrace();
  131. }
  132. return pendingPayouts;
  133. }
  134. }