From ce42da5806475fd8ad9670d7a4d6af4536eb3685 Mon Sep 17 00:00:00 2001 From: gmcferrin Date: Thu, 10 Jan 2013 19:36:11 -0500 Subject: [PATCH] Added task to prune old and powerless users from the SQL database. *** WARNING: THIS WILL RUN AUTOMATICALLY ON YOUR DB. IF YOU ARE WORRIED ABOUT DATA LOSS, BACK UP YOUR SQL DATA BEFORE INSTALLING THIS BUILD *** --- Changelog.txt | 3 + .../nossr50/commands/mc/MctopCommand.java | 5 +- src/main/java/com/gmail/nossr50/mcMMO.java | 3 + .../nossr50/runnables/UserPurgeTask.java | 88 +++++++++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/runnables/UserPurgeTask.java diff --git a/Changelog.txt b/Changelog.txt index 45e27238b..be4a69f3c 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -8,6 +8,9 @@ Key: - Removal Version 1.3.13-dev + + Added task to prune old and powerless users from the SQL database. + *** WARNING: THIS WILL RUN AUTOMATICALLY ON YOUR DB. IF YOU ARE WORRIED *** + *** ABOUT DATA LOSS, BACK UP YOUR SQL DATA BEFORE INSTALLING THIS BUILD *** + Added Craftbukkit 1.4.6 compatibility + Added a configurable durability cap for ArmorImpact to advanced.yml + Added the version number to /mcmmo diff --git a/src/main/java/com/gmail/nossr50/commands/mc/MctopCommand.java b/src/main/java/com/gmail/nossr50/commands/mc/MctopCommand.java index 5d392142c..1f207e4a8 100644 --- a/src/main/java/com/gmail/nossr50/commands/mc/MctopCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/mc/MctopCommand.java @@ -146,11 +146,12 @@ public class MctopCommand implements CommandExecutor { } for (int i = (page * 10) - 9; i <= (page * 10); i++) { - if (i > userslist.size() || database.read("SELECT user FROM " + tablePrefix + "users WHERE id = '" + Integer.valueOf(userslist.get(i).get(1)) + "'") == null) { + HashMap> username = database.read("SELECT user FROM " + tablePrefix + "users WHERE id = '" + Integer.valueOf(userslist.get(i).get(1)) + "'"); + + if (i > userslist.size() || username == null) { break; } - HashMap> username = database.read("SELECT user FROM " + tablePrefix + "users WHERE id = '" + Integer.valueOf(userslist.get(i).get(1)) + "'"); sender.sendMessage(String.valueOf(i) + ". " + ChatColor.GREEN + userslist.get(i).get(0) + " - " + ChatColor.WHITE + username.get(1).get(0)); } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 10b775c79..993264652 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -71,6 +71,7 @@ import com.gmail.nossr50.runnables.MobStoreCleaner; import com.gmail.nossr50.runnables.SaveTimer; import com.gmail.nossr50.runnables.SkillMonitor; import com.gmail.nossr50.runnables.SpoutStart; +import com.gmail.nossr50.runnables.UserPurgeTask; import com.gmail.nossr50.skills.repair.RepairManager; import com.gmail.nossr50.skills.repair.RepairManagerFactory; import com.gmail.nossr50.skills.repair.Repairable; @@ -196,6 +197,8 @@ public class mcMMO extends JavaPlugin { scheduler.scheduleSyncRepeatingTask(this, new BleedTimer(), 0, 40); //Chunklet unloader (Runs every 20 seconds by default) scheduler.scheduleSyncRepeatingTask(this, new ChunkletUnloader(), 0, ChunkletUnloader.RUN_INTERVAL * 20); + //Old & Powerless User remover (Runs every 6 hours) + scheduler.scheduleSyncRepeatingTask(this, new UserPurgeTask(), 0, 21600 * 20); registerCommands(); diff --git a/src/main/java/com/gmail/nossr50/runnables/UserPurgeTask.java b/src/main/java/com/gmail/nossr50/runnables/UserPurgeTask.java new file mode 100644 index 000000000..cd17bcb76 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/runnables/UserPurgeTask.java @@ -0,0 +1,88 @@ +package com.gmail.nossr50.runnables; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.bukkit.Bukkit; + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.util.Database; + +public class UserPurgeTask implements Runnable { + + private Database database = mcMMO.getPlayerDatabase(); + private String tablePrefix = Config.getInstance().getMySQLTablePrefix(); + private String databaseName = Config.getInstance().getMySQLDatabaseName(); + + @Override + public void run() { + if (Config.getInstance().getUseMySQL()) { + purgePowerlessSQL(); + purgeOldSQL(); + } + else { + //TODO: Make this work for Flatfile data. + } + } + + private void purgePowerlessSQL() { + String query = "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing"; + + HashMap> userslist = database.read("SELECT " + query + ", user_id FROM " + tablePrefix + "skills WHERE " + query + " > 0 ORDER BY " + query + " DESC "); + + for (int i = 1; i <= userslist.size(); i++) { + int userId = Integer.valueOf(userslist.get(i).get(1)); + HashMap> username = database.read("SELECT user FROM " + tablePrefix + "users WHERE id = '" + userId + "'"); + + if (Bukkit.getPlayer(username.get(1).get(0)).isOnline()) { + continue; + } + + deleteFromSQL(userId); + } + } + + private void purgeOldSQL() { + String query = "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing"; + + HashMap> userslist = database.read("SELECT " + query + ", user_id FROM " + tablePrefix + "skills WHERE " + query + " > 0 ORDER BY " + query + " DESC "); + + for (int i = 1; i <= userslist.size(); i++) { + int userId = Integer.valueOf(userslist.get(i).get(1)); + long lastLoginTime = database.getInt("SELECT lastlogin FROM " + tablePrefix + "users WHERE id = '" + userId + "'") * 1000L; + long loginDifference = System.currentTimeMillis() - lastLoginTime; + + if (loginDifference > 2630000000L) { + deleteFromSQL(userId); + } + } + } + + private void deleteFromSQL(int userId) { + database.write("DELETE FROM " + + databaseName + "." + + tablePrefix + "users WHERE " + + tablePrefix + "users.id=" + userId); + + database.write("DELETE FROM " + + databaseName + "." + + tablePrefix + "cooldowns WHERE " + + tablePrefix + "cooldowns.user_id=" + userId); + + database.write("DELETE FROM " + + databaseName + "." + + tablePrefix + "huds WHERE " + + tablePrefix + "huds.user_id=" + userId); + + database.write("DELETE FROM " + + databaseName + "." + + tablePrefix + "skills WHERE " + + tablePrefix + "skills.user_id=" + userId); + + database.write("DELETE FROM " + + databaseName + "." + + tablePrefix + "experience WHERE " + + tablePrefix + "experience.user_id=" + userId); + } +}