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!

This commit is contained in:
WildInterloper 2024-03-14 03:46:50 -04:00
parent 9de1283127
commit cab690905d
3 changed files with 87 additions and 8 deletions

View File

@ -6,7 +6,7 @@
<groupId>me.NVus</groupId>
<artifactId>NVus_Prison</artifactId>
<version>1.0.2</version>
<version>1.0.3</version>
<packaging>jar</packaging>
<name>NVus_PrisonSetup</name>

View File

@ -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<String, Rank> fileRanks = newLoadRanksFromConfig();
// Get current ranks from the database
Set<String> databaseRankNames = getCurrentRankNamesFromDatabase();
// Upsert ranks from the file into the database
for (Map.Entry<String, Rank> 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<String> getCurrentRankNamesFromDatabase() {
Set<String> 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<String, Rank> newLoadRanksFromConfig() {
Map<String, Rank> 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<String> 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) {

View File

@ -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
}