Last active
December 20, 2015 10:29
-
-
Save riking/6116237 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/main/java/com/gmail/nossr50/util/player/UserManager.java b/src/main/java/com/gmail/nossr50/util/player/UserManager.java | |
index c6b691e..b468597 100644 | |
--- a/src/main/java/com/gmail/nossr50/util/player/UserManager.java | |
+++ b/src/main/java/com/gmail/nossr50/util/player/UserManager.java | |
@@ -84,7 +84,7 @@ public final class UserManager { | |
playerName = matches.get(0).getName(); | |
} | |
- return players.get(playerName); | |
+ return logNull(playerName); | |
} | |
/** | |
@@ -94,6 +94,14 @@ public final class UserManager { | |
* @return the player's McMMOPlayer object | |
*/ | |
public static McMMOPlayer getPlayer(OfflinePlayer player) { | |
- return players.get(player.getName()); | |
+ return logNull(player.getName()); | |
+ } | |
+ | |
+ private static McMMOPlayer logNull(String name) { | |
+ McMMOPlayer p = players.get(name); | |
+ if (p == null) { | |
+ mcMMO.p.debug("McMMOPlayer for " + name + " was null"); | |
+ } | |
+ return p; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java | |
index 9a03c3a..1f1f156 100644 | |
--- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java | |
+++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java | |
@@ -13,9 +13,12 @@ import java.util.Comparator; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
+import java.util.concurrent.Callable; | |
+import java.util.concurrent.ExecutionException; | |
import org.bukkit.Bukkit; | |
import org.bukkit.OfflinePlayer; | |
+import org.bukkit.entity.Player; | |
import com.gmail.nossr50.mcMMO; | |
import com.gmail.nossr50.config.Config; | |
@@ -51,6 +54,26 @@ public final class FlatfileDatabaseManager implements DatabaseManager { | |
FileWriter out = null; | |
String usersFilePath = mcMMO.getUsersFilePath(); | |
+ List<String> onlinePlayers = Collections.EMPTY_LIST; | |
+ try { | |
+ onlinePlayers = Bukkit.getScheduler().callSyncMethod(mcMMO.p, new Callable<List<String>>() { | |
+ @Override | |
+ public List<String> call() { | |
+ Player[] players = Bukkit.getOnlinePlayers(); | |
+ if (players.length == 0) { | |
+ return null; | |
+ } | |
+ ArrayList<String> names = new ArrayList<String>(); | |
+ for (Player p : players) { | |
+ names.add(p.getName()); | |
+ } | |
+ return names; | |
+ } | |
+ }).get(); | |
+ } catch (InterruptedException e1) { | |
+ } catch (ExecutionException e1) { | |
+ } | |
+ | |
// This code is O(n) instead of O(n²) | |
synchronized (fileWritingLock) { | |
try { | |
@@ -60,6 +83,11 @@ public final class FlatfileDatabaseManager implements DatabaseManager { | |
while ((line = in.readLine()) != null) { | |
String[] character = line.split(":"); | |
+ if (onlinePlayers.contains(character[0])) { | |
+ // Skip | |
+ writer.append(line).append("\r\n"); | |
+ continue; | |
+ } | |
Map<SkillType, Integer> skills = getSkillMapFromLine(character); | |
boolean powerless = true; | |
diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java | |
index b0faac7..230793a 100644 | |
--- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java | |
+++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java | |
@@ -8,12 +8,19 @@ import java.sql.SQLException; | |
import java.sql.Statement; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
+import java.util.Collections; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
import java.util.Properties; | |
+import java.util.concurrent.Callable; | |
+import java.util.concurrent.ExecutionException; | |
+import java.util.concurrent.Future; | |
import java.util.logging.Level; | |
+import org.bukkit.Bukkit; | |
+import org.bukkit.entity.Player; | |
+ | |
import com.gmail.nossr50.mcMMO; | |
import com.gmail.nossr50.config.Config; | |
import com.gmail.nossr50.datatypes.MobHealthbarType; | |
@@ -58,6 +65,21 @@ public final class SQLDatabaseManager implements DatabaseManager { | |
checkConnected(); | |
mcMMO.p.getLogger().info("Purging powerless users..."); | |
+ Future<List<String>> future = Bukkit.getScheduler().callSyncMethod(mcMMO.p, new Callable<List<String>>() { | |
+ @Override | |
+ public List<String> call() { | |
+ Player[] players = Bukkit.getOnlinePlayers(); | |
+ if (players.length == 0) { | |
+ return null; | |
+ } | |
+ ArrayList<String> names = new ArrayList<String>(); | |
+ for (Player p : players) { | |
+ names.add(p.getName()); | |
+ } | |
+ return names; | |
+ } | |
+ }); | |
+ | |
Collection<ArrayList<String>> usernames = read("SELECT u.user FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE s.user_id = u.id AND (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0").values(); | |
write("DELETE FROM u, e, h, s, c USING " + tablePrefix + "users u " + | |
@@ -67,7 +89,7 @@ public final class SQLDatabaseManager implements DatabaseManager { | |
"JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " + | |
"WHERE (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0"); | |
- processPurge(usernames); | |
+ processPurge(usernames, future); | |
mcMMO.p.getLogger().info("Purged " + usernames.size() + " users from the database."); | |
} | |
@@ -86,7 +108,7 @@ public final class SQLDatabaseManager implements DatabaseManager { | |
"JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " + | |
"WHERE ((" + currentTime + " - lastlogin * " + Misc.TIME_CONVERSION_FACTOR + ") > " + PURGE_TIME + ")"); | |
- processPurge(usernames); | |
+ processPurge(usernames, null); | |
mcMMO.p.getLogger().info("Purged " + usernames.size() + " users from the database.");; | |
} | |
@@ -984,9 +1006,22 @@ public final class SQLDatabaseManager implements DatabaseManager { | |
} | |
} | |
- private void processPurge(Collection<ArrayList<String>> usernames) { | |
- for (ArrayList<String> user : usernames) { | |
- Misc.profileCleanup(user.get(0)); | |
+ private void processPurge(Collection<ArrayList<String>> usernames, Future<List<String>> skipFuture) { | |
+ try { | |
+ List<String> online; | |
+ if (skipFuture != null) { | |
+ online = skipFuture.get(); | |
+ } else { | |
+ online = Collections.EMPTY_LIST; | |
+ } | |
+ | |
+ for (ArrayList<String> user : usernames) { | |
+ if (!online.contains(user)) { | |
+ Misc.profileCleanup(user.get(0)); | |
+ } | |
+ } | |
+ } catch (InterruptedException e) { | |
+ } catch (ExecutionException e) { | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment