package mineplex.bungee.playerCount; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class PlayerCountRepository { private String _connectionString = "jdbc:mysql://sql.mineplex.com:3306/BungeeServers"; private String _userName = "root"; private String _password = "tAbechAk3wR7tuTh"; private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS BungeeServers (id INT NOT NULL AUTO_INCREMENT, address VARCHAR(256), updated LONG, players INT, maxPlayers INT, ram INT, maxRam INT, PRIMARY KEY (id));"; private static String INSERT_PLAYER_COUNT = "INSERT INTO BungeeServers values(default, ?, now(), ?, ?, ?, ?);"; private static String UPDATE_PLAYER_COUNT = "UPDATE BungeeServers SET updated = now(), players = ?, maxPlayers = ?, ram = ?, maxRam = ? WHERE id = ?;"; private static String RETRIEVE_ID = "SELECT id FROM BungeeServers WHERE address = ?;"; private static String RETRIEVE_PLAYER_COUNT = "SELECT SUM(players) AS playerCount, SUM(maxPlayers) AS maxPlayerCount FROM BungeeServers WHERE TIME_TO_SEC(TIMEDIFF(now(), BungeeServers.updated)) < 10;"; private int _id = -1; private String _address; private int _maxPlayers = 0; public PlayerCountRepository(String address, int maxPlayers) { _address = address; _maxPlayers = maxPlayers; } public void initialize() { Connection connection = null; try { connection = DriverManager.getConnection(_connectionString, _userName, _password); // Create table PreparedStatement preparedStatement = connection.prepareStatement(CREATE_TABLE); preparedStatement.execute(); // Retrieve id PreparedStatement preparedStatementRetrieve = connection.prepareStatement(RETRIEVE_ID); preparedStatementRetrieve.setString(1, _address); ResultSet resultSet = preparedStatementRetrieve.executeQuery(); while (resultSet.next()) { _id = resultSet.getInt("id"); } // Insert if not there if (_id == -1) { PreparedStatement preparedStatementInsert = connection.prepareStatement(INSERT_PLAYER_COUNT, Statement.RETURN_GENERATED_KEYS); preparedStatementInsert.setString(1, _address); preparedStatementInsert.setInt(2, 0); preparedStatementInsert.setInt(3, _maxPlayers); preparedStatementInsert.setInt(4, (int) ((Runtime.getRuntime().maxMemory() - Runtime.getRuntime().freeMemory()) / 1048576)); preparedStatementInsert.setInt(5, (int) (Runtime.getRuntime().maxMemory() / 1048576)); int affectedRows = preparedStatementInsert.executeUpdate(); if (affectedRows == 0) { throw new SQLException("Creating bungee server failed, no rows affected."); } resultSet = preparedStatementInsert.getGeneratedKeys(); if (resultSet.next()) { _id = resultSet.getInt(1); System.out.println("id = " + _id); } } } catch (Exception exception) { exception.printStackTrace(); } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } public boolean updatePlayerCountInDatabase(int players) { Connection connection = null; try { connection = DriverManager.getConnection(_connectionString, _userName, _password); PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_PLAYER_COUNT, Statement.RETURN_GENERATED_KEYS); preparedStatement.setInt(1, players); preparedStatement.setInt(2, _maxPlayers); preparedStatement.setInt(3, (int) ((Runtime.getRuntime().maxMemory() - Runtime.getRuntime().freeMemory()) / 1048576)); preparedStatement.setInt(4, (int) (Runtime.getRuntime().maxMemory() / 1048576)); preparedStatement.setInt(5, _id); int affectedRows = preparedStatement.executeUpdate(); if (affectedRows == 0) { throw new SQLException("Updating bungee server player count failed, no rows affected."); } return true; } catch (Exception exception) { exception.printStackTrace(); return false; } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } public PlayerTotalData retrievePlayerCount() { Connection connection = null; PlayerTotalData playerData = new PlayerTotalData(); try { connection = DriverManager.getConnection(_connectionString, _userName, _password); PreparedStatement preparedStatement = connection.prepareStatement(RETRIEVE_PLAYER_COUNT); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { playerData.CurrentPlayers = resultSet.getInt(1); playerData.MaxPlayers = resultSet.getInt(2); return playerData; } } catch (Exception exception) { exception.printStackTrace(); } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } return playerData; } }