From 660c3c3098860e59119d3b17e45076099b3454fd Mon Sep 17 00:00:00 2001 From: Sophia Atkinson Date: Thu, 8 May 2025 17:31:54 -0700 Subject: [PATCH] add mysql support --- pom.xml | 2 +- .../pronouns/PronounsPlugin.java | 65 +++++++++++++------ src/main/resources/config.yml | 10 ++- src/main/resources/plugin.yml | 7 +- 4 files changed, 60 insertions(+), 24 deletions(-) diff --git a/pom.xml b/pom.xml index 88e052f..5eef2f8 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.sophiaatkinson PronounsPlaceholder - 1.0.2 + 1.0.3 jar PronounsPlaceholder diff --git a/src/main/java/com/sophiaatkinson/pronouns/PronounsPlugin.java b/src/main/java/com/sophiaatkinson/pronouns/PronounsPlugin.java index 73102cd..2958f88 100644 --- a/src/main/java/com/sophiaatkinson/pronouns/PronounsPlugin.java +++ b/src/main/java/com/sophiaatkinson/pronouns/PronounsPlugin.java @@ -10,6 +10,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; @@ -18,6 +19,7 @@ import org.bukkit.plugin.java.JavaPlugin; public class PronounsPlugin extends JavaPlugin { private Connection connection; + private boolean usingMySQL; private List blockedPronouns; private List pronounSuggestions; private final List errorLog = new ArrayList<>(); @@ -53,15 +55,27 @@ public class PronounsPlugin extends JavaPlugin { } private void initDatabase() { - try { - File dbFile = new File(getDataFolder(), "pronouns.db"); - if (!getDataFolder().exists()) getDataFolder().mkdirs(); + usingMySQL = getConfig().getBoolean("mysql.enabled", false); - String url = "jdbc:sqlite:" + dbFile.getAbsolutePath(); - connection = DriverManager.getConnection(url); + try { + if (usingMySQL) { + String host = getConfig().getString("mysql.host"); + int port = getConfig().getInt("mysql.port"); + String database = getConfig().getString("mysql.database"); + String user = getConfig().getString("mysql.user"); + String password = getConfig().getString("mysql.password"); + + String url = "jdbc:mysql://" + host + ":" + port + "/" + database + "?useSSL=false&autoReconnect=true"; + connection = DriverManager.getConnection(url, user, password); + } else { + File dbFile = new File(getDataFolder(), "pronouns.db"); + if (!getDataFolder().exists()) getDataFolder().mkdirs(); + String url = "jdbc:sqlite:" + dbFile.getAbsolutePath(); + connection = DriverManager.getConnection(url); + } Statement stmt = connection.createStatement(); - stmt.executeUpdate("CREATE TABLE IF NOT EXISTS pronouns (uuid TEXT PRIMARY KEY, pronouns TEXT);"); + stmt.executeUpdate("CREATE TABLE IF NOT EXISTS pronouns (uuid VARCHAR(36) PRIMARY KEY, pronouns TEXT);"); } catch (SQLException e) { errorLog.add("Database initialization error: " + e.getMessage()); e.printStackTrace(); @@ -81,9 +95,7 @@ public class PronounsPlugin extends JavaPlugin { } for (String blocked : blockedPronouns) { - if (pronouns.contains(blocked)) { - return; - } + if (pronouns.contains(blocked)) return; } try (PreparedStatement ps = connection.prepareStatement("REPLACE INTO pronouns (uuid, pronouns) VALUES (?, ?)")) { @@ -91,6 +103,18 @@ public class PronounsPlugin extends JavaPlugin { ps.setString(2, pronouns); ps.executeUpdate(); } catch (SQLException e) { + // Fallback for MySQL since REPLACE INTO isn't ideal for all cases + if (usingMySQL) { + try (PreparedStatement ps = connection.prepareStatement("INSERT INTO pronouns (uuid, pronouns) VALUES (?, ?) ON DUPLICATE KEY UPDATE pronouns = VALUES(pronouns)")) { + ps.setString(1, uuid.toString()); + ps.setString(2, pronouns); + ps.executeUpdate(); + return; + } catch (SQLException ex) { + errorLog.add("MySQL upsert error: " + ex.getMessage()); + ex.printStackTrace(); + } + } errorLog.add("Database update error: " + e.getMessage()); e.printStackTrace(); } @@ -109,18 +133,18 @@ public class PronounsPlugin extends JavaPlugin { } return null; } -public Map getAllPronouns() { - Map result = new java.util.HashMap<>(); - try (Statement stmt = connection.createStatement()) { - ResultSet rs = stmt.executeQuery("SELECT uuid, pronouns FROM pronouns"); - while (rs.next()) { - result.put(UUID.fromString(rs.getString("uuid")), rs.getString("pronouns")); + public Map getAllPronouns() { + Map result = new HashMap<>(); + try (Statement stmt = connection.createStatement()) { + ResultSet rs = stmt.executeQuery("SELECT uuid, pronouns FROM pronouns"); + while (rs.next()) { + result.put(UUID.fromString(rs.getString("uuid")), rs.getString("pronouns")); + } + } catch (SQLException e) { + errorLog.add("Database fetch all error: " + e.getMessage()); + e.printStackTrace(); } - } catch (SQLException e) { - errorLog.add("Database fetch all error: " + e.getMessage()); - e.printStackTrace(); - } - return result; + return result; } public void generateDebugFile() { @@ -133,6 +157,7 @@ public Map getAllPronouns() { writer.write("=== PronounsPlugin Debug Report ===\n"); writer.write("Plugin Enabled: " + isEnabled() + "\n"); writer.write("Database Connected: " + (connection != null) + "\n"); + writer.write("Using MySQL: " + usingMySQL + "\n"); writer.write("Blocked Pronouns: " + blockedPronouns + "\n"); writer.write("Pronoun Suggestions: " + pronounSuggestions + "\n"); writer.write("Error Log:\n"); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 24ed719..e7c1080 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -27,12 +27,18 @@ debug: true generate-debug-file: true -database: - use-sqlite: true +mysql: + enabled: false # Setting to false uses SQLite + host: localhost + port: 3306 + database: example + user: example + password: example admin-permissions: - "pronouns.admin" - "pronouns.override" + - "pronouns.reload" player-permissions: - "pronouns.set" diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index dc8dbd5..ecb184c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,9 @@ name: PronounsPlaceholder -version: 1.0.2 +version: 1.0.3 main: com.sophiaatkinson.pronouns.PronounsPlugin api-version: 1.16 +authors: [Sophia Atkinson] +website: https://sophia.wtf commands: pronouns: description: Manage pronouns for players @@ -19,6 +21,9 @@ commands: pronouns.admin: description: Allows admin to list, set, remove pronouns default: op + pronouns.reload: + description: Reloads plugin configuration + default: op aliases: - mypronouns - setpronouns