Mineplex2018-withcommit/Plugins/Mineplex.ServerStatifier/src/mineplex/serverstatifier/StatusSnapshotRepository.java

233 lines
6.6 KiB
Java

package mineplex.serverstatifier;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class StatusSnapshotRepository
{
private String _serverStatusConnectionString = "jdbc:mysql://db.mineplex.com:3306/ServerStatus";
private String _userName = "root";
private String _password = "tAbechAk3wR7tuTh";
private String _bungeeConnectionString = "jdbc:mysql://db.mineplex.com:3306/BungeeServers";
private static String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS ServerStatus (id INT NOT NULL AUTO_INCREMENT, serverName VARCHAR(256), serverGroup VARCHAR(256), address VARCHAR(256), port VARCHAR(11), updated LONG, lastTimeWithPlayers LONG, motd VARCHAR(256), players INT, maxPlayers INT, tps INT, ram INT, maxRam INT, PRIMARY KEY (id));";
private static String CREATE_DYNAMIC_TABLE = "CREATE TABLE IF NOT EXISTS DynamicServers (id INT NOT NULL AUTO_INCREMENT, serverName VARCHAR(256), address VARCHAR(256), privateAddress VARCHAR(256), US BOOLEAN NOT NULL DEFAULT 'true', PRIMARY KEY (id));";
private static String RETRIEVE_SERVERGROUP_STATUSES = "SELECT ServerStatus.serverName, DynamicServers.US, serverGroup, motd, DynamicServers.address, ServerStatus.address, ServerStatus.port, players, maxPlayers, case when TIME_TO_SEC(TIMEDIFF(now(), ServerStatus.lastTimeWithPlayers)) > 300 then 1 else 0 end as empty, now(), updated FROM ServerStatus INNER JOIN DynamicServers ON ServerStatus.address = DynamicServers.privateAddress";
private static String RETRIEVE_BUNGEE_STATUSES = "SELECT address, US, players, maxPlayers FROM BungeeServers WHERE TIME_TO_SEC(TIMEDIFF(now(), updated)) < 15";
public static Connection serverStatusConnection;
public static Connection bungeeConnection;
public void initialize()
{
PreparedStatement preparedStatement = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
if (serverStatusConnection == null || serverStatusConnection.isClosed())
serverStatusConnection = DriverManager.getConnection(_serverStatusConnectionString, _userName, _password);
// Create table
preparedStatement = serverStatusConnection.prepareStatement(CREATE_TABLE);
preparedStatement.execute();
}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
if (preparedStatement != null)
{
try
{
preparedStatement.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
preparedStatement = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
// Create table
preparedStatement = serverStatusConnection.prepareStatement(CREATE_DYNAMIC_TABLE);
preparedStatement.execute();
}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
if (preparedStatement != null)
{
try
{
preparedStatement.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
}
public List<BungeeStatusData> retrieveBungeeStatuses()
{
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
List<BungeeStatusData> bungeeData = new ArrayList<BungeeStatusData>();
try
{
if (bungeeConnection == null || bungeeConnection.isClosed())
bungeeConnection = DriverManager.getConnection(_bungeeConnectionString, _userName, _password);
preparedStatement = bungeeConnection.prepareStatement(RETRIEVE_BUNGEE_STATUSES);
resultSet = preparedStatement.executeQuery();
while (resultSet.next())
{
BungeeStatusData data = new BungeeStatusData();
data.Address = resultSet.getString(1);
data.US = resultSet.getBoolean(2);
data.Players = resultSet.getInt(3);
data.MaxPlayers = resultSet.getInt(4);
bungeeData.add(data);
}
}
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 bungeeData;
}
public HashMap<Boolean, HashMap<String, GroupStatusData>> retrieveGroupStatusData()
{
ResultSet resultSet = null;
PreparedStatement preparedStatement = null;
HashMap<Boolean, HashMap<String, GroupStatusData>> groupData = new HashMap<Boolean, HashMap<String, GroupStatusData>>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
groupData.put(true, new HashMap<String, GroupStatusData>());
groupData.put(false, new HashMap<String, GroupStatusData>());
try
{
if (serverStatusConnection == null || serverStatusConnection.isClosed())
serverStatusConnection = DriverManager.getConnection(_serverStatusConnectionString, _userName, _password);
preparedStatement = serverStatusConnection.prepareStatement(RETRIEVE_SERVERGROUP_STATUSES);
resultSet = preparedStatement.executeQuery();
while (resultSet.next())
{
ServerStatusData serverStatusData = new ServerStatusData();
serverStatusData.Name = resultSet.getString(1);
serverStatusData.US = resultSet.getBoolean(2);
String serverGroup = resultSet.getString(3);
serverStatusData.Motd = resultSet.getString(4);
serverStatusData.Address = resultSet.getString(5);
serverStatusData.PrivateAddress = resultSet.getString(6);
serverStatusData.Port = Integer.parseInt(resultSet.getString(7));
serverStatusData.Players = resultSet.getInt(8);
serverStatusData.MaxPlayers = resultSet.getInt(9);
serverStatusData.Empty = resultSet.getBoolean(10);
if (!groupData.get(serverStatusData.US).containsKey(serverGroup))
{
groupData.get(serverStatusData.US).put(serverGroup, new GroupStatusData());
}
long current = dateFormat.parse(resultSet.getString(11)).getTime();
long updated = dateFormat.parse(resultSet.getString(12)).getTime();
if (current - updated < 15000)
groupData.get(serverStatusData.US).get(serverGroup).addServer(serverStatusData);
}
}
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 groupData;
}
}