/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.arkhamnetwork.arcade.commons.userstorage;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
import java.util.UUID;
import org.arkhamnetwork.arcade.commons.async.Callback;
import org.arkhamnetwork.arcade.commons.event.ProfileLoadEvent;
import org.arkhamnetwork.arcade.commons.storage.ArcadeHashMap;
import org.arkhamnetwork.arcade.core.Arcade;
import org.arkhamnetwork.arcade.core.configuration.ArcadeConfiguration;
import org.arkhamnetwork.arcade.miniplugin.mysqlconnector.mySQLDatabaseConnection;
import org.arkhamnetwork.arcade.miniplugin.mysqlconnector.mySQLStatementStore;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
/**
*
* @author devan_000
*/
public class UserManager implements Listener {
private static Arcade plugin = Arcade.getInstance();
private static ArcadeHashMap<UUID, PlayerProfile> cachedStoredUsers = new ArcadeHashMap<>();
public static void registerUser(final UUID uuid,
final Callback<PlayerProfile> callback) {
if (cachedStoredUsers.containsKey(uuid)) {
callback.done(cachedStoredUsers.get(uuid));
return;
}
plugin.getServer().getScheduler()
.runTaskAsynchronously(plugin, new Runnable() {
public void run() {
try {
if (!asyncPlayerDataExists(uuid)) {
asyncCreatePlayerData(uuid);
}
PlayerProfile done = asyncLoadPlayerData(uuid);
cachedStoredUsers.put(uuid, done);
callback.done(done);
plugin.getServer().getPluginManager()
.callEvent(new ProfileLoadEvent(done));
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
public static void unregisterUser(final UUID uuid) {
cachedStoredUsers.remove(uuid);
}
public static void asyncSetProfileData(UUID uuid, int credits, int score,
List<PlayerRank> ranks, String lastSeen, int gamesPlayed)
throws Exception {
PreparedStatement preparedStatement = null;
try {
preparedStatement = mySQLDatabaseConnection.getConnection()
.prepareStatement(mySQLStatementStore.updateUserStatement);
preparedStatement.setString(1, uuid.toString());
preparedStatement.setInt(2, credits);
preparedStatement.setInt(3, score);
preparedStatement.setString(4, ranks.toString().replace("[", "")
.replace("]", ""));
preparedStatement.setString(5, lastSeen);
preparedStatement.setInt(6, gamesPlayed);
preparedStatement.setString(7, uuid.toString());
preparedStatement.execute();
} finally {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
}
}
private static boolean asyncPlayerDataExists(UUID uuid) throws Exception {
PreparedStatement preparedStatement = null;
ResultSet results = null;
try {
preparedStatement = mySQLDatabaseConnection.getConnection()
.prepareStatement(mySQLStatementStore.getUserStatement);
preparedStatement.setString(1, uuid.toString());
results = preparedStatement.executeQuery();
while (results.next()) {
return true;
}
return false;
} finally {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
if (results != null && !results.isClosed()) {
results.close();
}
}
}
private static void asyncCreatePlayerData(UUID uuid) throws Exception {
PreparedStatement preparedStatement = null;
ResultSet results = null;
try {
preparedStatement = mySQLDatabaseConnection.getConnection()
.prepareStatement(
mySQLStatementStore.createUserDataStatement);
preparedStatement.setString(1, uuid.toString());
preparedStatement.setInt(2, 0);
preparedStatement.setInt(3, 0);
preparedStatement.setString(4, " ");
preparedStatement.setString(5, " ");
preparedStatement.setInt(6, 0);
preparedStatement.execute();
} finally {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
if (results != null && !results.isClosed()) {
results.close();
}
}
}
private static PlayerProfile asyncLoadPlayerData(UUID uuid)
throws Exception {
PreparedStatement preparedStatement = null;
ResultSet results = null;
try {
preparedStatement = mySQLDatabaseConnection.getConnection()
.prepareStatement(mySQLStatementStore.getUserStatement);
preparedStatement.setString(1, uuid.toString());
results = preparedStatement.executeQuery();
while (results.next()) {
return new PlayerProfile(uuid, results.getInt("credits"),
results.getInt("score"), results.getString("ranks")
.split(","), results.getString("last_seen"),
results.getInt("games_played"));
}
return null;
} finally {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
if (results != null && !results.isClosed()) {
results.close();
}
}
}
@EventHandler
public void onProfileLoad(final ProfileLoadEvent event) {
plugin.getServer().getScheduler()
.runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
event.getProfile()
.updateData(
event.getProfile()
.getArcadeCreditBalance(),
event.getProfile().getScore(),
event.getProfile().getPlayerRanks(),
(ArcadeConfiguration.getServerName()
+ "," + (int) (System
.currentTimeMillis() / 1000L)),
event.getProfile().getGamesPlayed());
}
});
}
}