diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java index 32500667c..7d933b10a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java @@ -122,7 +122,6 @@ public class CoreClientManager extends MiniPlugin @EventHandler(priority = EventPriority.LOWEST) public void AsyncLogin(AsyncPlayerPreLoginEvent event) { - TimingManager.start(event.getName() + " logging in ASYNC."); try { LoadClient(Add(event.getName()), event.getUniqueId(), event.getAddress().getHostAddress()); @@ -132,6 +131,8 @@ public class CoreClientManager extends MiniPlugin Logger.Instance.log(exception); event.disallow(Result.KICK_OTHER, "Error retrieving information from web, please retry in a minute."); + + System.out.println(exception.getMessage()); } if (Bukkit.hasWhitelist() && !Get(event.getName()).GetRank().Has(Rank.MODERATOR)) @@ -146,12 +147,12 @@ public class CoreClientManager extends MiniPlugin event.disallow(Result.KICK_WHITELIST, "You are not whitelisted my friend."); } - - TimingManager.stop(event.getName() + " logging in ASYNC."); } private void LoadClient(CoreClient client, UUID uuid, String ipAddress) { + TimingManager.start(client.GetPlayerName() + " LoadClient Total."); + // Prep for mysql ClientToken token = null; @@ -170,30 +171,38 @@ public class CoreClientManager extends MiniPlugin // Load client in miniplugins Bukkit.getServer().getPluginManager().callEvent(new AsyncClientLoadEvent(token, client)); + + RetrieveClientInformationEvent clientInformationEvent = new RetrieveClientInformationEvent(client.GetPlayerName(), uuid); try { // Mysql - Bukkit.getServer().getPluginManager().callEvent(new RetrieveClientInformationEvent(client.GetPlayerName(), uuid)); + Bukkit.getServer().getPluginManager().callEvent(clientInformationEvent); } catch (Exception exception) { Logger.Instance.log(exception); System.out.println("Error running RetrieveClientInformationEvent" + exception.getMessage()); } - } - - @EventHandler(priority = EventPriority.MONITOR) - public void LoginTiming(PlayerLoginEvent event) - { - TimingManager.stop(event.getPlayer().getName() + " logging in SYNC."); + + while (clientInformationEvent.processing()) + { + try + { + Thread.sleep(1); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + + TimingManager.stop(client.GetPlayerName() + " LoadClient Total."); } @EventHandler(priority = EventPriority.LOWEST) public void Login(PlayerLoginEvent event) { - TimingManager.start(event.getPlayer().getName() + " logging in SYNC."); - synchronized(_clientLock) { if (!_clientList.containsKey(event.getPlayer().getName())) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/event/RetrieveClientInformationEvent.java b/Plugins/Mineplex.Core/src/mineplex/core/account/event/RetrieveClientInformationEvent.java index f8d2a1a8b..a07d87528 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/event/RetrieveClientInformationEvent.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/event/RetrieveClientInformationEvent.java @@ -11,6 +11,7 @@ public class RetrieveClientInformationEvent extends Event private String _playerName; private UUID _uuid; + private int _processingCount; public RetrieveClientInformationEvent(String playerName, UUID uuid) { @@ -37,4 +38,19 @@ public class RetrieveClientInformationEvent extends Event { return _uuid; } + + public void incrementProcessingCount() + { + _processingCount++; + } + + public boolean processing() + { + return _processingCount > 0; + } + + public void decreaseProcessingCount() + { + _processingCount--; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/repository/MysqlAccountRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/account/repository/MysqlAccountRepository.java index 899fd2228..638c3b8cd 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/repository/MysqlAccountRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/repository/MysqlAccountRepository.java @@ -8,7 +8,8 @@ import mineplex.core.database.column.ColumnVarChar; public class MysqlAccountRepository extends RepositoryBase { private static String CREATE_ACCOUNT_TABLE = "CREATE TABLE IF NOT EXISTS accounts (id INT NOT NULL AUTO_INCREMENT, uuid VARCHAR(100), name VARCHAR(40), gems INT, rank VARCHAR(40), rankPerm BOOL, rankExpire LONG, lastLogin LONG, totalPlayTime LONG, PRIMARY KEY (id), UNIQUE INDEX uuidIndex (uuid), UNIQUE INDEX nameIndex (name), INDEX rankIndex (rank));"; - private static String ACCOUNT_LOGIN = "INSERT INTO accounts (uuid, name, lastLogin) values(?, ?, now()) ON DUPLICATE KEY UPDATE name=VALUES(name), lastLogin=VALUES(lastLogin);"; + private static String ACCOUNT_LOGIN_NEW = "INSERT INTO accounts (uuid, name, lastLogin) values(?, ?, now()) ON DUPLICATE KEY UPDATE name=VALUES(name), lastLogin=VALUES(lastLogin);"; + private static String ACCOUNT_LOGIN_UPDATE = "UPDATE accounts SET uuid=?, name=?, lastLogin=now() WHERE uuid = ?;"; public MysqlAccountRepository(JavaPlugin plugin) { @@ -26,6 +27,12 @@ public class MysqlAccountRepository extends RepositoryBase public void login(String uuid, String name) { - executeUpdate(ACCOUNT_LOGIN, new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("name", 40, name)); + int affectedRows = executeUpdate(ACCOUNT_LOGIN_UPDATE, new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("name", 40, name), new ColumnVarChar("uuid", 100, uuid)); + + if (affectedRows == 0) + { + executeUpdate(ACCOUNT_LOGIN_NEW, new ColumnVarChar("uuid", 100, uuid), new ColumnVarChar("name", 40, name)); + System.out.println("Executed LOGIN_NEW"); + } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java b/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java index a8f280fd3..e5fb8d38d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/database/RepositoryBase.java @@ -61,15 +61,16 @@ public abstract class RepositoryBase protected int executeUpdate(String query, Column...columns) { - Connection connection = null; PreparedStatement preparedStatement = null; int affectedRows = 0; try { - connection = DriverManager.getConnection(_connectionString, _userName, _password); - preparedStatement = connection.prepareStatement(query); + if (_connection == null || !_connection.isValid(1)) + _connection = DriverManager.getConnection(_connectionString, _userName, _password); + + preparedStatement = _connection.prepareStatement(query); for (int i=0; i < columns.length; i++) { @@ -95,18 +96,6 @@ public abstract class RepositoryBase e.printStackTrace(); } } - - if (connection != null) - { - try - { - connection.close(); - } - catch (SQLException e) - { - e.printStackTrace(); - } - } } return affectedRows; @@ -149,13 +138,14 @@ public abstract class RepositoryBase protected void executeQuery(String query, ResultSetCallable callable, Column...columns) { - Connection connection = null; PreparedStatement preparedStatement = null; try { - connection = DriverManager.getConnection(_connectionString, _userName, _password); - preparedStatement = connection.prepareStatement(query); + if (_connection == null || !_connection.isValid(1)) + _connection = DriverManager.getConnection(_connectionString, _userName, _password); + + preparedStatement = _connection.prepareStatement(query); executeQuery(preparedStatement, callable, columns); } @@ -176,31 +166,15 @@ public abstract class RepositoryBase e.printStackTrace(); } } - - if (connection != null) - { - try - { - connection.close(); - } - catch (SQLException e) - { - e.printStackTrace(); - } - } } } protected int executeUpdate(PreparedStatement preparedStatement, Column...columns) { - Connection connection = null; - int affectedRows = 0; try { - connection = DriverManager.getConnection(_connectionString, _userName, _password); - for (int i=0; i < columns.length; i++) { columns[i].setValue(preparedStatement, i+1); @@ -212,20 +186,6 @@ public abstract class RepositoryBase { exception.printStackTrace(); } - finally - { - if (connection != null) - { - try - { - connection.close(); - } - catch (SQLException e) - { - e.printStackTrace(); - } - } - } return affectedRows; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/elo/EloManager.java b/Plugins/Mineplex.Core/src/mineplex/core/elo/EloManager.java index 10981c224..fc567f9a8 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/elo/EloManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/elo/EloManager.java @@ -5,12 +5,16 @@ import java.util.UUID; import mineplex.core.MiniPlugin; import mineplex.core.account.event.RetrieveClientInformationEvent; import mineplex.core.common.util.NautHashMap; +import mineplex.core.timing.TimingManager; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.plugin.java.JavaPlugin; public class EloManager extends MiniPlugin { + private static Object _playerEloLock = new Object(); + private EloRepository _repository; private EloRatingSystem _ratingSystem; private NautHashMap> _playerElos; @@ -41,20 +45,39 @@ public class EloManager extends MiniPlugin } @EventHandler - public void retrievePlayersElos(RetrieveClientInformationEvent event) + public void retrievePlayersElos(final RetrieveClientInformationEvent event) { - _playerElos.put(event.getUniqueId().toString(), _repository.loadClientInformation(event.getUniqueId())); + event.incrementProcessingCount(); + Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() + { + public void run() + { + TimingManager.start(event.getPlayerName() + " elo Account call."); + NautHashMap eloMap = _repository.loadClientInformation(event.getUniqueId()); + TimingManager.stop(event.getPlayerName() + " elo Account call."); + + synchronized (_playerEloLock) + { + _playerElos.put(event.getUniqueId().toString(), eloMap); + } + + event.decreaseProcessingCount(); + } + }); } public int getElo(UUID uuid, String gameType) { int elo = 1000; - if (_playerElos.containsKey(uuid.toString())) + synchronized (_playerEloLock) { - if (_playerElos.get(uuid.toString()).containsKey(gameType)) + if (_playerElos.containsKey(uuid.toString())) { - elo = _playerElos.get(uuid.toString()).get(gameType); + if (_playerElos.get(uuid.toString()).containsKey(gameType)) + { + elo = _playerElos.get(uuid.toString()).get(gameType); + } } } @@ -94,16 +117,25 @@ public class EloManager extends MiniPlugin saveElo(uuid.toString(), gameType, elo); } - public void saveElo(String uuid, String gameType, int elo) + public void saveElo(final String uuid, final String gameType, final int elo) { - _repository.saveElo(uuid, gameType, elo); - - if (_playerElos.containsKey(uuid)) + Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() { - if (_playerElos.get(uuid).containsKey(gameType)) + public void run() { - _playerElos.get(uuid).put(gameType, elo); + _repository.saveElo(uuid, gameType, elo); + + synchronized (_playerEloLock) + { + if (_playerElos.containsKey(uuid)) + { + if (_playerElos.get(uuid).containsKey(gameType)) + { + _playerElos.get(uuid).put(gameType, elo); + } + } + } } - } + }); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java index 697c971f3..45bbdaf37 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/friend/data/FriendRepository.java @@ -14,8 +14,8 @@ import mineplex.core.database.column.ColumnVarChar; public class FriendRepository extends RepositoryBase { - private static String CREATE_FRIEND_TABLE = "CREATE TABLE IF NOT EXISTS accountFriend (id INT NOT NULL AUTO_INCREMENT, uuidSource VARCHAR(100), uuidTarget VARCHAR(100), mutual BOOL, PRIMARY KEY (id), INDEX uuidTargetIndex (uuidTarget));"; - private static String RETRIEVE_MULTIPLE_FRIEND_RECORDS = "SELECT uuidSource, tA.Name, mutual FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget LEFT JOIN playerMap ON tA.name = playerName WHERE uuidSource IN "; + private static String CREATE_FRIEND_TABLE = "CREATE TABLE IF NOT EXISTS accountFriend (id INT NOT NULL AUTO_INCREMENT, uuidSource VARCHAR(100), uuidTarget VARCHAR(100), mutual BOOL, PRIMARY KEY (id), INDEX uuidIndex (uuidSource, uuidTarget));"; + private static String RETRIEVE_MULTIPLE_FRIEND_RECORDS = "SELECT uuidSource, tA.Name, mutual, serverName, tA.lastLogin FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget LEFT JOIN playerMap ON tA.name = playerName WHERE uuidSource IN "; private static String RETRIEVE_FRIEND_RECORDS = "SELECT tA.Name, mutual, serverName, tA.lastLogin FROM accountFriend INNER Join accounts AS fA ON fA.uuid = uuidSource INNER JOIN accounts AS tA ON tA.uuid = uuidTarget LEFT JOIN playerMap ON tA.name = playerName WHERE uuidSource = ?;"; private static String ADD_FRIEND_RECORD = "INSERT INTO accountFriend (uuidSource, uuidTarget) SELECT fA.uuid AS uuidSource, tA.uuid AS uuidTarget FROM accounts as fA LEFT JOIN accounts AS tA ON tA.name = ? WHERE fA.uuid = ?;"; private static String DELETE_FRIEND_RECORD = "DELETE aF FROM accountFriend AS aF INNER JOIN accounts ON accounts.name = ? WHERE uuidSource = ? AND uuidTarget = accounts.uuid;"; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java index e8a219c49..96d089e18 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/preferences/PreferencesManager.java @@ -2,6 +2,7 @@ package mineplex.core.preferences; import java.util.Map.Entry; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -19,6 +20,7 @@ import mineplex.core.donation.DonationManager; import mineplex.core.itemstack.ItemStackFactory; import mineplex.core.preferences.command.PreferencesCommand; import mineplex.core.preferences.ui.PreferencesShop; +import mineplex.core.timing.TimingManager; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; @@ -64,9 +66,19 @@ public class PreferencesManager extends MiniClientPlugin } @Override - protected void loadClientInformation(RetrieveClientInformationEvent event) + protected void loadClientInformation(final RetrieveClientInformationEvent event) { - Set(event.getPlayerName(), _repository.loadClientInformation(event.getUniqueId())); + event.incrementProcessingCount(); + Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() + { + public void run() + { + TimingManager.start(event.getPlayerName() + " pref Account call."); + Set(event.getPlayerName(), _repository.loadClientInformation(event.getUniqueId())); + TimingManager.stop(event.getPlayerName() + " pref Account call."); + event.decreaseProcessingCount(); + } + }); } public void savePreferences(Player caller) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java index 9bae81a48..b4672454c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/stats/StatsManager.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map.Entry; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerQuitEvent; @@ -126,8 +127,16 @@ public class StatsManager extends MiniPlugin } @EventHandler - public void loadPlayerStats(RetrieveClientInformationEvent event) + public void loadPlayerStats(final RetrieveClientInformationEvent event) { + event.incrementProcessingCount(); + Bukkit.getServer().getScheduler().runTaskAsynchronously(GetPlugin(), new Runnable() + { + public void run() + { + event.decreaseProcessingCount(); + } + }); /* HA YOU THOUGHT I WAS GOING TO RUN DIDN'T YOU? */ if (true) diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index d4e894465..e65d5966a 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -91,7 +91,7 @@ public class Hub extends JavaPlugin implements IRelation //Main Modules ServerStatusManager serverStatusManager = new ServerStatusManager(this, new LagMeter(this, clientManager)); PacketHandler packetHandler = new PacketHandler(this); - new FriendManager(this, packetHandler); + //new FriendManager(this, packetHandler); PartyManager partyManager = new PartyManager(this, clientManager, preferenceManager); Portal portal = new Portal(this, serverStatusManager.getCurrentServerName()); AntiHack.Initialize(this, punish, portal); diff --git a/Website/LOCWebsite.suo b/Website/LOCWebsite.suo index 047b05239..6f1b215ac 100644 Binary files a/Website/LOCWebsite.suo and b/Website/LOCWebsite.suo differ