From 8660d86306d54e5938e5517f524ce79bd073f358 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 13 Mar 2019 13:09:27 -0700 Subject: [PATCH] Expanding DB cleanup settings, Player Leveling config pt 1 --- Changelog.txt | 11 ++- .../commands/database/McpurgeCommand.java | 2 +- .../gmail/nossr50/config/ConfigManager.java | 7 ++ .../com/gmail/nossr50/config/MainConfig.java | 18 ----- .../nossr50/config/hocon/ConfigLeveling.java | 20 ++++++ .../config/hocon/database/ConfigDatabase.java | 8 +++ .../hocon/database/ConfigSectionCleaning.java | 67 +++++++++++++++++++ .../nossr50/database/DatabaseManager.java | 3 +- .../database/FlatfileDatabaseManager.java | 4 +- .../nossr50/database/SQLDatabaseManager.java | 15 ++++- .../datatypes/player/PlayerProfile.java | 2 +- src/main/java/com/gmail/nossr50/mcMMO.java | 20 +++++- .../runnables/database/UserPurgeTask.java | 5 +- .../commands/CommandRegistrationManager.java | 2 +- 14 files changed, 153 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/config/hocon/ConfigLeveling.java create mode 100644 src/main/java/com/gmail/nossr50/config/hocon/database/ConfigSectionCleaning.java diff --git a/Changelog.txt b/Changelog.txt index 95dc22ef4..3ae506578 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -119,6 +119,12 @@ Version 2.1.16 All config nodes that used to be styled with CamelCase now use underscores (_) as spaces for readability and consistency All config nodes will now use Capital letters at the start of each nodes name and after each underscore (_) All config nodes now include a comment with the default value of the node to use as reference + Expanded settings relating to purging users who have not leveled or users who had not logged in for many months + + Fixed a bug where players who started at level 1 would not be purged from the DB for being "powerless" + + Settings related to Player Leveling are now found in "player_leveling.conf" + Player Leveling's "StartingLevel" renamed -> "Player_Starting_Level" Scoreboard settings can now be found in "scoreboard.conf" Scoreboard's "Allow_Keep" setting was removed because it was doing something permissions should be doing instead, and I don't see why such a thing even needs a permission! @@ -131,7 +137,10 @@ Version 2.1.16 Scoreboard's "Display_Time" renamed -> "Display_Time_In_Seconds" Scoreboard.Misc.Ability locale entry renamed from "Ability" to "Super Ability", this is used only if scoreboards are enabled and super ability names are disabled in scoreboard.conf - MySQL Settings can now be found in "database_settings.conf" + MySQL and FlatFile Settings can now be found in "database_settings.conf" + Added new config toggle for purging power-less users + Added new config toggle for purging inactive users + Added setting for only purging users on plugin start up MySQL User settings are now in the User Category instead of being in the Database category MySQL's "Enabled" renamed -> "Use_MySQL" MySQL's "Name" renamed -> "Database_Name" diff --git a/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java b/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java index 5809db54f..ebfc92cf2 100644 --- a/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/database/McpurgeCommand.java @@ -17,7 +17,7 @@ public class McpurgeCommand implements TabExecutor { case 0: mcMMO.getDatabaseManager().purgePowerlessUsers(); - if (MainConfig.getInstance().getOldUsersCutoff() != -1) { + if (mcMMO.getDatabaseCleaningSettings().getOldUserCutoffMonths() != -1) { mcMMO.getDatabaseManager().purgeOldUsers(); } diff --git a/src/main/java/com/gmail/nossr50/config/ConfigManager.java b/src/main/java/com/gmail/nossr50/config/ConfigManager.java index 32db30190..6f63567ed 100644 --- a/src/main/java/com/gmail/nossr50/config/ConfigManager.java +++ b/src/main/java/com/gmail/nossr50/config/ConfigManager.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.config; import com.gmail.nossr50.config.collectionconfigs.RepairConfig; import com.gmail.nossr50.config.collectionconfigs.SalvageConfig; import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.config.hocon.ConfigLeveling; import com.gmail.nossr50.config.hocon.SerializedConfigLoader; import com.gmail.nossr50.config.hocon.database.ConfigDatabase; import com.gmail.nossr50.config.hocon.scoreboard.ConfigScoreboard; @@ -63,6 +64,7 @@ public final class ConfigManager { private SerializedConfigLoader configDatabase; private SerializedConfigLoader configScoreboard; + private SerializedConfigLoader configLeveling; private MainConfig mainConfig; private FishingTreasureConfig fishingTreasureConfig; private ExcavationTreasureConfig excavationTreasureConfig; @@ -96,6 +98,7 @@ public final class ConfigManager { //Serialized Configs configDatabase = new SerializedConfigLoader<>(ConfigDatabase.class, "database_settings.conf", null); configScoreboard = new SerializedConfigLoader<>(ConfigScoreboard.class, "scoreboard.conf", null); + configLeveling = new SerializedConfigLoader<>(ConfigLeveling.class, "player_leveling.conf", null); mainConfig = new MainConfig(); @@ -313,4 +316,8 @@ public final class ConfigManager { public ConfigDatabase getConfigDatabase() { return configDatabase.getConfig(); } public ConfigScoreboard getConfigScoreboard() { return configScoreboard.getConfig(); } + + public ConfigLeveling getConfigLeveling() { + return configLeveling.getConfig(); + } } diff --git a/src/main/java/com/gmail/nossr50/config/MainConfig.java b/src/main/java/com/gmail/nossr50/config/MainConfig.java index a857850c0..1744bb9a0 100644 --- a/src/main/java/com/gmail/nossr50/config/MainConfig.java +++ b/src/main/java/com/gmail/nossr50/config/MainConfig.java @@ -302,15 +302,6 @@ public class MainConfig extends ConfigValidated { reason.add("Either Board or Print in ConfigScoreboard.Types.Inspect must be true!"); }*/ - /* Database Purging */ - if (getPurgeInterval() < -1) { - reason.add(DATABASE + PURGING + "." + PURGE_INTERVAL + " should be greater than, or equal to -1!"); - } - - if (getOldUsersCutoff() != -1 && getOldUsersCutoff() <= 0) { - reason.add(DATABASE + PURGING + "." + OLD_USER_CUTOFF + " should be greater than 0 or -1!"); - } - /* Hardcore Mode */ if (getHardcoreDeathStatPenaltyPercentage() < 0.01 || getHardcoreDeathStatPenaltyPercentage() > 100) { reason.add(HARDCORE + "." + DEATH_STAT_LOSS + "." + PENALTY_PERCENTAGE + " only accepts values from 0.01 to 100!"); @@ -535,15 +526,6 @@ public class MainConfig extends ConfigValidated { return getIntValue(MOB_HEALTHBAR, DISPLAY_TIME); } - /* Database Purging */ - public int getPurgeInterval() { - return getIntValue(DATABASE + PURGING, PURGE_INTERVAL); - } - - public int getOldUsersCutoff() { - return getIntValue(DATABASE + PURGING, OLD_USER_CUTOFF); - } - /* Backups */ public boolean getBackupsEnabled() { return getBooleanValue(BACKUPS, ENABLED); diff --git a/src/main/java/com/gmail/nossr50/config/hocon/ConfigLeveling.java b/src/main/java/com/gmail/nossr50/config/hocon/ConfigLeveling.java new file mode 100644 index 000000000..6fdb44888 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/hocon/ConfigLeveling.java @@ -0,0 +1,20 @@ +package com.gmail.nossr50.config.hocon; + +import ninja.leaping.configurate.objectmapping.Setting; +import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; + +@ConfigSerializable +public class ConfigLeveling { + + private static final int STARTING_LEVEL_DEFAULT = 1; + + @Setting(value = "Player_Starting_Level", + comment = "Players will start at this level in all skills if they aren't already saved in the database." + + "\nHistorically this number has been 0, but this was changed in 2.1.X to 1 as I felt it was better to start from 1 than 0." + + "\nDefault value: "+STARTING_LEVEL_DEFAULT) + private int startingLevel = STARTING_LEVEL_DEFAULT; + + public int getStartingLevel() { + return startingLevel; + } +} diff --git a/src/main/java/com/gmail/nossr50/config/hocon/database/ConfigDatabase.java b/src/main/java/com/gmail/nossr50/config/hocon/database/ConfigDatabase.java index c2d0e2601..d6216de44 100644 --- a/src/main/java/com/gmail/nossr50/config/hocon/database/ConfigDatabase.java +++ b/src/main/java/com/gmail/nossr50/config/hocon/database/ConfigDatabase.java @@ -10,6 +10,10 @@ public class ConfigDatabase { * CONFIG NODES */ + @Setting(value = "Database_Cleaning", + comment = "Settings to automatically purge old users to keep database sizes small.") + private ConfigSectionCleaning configSectionCleaning = new ConfigSectionCleaning(); + @Setting(value = "MySQL", comment = "Settings for using MySQL or MariaDB database" + "\nI recommend using MariaDB, its completely compatible with MySQL and runs a lot better" + "\nI also recommend having the MySQL/MariaDB server in the same datacenter or LAN as your Minecraft server" + @@ -24,4 +28,8 @@ public class ConfigDatabase { public ConfigSectionMySQL getConfigSectionMySQL() { return configSectionMySQL; } + + public ConfigSectionCleaning getConfigSectionCleaning() { + return configSectionCleaning; + } } diff --git a/src/main/java/com/gmail/nossr50/config/hocon/database/ConfigSectionCleaning.java b/src/main/java/com/gmail/nossr50/config/hocon/database/ConfigSectionCleaning.java new file mode 100644 index 000000000..2fb0721f4 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/config/hocon/database/ConfigSectionCleaning.java @@ -0,0 +1,67 @@ +package com.gmail.nossr50.config.hocon.database; + +import ninja.leaping.configurate.objectmapping.Setting; +import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; + +@ConfigSerializable +public class ConfigSectionCleaning { + + /* DEFAULT VALUES */ + private static final boolean PURGE_OLD_USERS = false; + private static final boolean PURGE_POWERLESS_USERS = true; + private static final boolean ONLY_PURGE_AT_STARTUP = false; + private static final int PURGE_INTERVAL_DEFAULT = 1; + private static final int OLD_USER_CUTOFF_IN_MONTHS = 6; + + /* + * CONFIG NODES + */ + + @Setting(value = "Purge_Old_Users", + comment = "Turn this on to enable automatic database pruning of old users." + + "\nDefault value: "+PURGE_OLD_USERS) + private boolean purgeOldUsers = PURGE_OLD_USERS; + + @Setting(value = "Purge_Powerless_Users", comment = "Powerless users are players who have not" + + " leveled up in a single skill." + + "\nDefault value: "+PURGE_POWERLESS_USERS) + private boolean purgePowerlessUsers = PURGE_POWERLESS_USERS; + + @Setting(value = "Only_Purge_At_Plugin_Startup", + comment = "If set to true, then purging will only happen when the plugin first loads." + + "\nKeep in mind, this will trigger on reload as well." + + "\nThis purge is on a 2 second delay from plugin start-up and runs in an ASYNC thread." + + "\nDefault value: "+ONLY_PURGE_AT_STARTUP) + private boolean onlyPurgeAtStartup = ONLY_PURGE_AT_STARTUP; + + @Setting(value = "Purge_Interval_In_Hours", comment = "How many hours between automatic purging?") + private int purgeInterval = PURGE_INTERVAL_DEFAULT; + + @Setting(value = "Old_User_Cutoff_In_Months", comment = "Users who haven't connected in this many months will be purged" + + "\nDefault value: "+OLD_USER_CUTOFF_IN_MONTHS) + private int oldUserCutoffMonths = OLD_USER_CUTOFF_IN_MONTHS; + + /* + * GETTER BOILERPLATE + */ + + public boolean isPurgePowerlessUsers() { + return purgePowerlessUsers; + } + + public boolean isPurgeOldUsers() { + return purgeOldUsers; + } + + public boolean isOnlyPurgeAtStartup() { + return onlyPurgeAtStartup; + } + + public int getPurgeInterval() { + return purgeInterval; + } + + public int getOldUserCutoffMonths() { + return oldUserCutoffMonths; + } +} diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index c6b1d6e61..1477eae2e 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -5,6 +5,7 @@ import com.gmail.nossr50.datatypes.database.DatabaseType; import com.gmail.nossr50.datatypes.database.PlayerStat; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; +import com.gmail.nossr50.mcMMO; import java.util.List; import java.util.Map; @@ -12,7 +13,7 @@ import java.util.UUID; public interface DatabaseManager { // One month in milliseconds - public final long PURGE_TIME = 2630000000L * MainConfig.getInstance().getOldUsersCutoff(); + public final long PURGE_TIME = 2630000000L * mcMMO.getDatabaseCleaningSettings().getOldUserCutoffMonths(); // During convertUsers, how often to output a status public final int progressInterval = 200; diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index d49f8bc73..dd2759c97 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -58,7 +58,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { boolean powerless = true; for (int skill : skills.values()) { - if (skill != 0) { + if (skill > mcMMO.getPlayerLevelingSettings().getStartingLevel()) { powerless = false; break; } @@ -384,7 +384,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { // Open the file to write the player out = new BufferedWriter(new FileWriter(mcMMO.getUsersFilePath(), true)); - String startingLevel = AdvancedConfig.getInstance().getStartingLevel() + ":"; + String startingLevel = mcMMO.getPlayerLevelingSettings().getStartingLevel() + ":"; // Add the player to the end out.append(playerName).append(":"); diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 781a89b06..dc34deb2a 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -119,12 +119,23 @@ public final class SQLDatabaseManager implements DatabaseManager { connection = getConnection(PoolIdentifier.MISC); statement = connection.createStatement(); + String startingLevel = String.valueOf(mcMMO.getPlayerLevelingSettings().getStartingLevel()); + + //Purge users who have not leveled from the default level purged = statement.executeUpdate("DELETE FROM " + tablePrefix + "skills WHERE " + + "taming = " + startingLevel + " AND mining = " + startingLevel + " AND woodcutting = " + startingLevel + " AND repair = " + startingLevel + " " + + "AND unarmed = " + startingLevel + " AND herbalism = " + startingLevel + " AND excavation = " + startingLevel + " AND " + + "archery = " + startingLevel + " AND swords = " + startingLevel + " AND axes = " + startingLevel + " AND acrobatics = " + startingLevel + " " + + "AND fishing = " + startingLevel + " AND alchemy = " + startingLevel + ";"); + + //Purge users who have 0 for all levels + purged += statement.executeUpdate("DELETE FROM " + tablePrefix + "skills WHERE " + "taming = 0 AND mining = 0 AND woodcutting = 0 AND repair = 0 " + "AND unarmed = 0 AND herbalism = 0 AND excavation = 0 AND " + "archery = 0 AND swords = 0 AND axes = 0 AND acrobatics = 0 " + "AND fishing = 0 AND alchemy = 0;"); + statement.executeUpdate("DELETE FROM `" + tablePrefix + "experience` WHERE NOT EXISTS (SELECT * FROM `" + tablePrefix + "skills` `s` WHERE `" + tablePrefix + "experience`.`user_id` = `s`.`user_id`)"); statement.executeUpdate("DELETE FROM `" + tablePrefix + "huds` WHERE NOT EXISTS (SELECT * FROM `" + tablePrefix + "skills` `s` WHERE `" + tablePrefix + "huds`.`user_id` = `s`.`user_id`)"); statement.executeUpdate("DELETE FROM `" + tablePrefix + "cooldowns` WHERE NOT EXISTS (SELECT * FROM `" + tablePrefix + "skills` `s` WHERE `" + tablePrefix + "cooldowns`.`user_id` = `s`.`user_id`)"); @@ -845,8 +856,8 @@ public final class SQLDatabaseManager implements DatabaseManager { statement.setString(2, tablePrefix + "skills"); resultSet = statement.executeQuery(); if (!resultSet.next()) { - String startingLevel = "'" + AdvancedConfig.getInstance().getStartingLevel() + "'"; - String totalLevel = "'" + (AdvancedConfig.getInstance().getStartingLevel() * (PrimarySkillType.values().length - PrimarySkillType.CHILD_SKILLS.size())) + "'"; + String startingLevel = "'" + mcMMO.getPlayerLevelingSettings().getStartingLevel() + "'"; + String totalLevel = "'" + (mcMMO.getPlayerLevelingSettings().getStartingLevel() * (PrimarySkillType.values().length - PrimarySkillType.CHILD_SKILLS.size())) + "'"; createStatement = connection.createStatement(); createStatement.executeUpdate("CREATE TABLE IF NOT EXISTS `" + tablePrefix + "skills` (" + "`user_id` int(10) unsigned NOT NULL," diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java index fe4bb13de..740a27f6f 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/PlayerProfile.java @@ -57,7 +57,7 @@ public class PlayerProfile { } for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) { - skills.put(primarySkillType, AdvancedConfig.getInstance().getStartingLevel()); + skills.put(primarySkillType, mcMMO.getPlayerLevelingSettings().getStartingLevel()); skillsXp.put(primarySkillType, 0F); } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 8f9e90c26..ed7cb60b8 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -5,6 +5,8 @@ import com.gmail.nossr50.config.CoreSkillsConfig; import com.gmail.nossr50.config.MainConfig; import com.gmail.nossr50.config.WorldBlacklist; import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.config.hocon.ConfigLeveling; +import com.gmail.nossr50.config.hocon.database.ConfigSectionCleaning; import com.gmail.nossr50.config.hocon.database.ConfigSectionMySQL; import com.gmail.nossr50.config.hocon.scoreboard.ConfigScoreboard; import com.gmail.nossr50.database.DatabaseManager; @@ -330,6 +332,20 @@ public class mcMMO extends JavaPlugin { return configManager.getConfigDatabase().getConfigSectionMySQL(); } + public static ConfigLeveling getPlayerLevelingSettings() + { + return configManager.getConfigLeveling(); + } + + /** + * Returns settings for Database cleaning from the users config + * @return settings for Database cleaning from the users config + */ + public static ConfigSectionCleaning getDatabaseCleaningSettings() + { + return configManager.getConfigDatabase().getConfigSectionCleaning(); + } + /** * Returns settings for Scoreboards from the users config * @return settings for Scoreboards from the users config @@ -474,9 +490,9 @@ public class mcMMO extends JavaPlugin { new BleedTimerTask().runTaskTimer(this, 1 * Misc.TICK_CONVERSION_FACTOR, 1 * (Misc.TICK_CONVERSION_FACTOR / 2)); // Old & Powerless User remover - long purgeIntervalTicks = MainConfig.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; + long purgeIntervalTicks = getConfigManager().getConfigDatabase().getConfigSectionCleaning().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; - if (purgeIntervalTicks == 0) { + if (mcMMO.getDatabaseCleaningSettings().isOnlyPurgeAtStartup()) { new UserPurgeTask().runTaskLaterAsynchronously(this, 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup. } else if (purgeIntervalTicks > 0) { diff --git a/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java b/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java index 6c574129b..f8b9ecee3 100644 --- a/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/database/UserPurgeTask.java @@ -11,9 +11,10 @@ public class UserPurgeTask extends BukkitRunnable { @Override public void run() { lock.lock(); - mcMMO.getDatabaseManager().purgePowerlessUsers(); + if(mcMMO.getDatabaseCleaningSettings().isPurgePowerlessUsers()) + mcMMO.getDatabaseManager().purgePowerlessUsers(); - if (MainConfig.getInstance().getOldUsersCutoff() != -1) { + if (mcMMO.getDatabaseCleaningSettings().isPurgeOldUsers()) { mcMMO.getDatabaseManager().purgeOldUsers(); } lock.unlock(); diff --git a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index 21dace4ea..c7c53667d 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -263,7 +263,7 @@ public final class CommandRegistrationManager { private static void registerMcpurgeCommand() { PluginCommand command = mcMMO.p.getCommand("mcpurge"); - command.setDescription(LocaleLoader.getString("Commands.Description.mcpurge", MainConfig.getInstance().getOldUsersCutoff())); + command.setDescription(LocaleLoader.getString("Commands.Description.mcpurge", mcMMO.getDatabaseCleaningSettings().getOldUserCutoffMonths())); command.setPermission("mcmmo.commands.mcpurge"); command.setPermissionMessage(permissionsMessage); command.setUsage(LocaleLoader.getString("Commands.Usage.0", "mcpurge"));