Files
Staff-OG/src/main/java/uk/hotten/staffog/data/DatabaseManager.java
T
Gxorge 8e2f36b06b Chat Report changes + allow either mariadb or mysql
Chat report will now actually create a report, along with an export of chat messages from the last two minutes.
2023-05-31 22:21:27 +01:00

483 lines
18 KiB
Java

package uk.hotten.staffog.data;
import lombok.Getter;
import org.bukkit.plugin.java.JavaPlugin;
import org.jooq.DSLContext;
import org.jooq.impl.DSL;
import uk.hotten.staffog.punish.data.PunishType;
import uk.hotten.staffog.utils.Console;
import java.sql.*;
import static uk.hotten.staffog.data.jooq.Tables.STAFFOG_STAT;
public class DatabaseManager {
@Getter private JavaPlugin plugin;
@Getter private static DatabaseManager instance;
private String driver, driverUrl, host, username, password, database;
private int port;
public DatabaseManager(JavaPlugin plugin) {
this.plugin = plugin;
instance = this;
String sqlType = plugin.getConfig().getString("sqlType");
if (sqlType == null) {
Console.error("NO SQL TYPE SELECTED. DEFAULTING TO MYSQL.");
driver = "com.mysql.jdbc.Driver";
driverUrl = "mysql";
} else {
if (sqlType.equalsIgnoreCase("mysql")) {
driver = "com.mysql.jdbc.Driver";
driverUrl = "mysql";
} else if (sqlType.equals("mariadb")) {
driver = "org.mariadb.jdbc.Driver";
driverUrl = "mariadb";
} else {
Console.error("INVALID SQL TYPE, PLEASE USE EITHER MYSQL OR MARIADB. DEFAULTING TO MYSQL.");
driver = "com.mysql.jdbc.Driver";
driverUrl = "mysql";
}
}
host = plugin.getConfig().getString("sqlHost");
username = plugin.getConfig().getString("sqlUsername");
password = plugin.getConfig().getString("sqlPassword");
database = plugin.getConfig().getString("sqlDatabase");
port = plugin.getConfig().getInt("sqlPort");
plugin.getServer().getPluginManager().registerEvents(new DataEventListener(), plugin);
for (PunishType pt : PunishType.values()) checkPunishmentTable(pt.getTable());
checkKickTable();
checkNameHistoryTable();
checkTaskTable();
checkStatTable();
checkWebTable();
checkLinkCodeTable();
checkStaffIpTable();
checkAuditTable();
checkAppealTable();
checkReportTable();
checkChatReportTable();
}
public Connection createConnection() throws SQLException, ClassNotFoundException {
synchronized (this) {
Class.forName(driver);
return DriverManager.getConnection("jdbc:" + driverUrl + "://" + host + ":" + port + "/" + database + "?userSSL=false", username, password);
}
}
private void checkPunishmentTable(String table) {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, table, new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `" + table + "` (" +
" `id` bigint(20) NOT NULL AUTO_INCREMENT," +
" `uuid` varchar(36) NOT NULL," +
" `reason` varchar(2048) NOT NULL," +
" `by_uuid` varchar(36) DEFAULT NULL," +
" `by_name` varchar(128) DEFAULT NULL," +
" `removed_uuid` varchar(36) DEFAULT NULL," +
" `removed_name` varchar(128) DEFAULT NULL," +
" `removed_reason` varchar(2048) DEFAULT NULL," +
" `removed_time` bigint(20) DEFAULT NULL," +
" `time` bigint(20) NOT NULL," +
" `until` bigint(20) NOT NULL," +
" `active` bit(1) NOT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created '" + table + "' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check '" + table + "' table.");
e.printStackTrace();
}
}
private void checkKickTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_kick", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_kick` (" +
" `id` bigint(20) NOT NULL AUTO_INCREMENT," +
" `uuid` varchar(36) NOT NULL," +
" `reason` varchar(2048) NOT NULL," +
" `by_uuid` varchar(36) NOT NULL," +
" `by_name` varchar(128) NOT NULL," +
" `time` bigint(20) NOT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_kick' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_kick' table.");
e.printStackTrace();
}
}
private void checkNameHistoryTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_history", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_history` (" +
" `id` int NOT NULL AUTO_INCREMENT," +
" `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," +
" `name` varchar(16) NOT NULL," +
" `uuid` varchar(36) NOT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_history' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_history' table.");
e.printStackTrace();
}
}
private void checkTaskTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_task", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_task` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT," +
" `task` varchar(2048) NOT NULL," +
" `data` varchar(2048) NOT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_task' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_task' table.");
e.printStackTrace();
}
}
private void checkStatTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_stat", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_stat` (" +
" `name` varchar(2048) NOT NULL," +
" `stat` varchar(2048) NOT NULL," +
" UNIQUE KEY `name` (`name`) USING HASH" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_stat' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_stat' table.");
e.printStackTrace();
}
}
private boolean doesStatIncludeEntry(String entry) {
try (Connection connection = createConnection()) {
DSLContext dsl = DSL.using(connection);
return dsl.fetchExists(dsl.selectFrom(STAFFOG_STAT)
.where(STAFFOG_STAT.NAME.eq(entry)));
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public void setStatEntry(String entry, String stat) {
try (Connection connection = createConnection()) {
DSLContext dsl = DSL.using(connection);
if (!doesStatIncludeEntry(entry)) {
dsl.insertInto(STAFFOG_STAT)
.set(STAFFOG_STAT.NAME, entry)
.set(STAFFOG_STAT.STAT, stat)
.execute();
} else {
dsl.update(STAFFOG_STAT)
.set(STAFFOG_STAT.STAT, stat)
.where(STAFFOG_STAT.NAME.eq(entry))
.execute();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void checkWebTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_web", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_web` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT," +
" `username` varchar(128) NOT NULL," +
" `uuid` varchar(36) NOT NULL," +
" `password` varchar(2048) NOT NULL," +
" `active` bit(1) NOT NULL DEFAULT b'1'," +
" `admin` bit(1) NOT NULL," +
" PRIMARY KEY (`id`)," +
" UNIQUE KEY `username` (`username`,`uuid`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_web' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_web' table.");
e.printStackTrace();
}
}
private void checkLinkCodeTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_linkcode", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_linkcode` (" +
" `uuid` varchar(36) NOT NULL," +
" `code` varchar(5) NOT NULL," +
" `admin` bit(1) NOT NULL," +
" UNIQUE KEY `uuid` (`uuid`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_linkcode' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_linkcode' table.");
e.printStackTrace();
}
}
private void checkStaffIpTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_staffip", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_staffip` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT," +
" `ip` varchar(15) NOT NULL," +
" `uuid` varchar(36) NOT NULL," +
" `initial` bit(1) NOT NULL," +
" `panel_acknowledged` bit(1) NOT NULL," +
" `panel_verified` bit(1) NOT NULL," +
" `game_verified` bit(1) NOT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_staffip' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_staffip' table.");
e.printStackTrace();
}
}
private void checkAuditTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_audit", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_audit` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT," +
" `type` varchar(2048) NOT NULL," +
" `data` varchar(2048) NOT NULL," +
" `time` bigint(20) NOT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_audit' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_audit' table.");
e.printStackTrace();
}
}
private void checkAppealTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_appeal", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_appeal` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT," +
" `uuid` varchar(36) NOT NULL," +
" `time` bigint(20) NOT NULL," +
" `type` varchar(128) NOT NULL," +
" `pid` int(11) NOT NULL," +
" `reason` varchar(2048) NOT NULL," +
" `open` bit(1) NOT NULL DEFAULT b'1'," +
" `assigned` varchar(36) DEFAULT NULL," +
" `verdict` bit(1) DEFAULT NULL," +
" `verdict_time` bigint(20) DEFAULT NULL," +
" `comment` varchar(2048) DEFAULT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_appeal' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_appeal' table.");
e.printStackTrace();
}
}
private void checkReportTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_report", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_report` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT," +
" `uuid` varchar(36) NOT NULL," +
" `by_uuid` varchar(36) NOT NULL," +
" `time` bigint(20) NOT NULL," +
" `type` varchar(128) NOT NULL," +
" `reason` varchar(2048) NOT NULL," +
" `crid` int(11) DEFAULT NULL," +
" `open` bit(1) NOT NULL DEFAULT b'1'," +
" `assigned` varchar(36) DEFAULT NULL," +
" `verdict` bit(1) DEFAULT NULL," +
" `verdict_time` bigint(20) DEFAULT NULL," +
" `comment` varchar(2048) DEFAULT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_report' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_report' table.");
e.printStackTrace();
}
}
private void checkChatReportTable() {
try (Connection connection = createConnection()) {
DatabaseMetaData meta = connection.getMetaData();
ResultSet resultSet = meta.getTables(null, null, "staffog_chatreport", new String[] {"TABLE"});
if (resultSet.next()) {
return;
}
// Table does not exist
Statement statement = connection.createStatement();
String sql = "CREATE TABLE `staffog_chatreport` (" +
" `id` int(11) NOT NULL AUTO_INCREMENT," +
" `uuid` varchar(36) NOT NULL," +
" `by_uuid` varchar(36) NOT NULL," +
" `time` bigint(20) NOT NULL," +
" `messages` varchar(2048) NOT NULL," +
" PRIMARY KEY (`id`)" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4";
statement.executeUpdate(sql);
Console.info("Created 'staffog_chatreport' table, was missing.");
} catch (Exception e) {
Console.error("Failed to check 'staffog_chatreport' table.");
e.printStackTrace();
}
}
}