From cab690905d6e02f57347c221a8f2a39e41576999 Mon Sep 17 00:00:00 2001 From: WildInterloper <156627888+WildInterloper@users.noreply.github.com> Date: Thu, 14 Mar 2024 03:46:50 -0400 Subject: [PATCH] 1.0.3 - Hotfix for Database syncing issues with Ranks. Need to update players ranks when ranks massively change somehow. Current it just removes ranks that no longer exist and players within ranks that no longer exist! --- pom.xml | 2 +- .../Database/DatabaseManager.java | 86 +++++++++++++++++-- .../me/nvus/nvus_prison_setup/Ranks/Rank.java | 7 +- 3 files changed, 87 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index af9bff6..11347de 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ me.NVus NVus_Prison - 1.0.2 + 1.0.3 jar NVus_PrisonSetup diff --git a/src/main/java/me/nvus/nvus_prison_setup/Database/DatabaseManager.java b/src/main/java/me/nvus/nvus_prison_setup/Database/DatabaseManager.java index 7f0efd0..f7c8a29 100644 --- a/src/main/java/me/nvus/nvus_prison_setup/Database/DatabaseManager.java +++ b/src/main/java/me/nvus/nvus_prison_setup/Database/DatabaseManager.java @@ -6,10 +6,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.io.File; import me.nvus.nvus_prison_setup.Gangs.GangInfo; @@ -120,10 +117,11 @@ public class DatabaseManager { public void syncRanks() { FileConfiguration ranksConfig = configManager.getConfig("ranks.yml"); - // Assuming you've moved loadRanksFromConfig method logic directly here or keep it separated as below loadRanksFromConfig(ranksConfig); } + + private void upsertRankInDatabase(String rankName, double cost, String commandsAsString) { // This method will check if the rank exists and update or insert accordingly String selectQuery = "SELECT COUNT(*) FROM nvus_ranks WHERE rank_name = ?"; @@ -162,7 +160,8 @@ public class DatabaseManager { initializeRanksDatabase(); // Load ranks from the ranks.yml config and sync them with the database - syncRanks(); + //syncRanks(); + syncRanksFromFileToDatabase(); } @@ -348,6 +347,64 @@ public class DatabaseManager { } +//////////////////////////////// SYNC DATABASE STUFF FOR RANKS ///////////////////////////////////////// + + public void syncRanksFromFileToDatabase() { + + // Load ranks from ranks.yml + Map fileRanks = newLoadRanksFromConfig(); + + // Get current ranks from the database + Set databaseRankNames = getCurrentRankNamesFromDatabase(); + + // Upsert ranks from the file into the database + for (Map.Entry entry : fileRanks.entrySet()) { + String rankName = entry.getKey(); + Rank rank = entry.getValue(); + + upsertRankInDatabase(rankName, rank.getCost(), rank.getCommandsString()); + + // Remove processed rank from databaseRankNames to track unmatched ranks + databaseRankNames.remove(rankName); + } + + // At this point, databaseRankNames contains only ranks that were not in the ranks.yml file + // Delete these unmatched ranks from the database + for (String oldRankName : databaseRankNames) { + deleteRankFromDatabase(oldRankName); + } + } + + private Set getCurrentRankNamesFromDatabase() { + Set rankNames = new HashSet<>(); + String query = "SELECT rank_name FROM nvus_ranks"; + try (Connection conn = this.connect(); // Make sure to implement this.connect() method to get your DB connection + PreparedStatement pstmt = conn.prepareStatement(query); + ResultSet rs = pstmt.executeQuery()) { + while (rs.next()) { + rankNames.add(rs.getString("rank_name")); + } + } catch (SQLException e) { + System.out.println("Error fetching current rank names from database: " + e.getMessage()); + } + return rankNames; + } + + private void deleteRankFromDatabase(String rankName) { + String query = "DELETE FROM nvus_ranks WHERE rank_name = ?"; + try (Connection conn = this.connect(); // Implement this.connect() method to get your DB connection + PreparedStatement pstmt = conn.prepareStatement(query)) { + pstmt.setString(1, rankName); + int affectedRows = pstmt.executeUpdate(); + if (affectedRows > 0) { + System.out.println("Successfully deleted rank: " + rankName); + } else { + System.out.println("No rank found with the name: " + rankName + " to delete."); + } + } catch (SQLException e) { + System.out.println("Error deleting rank from database: " + e.getMessage()); + } + } @@ -419,6 +476,23 @@ public class DatabaseManager { } } + public Map newLoadRanksFromConfig() { + Map fileRanks = new HashMap<>(); + FileConfiguration ranksConfig = configManager.getConfig("ranks.yml"); + ConfigurationSection ranksSection = ranksConfig.getConfigurationSection("Ranks"); + if (ranksSection != null) { + for (String rankKey : ranksSection.getKeys(false)) { + String rankName = rankKey; + double cost = ranksSection.getDouble(rankKey + ".Cost"); + List commandsList = ranksSection.getStringList(rankKey + ".Commands"); + Rank rank = new Rank(rankName, cost, commandsList); + fileRanks.put(rankName, rank); + } + } + return fileRanks; + } + + // public void createGang(String name, String ownerUuid) { diff --git a/src/main/java/me/nvus/nvus_prison_setup/Ranks/Rank.java b/src/main/java/me/nvus/nvus_prison_setup/Ranks/Rank.java index 59970b2..9df61b1 100644 --- a/src/main/java/me/nvus/nvus_prison_setup/Ranks/Rank.java +++ b/src/main/java/me/nvus/nvus_prison_setup/Ranks/Rank.java @@ -26,5 +26,10 @@ public class Rank { return commands; } - // Setters and other methods as necessary + // Additional method to get commands as a single string, separated by a semicolon + public String getCommandsString() { + return String.join(";", this.commands); + } + + // Add any additional methods or modifications here }