3999f80a79
Optimized lobby balancing based on connects per second. Added Pet deactivation. Possibly fixed asynchronous pet spawning as well. TODO : Realized we are doing a lot of async stuff....stupid jon jon.
189 lines
5.1 KiB
Java
189 lines
5.1 KiB
Java
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;
|
|
}
|
|
}
|