From 989991e05602c0ce150bc66b53ac45edcbbc79c4 Mon Sep 17 00:00:00 2001 From: tobias Date: Wed, 15 May 2024 21:54:35 +0200 Subject: [PATCH] Added h2 support --- .../options/FactionOption.java | 33 ----- .../options/FactionPermissionOption.java | 49 ------- .../options/FactionPriorityOption.java | 51 -------- .../options/FactionRankOption.java | 51 -------- improved-factions-base/pom.xml | 13 +- .../improvedfactions/DatabaseConnector.kt | 123 +++++++++++------- .../improvedfactions/utils/ConfigUtils.kt | 2 +- .../src/main/resources/config.yml | 1 + 8 files changed, 88 insertions(+), 235 deletions(-) delete mode 100644 improved-factions-base/options/FactionOption.java delete mode 100644 improved-factions-base/options/FactionPermissionOption.java delete mode 100644 improved-factions-base/options/FactionPriorityOption.java delete mode 100644 improved-factions-base/options/FactionRankOption.java diff --git a/improved-factions-base/options/FactionOption.java b/improved-factions-base/options/FactionOption.java deleted file mode 100644 index d4e4cd59..00000000 --- a/improved-factions-base/options/FactionOption.java +++ /dev/null @@ -1,33 +0,0 @@ -package io.github.toberocat.improvedfactions.utils.options; - -import io.github.toberocat.improvedFactions.core.player.CommandSender; -import io.github.toberocat.improvedFactions.core.player.FactionPlayer; -import io.github.toberocat.improvedFactions.core.translator.PlaceholderBuilder; -import io.github.toberocat.improvedFactions.core.utils.command.exceptions.CommandException; -import org.jetbrains.annotations.NotNull; - -public class FactionOption implements PlayerOption { - private final boolean needFaction; - - public FactionOption(boolean needFaction) { - this.needFaction = needFaction; - } - - @Override - public @NotNull String[] executePlayer(@NotNull FactionPlayer sender, @NotNull String[] args) throws CommandException { - if ((sender.getFactionRegistry() == null) == needFaction) { - throw new CommandException("exceptions." + (needFaction ? "need-faction" : "cant-be-in-faction"), - () -> new PlaceholderBuilder() - .placeholder("player", sender) - .getPlaceholders()); - } - return args; - } - - @Override - public boolean show(@NotNull CommandSender sender, @NotNull String[] args) { - if (!(sender instanceof FactionPlayer player)) - return false; - return (player.getFactionRegistry() == null) != needFaction; - } -} diff --git a/improved-factions-base/options/FactionPermissionOption.java b/improved-factions-base/options/FactionPermissionOption.java deleted file mode 100644 index 941e6a38..00000000 --- a/improved-factions-base/options/FactionPermissionOption.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.github.toberocat.improvedfactions.utils.options; - -import io.github.toberocat.improvedFactions.core.exceptions.faction.FactionNotInStorage; -import io.github.toberocat.improvedFactions.core.exceptions.faction.PlayerHasNoFactionException; -import io.github.toberocat.improvedFactions.core.permission.Permission; -import io.github.toberocat.improvedFactions.core.player.CommandSender; -import io.github.toberocat.improvedFactions.core.player.FactionPlayer; -import io.github.toberocat.improvedFactions.core.translator.PlaceholderBuilder; -import io.github.toberocat.improvedFactions.core.utils.command.exceptions.CommandException; -import org.jetbrains.annotations.NotNull; - -public class FactionPermissionOption implements PlayerOption { - private final Permission permission; - - public FactionPermissionOption(@NotNull Permission permission) { - this.permission = permission; - } - - @Override - public @NotNull String[] executePlayer(@NotNull FactionPlayer player, - @NotNull String[] args) throws CommandException { - try { - if (!checkPermission(player)) - throw new CommandException("exceptions.permissions-missing", () -> new PlaceholderBuilder() - .placeholder("player", player) - .placeholder("permission", permission.label()) - .getPlaceholders()); - } catch (FactionNotInStorage | PlayerHasNoFactionException e) { - throw new CommandException(e); - } - return args; - } - - @Override - public boolean show(@NotNull CommandSender sender, @NotNull String[] args) { - if (!(sender instanceof FactionPlayer player)) - return false; - try { - return checkPermission(player); - } catch (FactionNotInStorage | PlayerHasNoFactionException e) { - return false; - } - } - - private boolean checkPermission(@NotNull FactionPlayer player) - throws FactionNotInStorage, PlayerHasNoFactionException { - return player.getFaction().hasPermission(permission, player.getRank()); - } -} diff --git a/improved-factions-base/options/FactionPriorityOption.java b/improved-factions-base/options/FactionPriorityOption.java deleted file mode 100644 index d375e8a2..00000000 --- a/improved-factions-base/options/FactionPriorityOption.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.github.toberocat.improvedfactions.utils.options; - -import io.github.toberocat.improvedFactions.core.exceptions.faction.FactionNotInStorage; -import io.github.toberocat.improvedFactions.core.exceptions.faction.PlayerHasNoFactionException; -import io.github.toberocat.improvedFactions.core.faction.components.rank.Rank; -import io.github.toberocat.improvedFactions.core.player.CommandSender; -import io.github.toberocat.improvedFactions.core.player.FactionPlayer; -import io.github.toberocat.improvedFactions.core.translator.PlaceholderBuilder; -import io.github.toberocat.improvedFactions.core.utils.command.exceptions.CommandException; -import org.jetbrains.annotations.NotNull; - -public class FactionPriorityOption implements PlayerOption { - private final int minPriority; - - public FactionPriorityOption(int minPriority) { - this.minPriority = minPriority; - } - - @Override - public @NotNull String[] executePlayer(@NotNull FactionPlayer player, - @NotNull String[] args) throws CommandException { - try { - Rank rank = player.getRank(); - if (!checkRank(player)) - throw new CommandException("exceptions.missing-priority", () -> new PlaceholderBuilder() - .placeholder("player", player) - .placeholder("min-priority", minPriority) - .placeholder("player-priority", Rank.getPriority(rank)) - .getPlaceholders()); - } catch (FactionNotInStorage | PlayerHasNoFactionException e) { - throw new CommandException(e); - } - return args; - } - - @Override - public boolean show(@NotNull CommandSender sender, @NotNull String[] args) { - if (!(sender instanceof FactionPlayer player)) - return false; - try { - return checkRank(player); - } catch (FactionNotInStorage | PlayerHasNoFactionException e) { - return false; - } - } - - private boolean checkRank(@NotNull FactionPlayer player) - throws FactionNotInStorage, PlayerHasNoFactionException { - return Rank.getPriority(player.getRank()) >= minPriority; - } -} diff --git a/improved-factions-base/options/FactionRankOption.java b/improved-factions-base/options/FactionRankOption.java deleted file mode 100644 index 3fc51da0..00000000 --- a/improved-factions-base/options/FactionRankOption.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.github.toberocat.improvedfactions.utils.options; - -import io.github.toberocat.improvedFactions.core.exceptions.faction.FactionNotInStorage; -import io.github.toberocat.improvedFactions.core.exceptions.faction.PlayerHasNoFactionException; -import io.github.toberocat.improvedFactions.core.faction.components.rank.Rank; -import io.github.toberocat.improvedFactions.core.player.CommandSender; -import io.github.toberocat.improvedFactions.core.player.FactionPlayer; -import io.github.toberocat.improvedFactions.core.translator.PlaceholderBuilder; -import io.github.toberocat.improvedFactions.core.utils.command.exceptions.CommandException; -import org.jetbrains.annotations.NotNull; - -public class FactionRankOption implements PlayerOption { - private final @NotNull String rankId; - - public FactionRankOption(@NotNull String rankId) { - this.rankId = rankId; - } - - @Override - public @NotNull String[] executePlayer(@NotNull FactionPlayer player, - @NotNull String[] args) throws CommandException { - try { - Rank rank = player.getRank(); - if (!checkRank(player)) - throw new CommandException("exceptions.wrong-rank", () -> new PlaceholderBuilder() - .placeholder("player", player) - .placeholder("needed-rank", Rank.fromString(rankId)) - .placeholder("player-rank", rank) - .getPlaceholders()); - } catch (FactionNotInStorage | PlayerHasNoFactionException e) { - throw new CommandException(e); - } - return args; - } - - @Override - public boolean show(@NotNull CommandSender sender, @NotNull String[] args) { - if (!(sender instanceof FactionPlayer player)) - return false; - try { - return checkRank(player); - } catch (FactionNotInStorage | PlayerHasNoFactionException e) { - return false; - } - } - - private boolean checkRank(@NotNull FactionPlayer player) - throws FactionNotInStorage, PlayerHasNoFactionException { - return player.getRank().getRegistry().equals(rankId); - } -} diff --git a/improved-factions-base/pom.xml b/improved-factions-base/pom.xml index 20792171..93f461e7 100644 --- a/improved-factions-base/pom.xml +++ b/improved-factions-base/pom.xml @@ -27,10 +27,10 @@ ../server/plugins - 0.40.1 + 0.50.0 2.15.2 1.18.1-R0.1-SNAPSHOT - 3.43.0.0 + 3.45.3.0 3.0.3 0.4.0 be356f9253 @@ -42,6 +42,7 @@ 3.0.2 2.11.3 3.5 + 2.2.220 @@ -127,7 +128,6 @@ false - ${server.location}\${project.name}-${project.version}.jar org.bstats @@ -236,6 +236,13 @@ sqlite-jdbc ${sqlite-jdbc.version} + + + com.h2database + h2 + ${h2.version} + + com.jeff_media SpigotUpdateChecker diff --git a/improved-factions-base/src/main/kotlin/io/github/toberocat/improvedfactions/DatabaseConnector.kt b/improved-factions-base/src/main/kotlin/io/github/toberocat/improvedfactions/DatabaseConnector.kt index af8360df..0b460a0d 100644 --- a/improved-factions-base/src/main/kotlin/io/github/toberocat/improvedfactions/DatabaseConnector.kt +++ b/improved-factions-base/src/main/kotlin/io/github/toberocat/improvedfactions/DatabaseConnector.kt @@ -8,9 +8,9 @@ import io.github.toberocat.improvedfactions.permissions.FactionPermissions import io.github.toberocat.improvedfactions.ranks.FactionRankHandler import io.github.toberocat.improvedfactions.ranks.FactionRanks import io.github.toberocat.improvedfactions.user.FactionUsers +import io.github.toberocat.improvedfactions.utils.getEnum import io.github.toberocat.improvedfactions.utils.options.limit.PlayerUsageLimits import org.bukkit.configuration.file.FileConfiguration -import org.bukkit.plugin.java.JavaPlugin import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.SchemaUtils import org.jetbrains.exposed.sql.StdOutSqlLogger @@ -22,6 +22,74 @@ import java.sql.SQLException import java.sql.Statement import java.util.logging.Logger +enum class DatabaseType { + H2 { + override fun connect(plugin: ImprovedFactionsPlugin) = Database.connect( + "jdbc:h2:file:${plugin.dataFolder.absolutePath}/database.h2", driver = "org.h2.Driver" + ) + }, + SQLITE { + override fun connect(plugin: ImprovedFactionsPlugin) = Database.connect( + "jdbc:sqlite:${plugin.dataFolder.absolutePath}/database.sqlite", driver = "org.sqlite.JDBC" + ) + }, + MYSQL { + override fun connect(plugin: ImprovedFactionsPlugin): Database? { + val config = plugin.config + val logger = plugin.logger + + val host = config.getString("mysql.host") + val db = config.getString("mysql.database") + val user = config.getString("mysql.user") ?: "root" + val password = config.getString("mysql.password") ?: "1234" + val port = config.getInt("mysql.port") + + if (isMySQLServerReachable(host, port, user, password)) { + try { + val database = Database.connect( + "jdbc:mysql://$host:$port/$db", + driver = "com.mysql.cj.jdbc.Driver", + user = user, + password = password + ) + + logger.info("Successfully connected to MySQL") + return database + } catch (e: SQLException) { + logger.warning("Failed to connect to MySQL: ${e.message}") + } + } else { + throw IllegalArgumentException("MySqL server not reachable. Check credentials") + } + return null + } + + private fun isMySQLServerReachable( + host: String?, + port: Int, + username: String, + password: String + ): Boolean { + var connection: Connection? = null + + return try { + Class.forName("com.mysql.cj.jdbc.Driver") + val url = "jdbc:mysql://$host:$port" + connection = DriverManager.getConnection(url, username, password) + val statement: Statement = connection.createStatement() + val resultSet = statement.executeQuery("SELECT 1") + resultSet.next() + } catch (e: SQLException) { + false + } finally { + connection?.close() + } + } + }; + + abstract fun connect(plugin: ImprovedFactionsPlugin): Database?; +} + /** * Created: 04.08.2023 * @author Tobias Madlberger (Tobias) @@ -56,53 +124,14 @@ class DatabaseConnector(private val plugin: ImprovedFactionsPlugin) { } private fun connectDatabase(): Database { - val host = config.getString("mysql.host") - val db = config.getString("mysql.database") - val user = config.getString("mysql.user") ?: "root" - val password = config.getString("mysql.password") ?: "1234" - val port = config.getInt("mysql.port") - - if (isMySQLServerReachable(host, port, user, password)) { - try { - val database = Database.connect( - "jdbc:mysql://$host:$port/$db", - driver = "com.mysql.cj.jdbc.Driver", - user = user, - password = password - ) - - logger.info("Successfully connected to MySQL") - return database - } catch (e: SQLException) { - logger.warning("Failed to connect to MySQL: ${e.message}") - - } + val databaseType = config.getEnum("database").let { + if (it != null) + return@let it + logger.warning("No database specified. Using sqlite as default") + return@let DatabaseType.SQLITE } - logger.warning("Connection to MySQL server not possible. Falling back to SQLite...") - return Database.connect( - "jdbc:sqlite:${plugin.dataFolder.absolutePath}/database.sqlite", driver = "org.sqlite.JDBC" - ) - } - private fun isMySQLServerReachable( - host: String?, - port: Int, - username: String, - password: String - ): Boolean { - var connection: Connection? = null - - return try { - Class.forName("com.mysql.cj.jdbc.Driver") - val url = "jdbc:mysql://$host:$port" - connection = DriverManager.getConnection(url, username, password) - val statement: Statement = connection.createStatement() - val resultSet = statement.executeQuery("SELECT 1") - resultSet.next() - } catch (e: SQLException) { - false - } finally { - connection?.close() - } + logger.info("Using database $databaseType as database") + return databaseType.connect(plugin) ?: throw IllegalArgumentException("Database connection failed") } } \ No newline at end of file diff --git a/improved-factions-base/src/main/kotlin/io/github/toberocat/improvedfactions/utils/ConfigUtils.kt b/improved-factions-base/src/main/kotlin/io/github/toberocat/improvedfactions/utils/ConfigUtils.kt index cc686fdb..130a64b4 100644 --- a/improved-factions-base/src/main/kotlin/io/github/toberocat/improvedfactions/utils/ConfigUtils.kt +++ b/improved-factions-base/src/main/kotlin/io/github/toberocat/improvedfactions/utils/ConfigUtils.kt @@ -10,7 +10,7 @@ import kotlin.math.abs inline fun > ConfigurationSection.getEnum(path: String): T? = getString(path).getEnum() inline fun > String?.getEnum(): T? { - return enumValueOf(this ?: return null) + return enumValueOf(this?.uppercase() ?: return null) } fun ConfigurationSection.getUnsignedDouble(path: String, default: Double) = abs(getDouble(path, default)) \ No newline at end of file diff --git a/improved-factions-base/src/main/resources/config.yml b/improved-factions-base/src/main/resources/config.yml index b6710e94..0f63585e 100644 --- a/improved-factions-base/src/main/resources/config.yml +++ b/improved-factions-base/src/main/resources/config.yml @@ -5,6 +5,7 @@ update-checker: true # Configure a mysql connection. If no connection was established, the plugin uses sqlite. # This allows to use this plugin without a mysql server +database: "sqlite" # ImprovedFactions supports H2, SQLite and MySQL. H2 and SQLite are local databases mysql: host: "localhost" port: 3306