97c8573926
Changed tracking to async logging so it doesn't stop players from connecting if stats is down or slow.
258 lines
6.4 KiB
Java
258 lines
6.4 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 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();
|
|
}
|
|
}
|
|
}
|
|
|
|
System.out.println("Initialized PlayerCount.");
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|