diff --git a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PeriodicEvent.java b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PeriodicEvent.java index da62f14bf139dbd67294bf89c4b73b37629e033f..4fabf4cbfc0a07ea32d694a89abe5db7464fb63c 100644 --- a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PeriodicEvent.java +++ b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PeriodicEvent.java @@ -3,6 +3,7 @@ package com.slprojects.slcraftplugin.parallelTasks; import com.slprojects.slcraftplugin.Main; import com.slprojects.slcraftplugin.utils.ConsoleLog; import org.bukkit.ChatColor; +import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; public class PeriodicEvent { @@ -31,6 +32,9 @@ public class PeriodicEvent { } private void periodicEvent() { + for (Player player : plugin.getServer().getOnlinePlayers()){ + plugin.playerDataHandler.savePlayedTime(player); + } ConsoleLog.warning("[SL-Craft] Évènement périodique éxecuté."); // S'exécute à la fin diff --git a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PlayerDataHandler.java b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PlayerDataHandler.java index 751051dc60c08e7bc7211485122a665b48e62332..42a2e4fb6b91638d8e848cb90efadd2e730092b0 100644 --- a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PlayerDataHandler.java +++ b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PlayerDataHandler.java @@ -2,6 +2,7 @@ package com.slprojects.slcraftplugin.parallelTasks; import com.slprojects.slcraftplugin.Main; import com.slprojects.slcraftplugin.utils.ConsoleLog; +import com.slprojects.slcraftplugin.utils.Database; import org.bukkit.ChatColor; import org.bukkit.Statistic; import org.bukkit.entity.Player; @@ -21,12 +22,14 @@ public class PlayerDataHandler { private Connection con; // Playtime private final List<UUID> playTimeUsersIndexes; - private final List<LocalDateTime> playTimeUsersDate; + private final List<LocalDateTime> userSessionJoinDateTime; + private final List<Long> userStoredPlayedTimeBeforeJoining; public PlayerDataHandler(Main plugin) { this.plugin = plugin; playTimeUsersIndexes = new ArrayList<>(); - playTimeUsersDate = new ArrayList<>(); + userSessionJoinDateTime = new ArrayList<>(); + userStoredPlayedTimeBeforeJoining = new ArrayList<>(); } public void joinEvent(Player player) { @@ -34,14 +37,20 @@ public class PlayerDataHandler { con = plugin.bddOpenConn(); playTimeUsersIndexes.add(player.getUniqueId()); - playTimeUsersDate.add(LocalDateTime.now()); + userSessionJoinDateTime.add(LocalDateTime.now()); - insertPlayerName(player); // On check si le nom du joueur est déjà enregistré + boolean playerAlreadyJoinded = insertPlayerName(player); // On check si le nom du joueur est déjà enregistré statsPlayerEntryExit(player, true); // On ajoute son entée checkPlayerJoinedDate(player); // On check si on dipose de sa date de rejoint setPlayerJoinCount(player); // On set le nombre de fois qu'il a rejoint plugin.wildCommand.setPlayerStats(player, getPlayerWildCmdStats(player)); + if(playerAlreadyJoinded){ + userStoredPlayedTimeBeforeJoining.add(Long.valueOf(Database.getUserSetting(player.getUniqueId().toString(), "playedTime"))); + }else{ + userStoredPlayedTimeBeforeJoining.add(0L); + } + // On ferme la bdd try { con.close(); @@ -55,7 +64,7 @@ public class PlayerDataHandler { // On ouvre la bdd con = plugin.bddOpenConn(); - calculatePlayerPlayTime(player); // On actualise le temps de jeu du joueur + savePlayedTime(player); // On actualise le temps de jeu du joueur statsPlayerEntryExit(player, false); // On ajoute son sortie savePlayerWildCmdStats(player, plugin.wildCommand.getPlayerStats(player)); @@ -69,7 +78,8 @@ public class PlayerDataHandler { } // Fonctions - private void insertPlayerName(Player player) { + private boolean insertPlayerName(Player player) { + boolean returnValue = false; try { // On va d'abord regarder si on a déjà renseigné le nom du joueur PreparedStatement rechercheUtilisateur = con.prepareStatement("SELECT * FROM site_userSetting WHERE uuid = ? AND name = 'playerName' AND value = ?"); @@ -78,6 +88,7 @@ public class PlayerDataHandler { ResultSet resultat = rechercheUtilisateur.executeQuery(); if (resultat.next()) { + returnValue = true; // On a déjà renseigné le nom du joueur on va donc vérifier s'il a besoin d'être mis à jour if (!resultat.getString("value").equals(player.getName())) { // On va mettre à jour le nom du joueur @@ -97,6 +108,7 @@ public class PlayerDataHandler { ConsoleLog.warning("Func savePlayerData::insertPlayerName(Player player)"); e.printStackTrace(); } + return returnValue; } private void statsPlayerEntryExit(Player player, boolean isEnter) { @@ -195,36 +207,15 @@ public class PlayerDataHandler { } } - private void calculatePlayerPlayTime(Player player) { + public void savePlayedTime(Player player) { // On va calculer le temps de jeu du joueur + UUID playerUuid = player.getUniqueId(); LocalDateTime timeNow = LocalDateTime.now(); - Duration duration = Duration.between(timeNow, playTimeUsersDate.get(playTimeUsersIndexes.indexOf(player.getUniqueId()))); + Duration duration = Duration.between(timeNow, userSessionJoinDateTime.get(playTimeUsersIndexes.indexOf(playerUuid))); long playedTimeInSeconds = Math.abs(duration.toSeconds()); + long actualPlayedTime = userStoredPlayedTimeBeforeJoining.get(playTimeUsersIndexes.indexOf(playerUuid)) + playedTimeInSeconds; - try { - // On va vérifier si on a déjà renseigné le temps de jeu du joueur par le passé - PreparedStatement recherchePlayTime = con.prepareStatement("SELECT * FROM site_userSetting WHERE uuid = ? AND name = 'playedTime'"); - recherchePlayTime.setString(1, player.getUniqueId().toString()); - ResultSet resultat = recherchePlayTime.executeQuery(); - - if (resultat.next()) { - // On a déjà renseigné ça par le passé, on va donc faire un update - PreparedStatement updatePlayTime = con.prepareStatement("UPDATE site_userSetting SET value = ? WHERE uuid = ? AND name = 'playedTime'"); - updatePlayTime.setString(1, String.valueOf(Long.parseLong(resultat.getString("value")) + playedTimeInSeconds)); - updatePlayTime.setString(2, player.getUniqueId().toString()); - updatePlayTime.executeQuery(); - } else { - // On n'a pas encore renseigné le temps de jeu du joueur, on va donc faire un insert - PreparedStatement insertionPlayTime = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'playedTime',?)"); - insertionPlayTime.setString(1, player.getUniqueId().toString()); - insertionPlayTime.setString(2, String.valueOf(playedTimeInSeconds)); - insertionPlayTime.executeQuery(); - } - - } catch (SQLException e) { - ConsoleLog.warning("Func savePlayerData::increasePlayerPlayTime(Player player)"); - e.printStackTrace(); - } + Database.setUserSetting(playerUuid.toString(), "playedTime", String.valueOf(actualPlayedTime)); } private List<Object> getPlayerWildCmdStats(Player player) { diff --git a/src/main/java/com/slprojects/slcraftplugin/utils/Database.java b/src/main/java/com/slprojects/slcraftplugin/utils/Database.java new file mode 100644 index 0000000000000000000000000000000000000000..1fa988eb49bff191f8e0e218319fd55b73ef0fa1 --- /dev/null +++ b/src/main/java/com/slprojects/slcraftplugin/utils/Database.java @@ -0,0 +1,120 @@ +package com.slprojects.slcraftplugin.utils; + +import com.slprojects.slcraftplugin.Main; +import org.bukkit.configuration.file.FileConfiguration; +import org.mariadb.jdbc.MariaDbPoolDataSource; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import static org.bukkit.Bukkit.getServer; + +public class Database { + static final private String userSettingsTabName = "site_userSetting"; + public static String getUserSetting(String uuid, String key) { + Connection con = bddOpenConn(); + String returnValue = null; + + try { + PreparedStatement query = con.prepareStatement("SELECT * FROM " + userSettingsTabName + " WHERE uuid = ? AND name = ?"); + query.setString(1, uuid); + query.setString(2, key); + ResultSet resultat = query.executeQuery(); + + if(resultat.next()){ + returnValue = resultat.getString("value"); + } + } catch (SQLException e) { + ConsoleLog.danger("Erreur lors de l'exécution de la requête sql." + e); + } + + // On ferme la bdd + try { + con.close(); + } catch (SQLException e) { + ConsoleLog.danger("Impossible de fermer la connexion à la bdd."); + e.printStackTrace(); + } + return returnValue; + } + + public static boolean setUserSetting(String uuid, String key, String value){ + Connection con = bddOpenConn(); + boolean isOperationASuccess = false; + boolean isEntryExists = (getUserSetting(uuid, key) != null); + + try { + if(isEntryExists){ + PreparedStatement updateEntry = con.prepareStatement("UPDATE site_userSetting SET value = ? WHERE uuid = ? AND name = ?"); + updateEntry.setString(1, value); + updateEntry.setString(2, uuid); + updateEntry.setString(3, key); + updateEntry.executeUpdate(); + isOperationASuccess = true; + }else{ + isOperationASuccess = insertUserSettingEntry(uuid, key, value); + } + } catch (SQLException e) { + ConsoleLog.danger("Erreur lors de l'exécution de la requête sql." + e); + } + + // On ferme la bdd + try { + con.close(); + } catch (SQLException e) { + ConsoleLog.danger("Impossible de fermer la connexion à la bdd."); + e.printStackTrace(); + } + + return isOperationASuccess; + } + + private static boolean insertUserSettingEntry(String uuid, String key, String value){ + Connection con = bddOpenConn(); + boolean isOperationASuccess = false; + + try { + PreparedStatement insertEntry = con.prepareStatement("INSERT INTO site_userSetting (uuid, name, value) VALUES (?, ?, ?)"); + insertEntry.setString(1, uuid); + insertEntry.setString(2, key); + insertEntry.setString(3, value); + insertEntry.executeQuery(); + isOperationASuccess = true; + } catch (SQLException e) { + ConsoleLog.danger("Erreur lors de l'exécution de la requête sql." + e); + } + + // On ferme la bdd + try { + con.close(); + } catch (SQLException e) { + ConsoleLog.danger("Impossible de fermer la connexion à la bdd."); + e.printStackTrace(); + } + + return isOperationASuccess; + } + + public static Connection bddOpenConn() { + FileConfiguration config = getServer().getPluginManager().getPlugin(Main.pluginName).getConfig(); + Connection conn = null; + + try { + Class.forName("org.mariadb.jdbc.MariaDbPoolDataSource"); + } catch (ClassNotFoundException e) { + ConsoleLog.danger("Il manque le driver MariaDB!"); + } + + try { + MariaDbPoolDataSource dataSource = new MariaDbPoolDataSource("jdbc:mariadb://" + config.getString("database.host") + "/" + config.getString("database.database") + "?user=" + config.getString("database.user") + "&password=" + config.getString("database.password") + "&maxPoolSize=10"); + conn = dataSource.getConnection(); + //ConsoleLog.success("Connexion à la base de données réussie!"); + } catch (SQLException e) { + ConsoleLog.danger("Erreur lors de la connexion à la base de données."); + } + + return conn; + } +}