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 Connection _connection = null; private String _connectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; 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(address, updated, players, maxPlayers, ram, maxRam) values(?, 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() { ResultSet resultSet = null; PreparedStatement preparedStatement = null; PreparedStatement preparedStatementRetrieve = null; PreparedStatement preparedStatementInsert = null; try { if (_connection == null || _connection.isClosed()) _connection = DriverManager.getConnection(_connectionString, _userName, _password); // Create table preparedStatement = _connection.prepareStatement(CREATE_TABLE); preparedStatement.execute(); // Retrieve id preparedStatementRetrieve = _connection.prepareStatement(RETRIEVE_ID); preparedStatementRetrieve.setString(1, _address); resultSet = preparedStatementRetrieve.executeQuery(); while (resultSet.next()) { _id = resultSet.getInt("id"); } // Insert if not there if (_id == -1) { 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.close(); resultSet = preparedStatementInsert.getGeneratedKeys(); if (resultSet.next()) { _id = resultSet.getInt(1); System.out.println("id = " + _id); } } } catch (Exception exception) { exception.printStackTrace(); } finally { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (preparedStatementRetrieve != null) { try { preparedStatementRetrieve.close(); } catch (SQLException e) { e.printStackTrace(); } } if (preparedStatementInsert != null) { try { preparedStatementInsert.close(); } catch (SQLException e) { e.printStackTrace(); } } if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } } public boolean updatePlayerCountInDatabase(int players) { PreparedStatement preparedStatement = null; try { if (_connection == null || _connection.isClosed()) _connection = DriverManager.getConnection(_connectionString, _userName, _password); 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(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } return updatePlayerCountInDatabase(players); } finally { if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } } } public PlayerTotalData retrievePlayerCount() { PlayerTotalData playerData = new PlayerTotalData(); ResultSet resultSet = null; PreparedStatement preparedStatement = null; try { if (_connection == null || _connection.isClosed()) _connection = DriverManager.getConnection(_connectionString, _userName, _password); preparedStatement = _connection.prepareStatement(RETRIEVE_PLAYER_COUNT); 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 (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } } return playerData; } }