MySQLPluginData.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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 playerData ("
  25. + " uuid VARCHAR(36) PRIMARY KEY,"
  26. + " receivedToday DOUBLE,"
  27. + " secondsSinceLastPayout INTEGER,"
  28. + " lastPayoutDate DATE)";
  29. Statement statement = connection.createStatement();
  30. statement.execute(sqlCreate);
  31. // table for tracking pending payouts for other servers
  32. String sqlCreate2 = "CREATE TABLE IF NOT EXISTS pendingPayouts ("
  33. + " id INT NOT NULL AUTO_INCREMENT,"
  34. + " uuid VARCHAR(36),"
  35. + " date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,"
  36. + " PRIMARY KEY (id))";
  37. Statement statement2 = connection.createStatement();
  38. statement2.execute(sqlCreate2);
  39. // table for paid payouts
  40. String sqlCreate3 = "CREATE TABLE IF NOT EXISTS paidPayouts ("
  41. + " payout_id INT NOT NULL,"
  42. + " server VARCHAR(24),"
  43. + " FOREIGN KEY (payout_id) REFERENCES pendingPayouts(id) ON DELETE CASCADE)";
  44. Statement statement3 = connection.createStatement();
  45. statement3.execute(sqlCreate3);
  46. } catch (SQLException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. /**
  51. * Saves the data on disc to file {@link #dataFile}
  52. */
  53. public void saveData() {
  54. playerDataMap.forEach(this::savePlayerData);
  55. }
  56. public void savePlayerData(UUID uuid, PlayerData playerData) {
  57. try {
  58. PreparedStatement preparedStatement = connection
  59. .prepareStatement("REPLACE INTO playerData (uuid, receivedToday, secondsSinceLastPayout, lastPayoutDate) VALUES (?, ?, ? ,?)");
  60. preparedStatement.setString(1, uuid.toString());
  61. preparedStatement.setDouble(2, playerData.getReceivedToday());
  62. preparedStatement.setInt(3, playerData.getSecondsSinceLastPayout());
  63. preparedStatement.setDate(4, new java.sql.Date(playerData.getLastPayoutDate().getTime()));
  64. preparedStatement.execute();
  65. } catch (SQLException e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. @Override
  70. public void loadData() {
  71. }
  72. private AbstractMap.Entry<UUID, PlayerData> readPlayerData(ResultSet result) throws SQLException {
  73. UUID uuid = UUID.fromString(result.getString("uuid"));
  74. double receivedToday = result.getDouble("receivedToday");
  75. int secondsOnline = result.getInt("secondsSinceLastPayout");
  76. Date date = new Date(result.getDate("lastPayoutDate").getTime());
  77. return new AbstractMap.SimpleEntry<>(uuid, new PlayerData(receivedToday, date, secondsOnline));
  78. }
  79. @Blocking
  80. public PlayerData getPlayerData(@NotNull Player player) {
  81. if(playerDataMap.containsKey(player.getUniqueId())) {
  82. return playerDataMap.get(player.getUniqueId());
  83. }
  84. try{
  85. // get data from DB
  86. ResultSet result = connection.prepareStatement("SELECT * FROM playerData WHERE uuid='" + player.getUniqueId() + "'").executeQuery();
  87. if(result.next()) {
  88. AbstractMap.Entry<UUID, PlayerData> data = this.readPlayerData(result);
  89. playerDataMap.put(data.getKey(), data.getValue());
  90. } else {
  91. // no entry, create new object
  92. playerDataMap.put(player.getUniqueId(), new PlayerData(0, new java.util.Date(), 0));
  93. }
  94. } catch (SQLException e) {
  95. e.printStackTrace();
  96. }
  97. return playerDataMap.get(player.getUniqueId());
  98. }
  99. public void createPendingPayout(Player player) {
  100. try {
  101. PreparedStatement preparedStatement = connection
  102. .prepareStatement("INSERT INTO pendingPayouts (uuid) VALUES (?)");
  103. preparedStatement.setString(1, player.getUniqueId().toString());
  104. preparedStatement.execute();
  105. } catch (SQLException e) {
  106. e.printStackTrace();
  107. }
  108. }
  109. private String getServerName() {
  110. return Bukkit.getServer().getWorlds().get(0).getUID().toString().substring(0,16) + ":" + Bukkit.getServer().getPort();
  111. }
  112. public List<Integer> getPendingPayouts(Date dateFrom, Player player) {
  113. List<Integer> pendingPayouts = new ArrayList<>();
  114. try{
  115. //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();
  116. PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `pendingPayouts` WHERE uuid=? AND date>?");
  117. preparedStatement.setString(1, player.getUniqueId().toString());
  118. preparedStatement.setTimestamp(2, new Timestamp(dateFrom.getTime()));
  119. ResultSet result = preparedStatement.executeQuery();
  120. while(result.next()) {
  121. int id = result.getInt("id");
  122. pendingPayouts.add(id);
  123. }
  124. } catch (SQLException e) {
  125. e.printStackTrace();
  126. }
  127. return pendingPayouts;
  128. }
  129. }