From b494d223eb249060bca10473f648fea0770c4d1d Mon Sep 17 00:00:00 2001
From: SofianeLasri <alasri250@gmail.com>
Date: Sat, 10 Sep 2022 19:24:40 +0200
Subject: [PATCH] =?UTF-8?q?Cr=C3=A9ation=20d'une=20classe=20facilitant=20l?=
 =?UTF-8?q?a=20communication=20avec=20la=20Base=20de=20donn=C3=A9e,=20et?=
 =?UTF-8?q?=20modification=20de=20la=20strat=C3=A9gie=20de=20sauvegarde=20?=
 =?UTF-8?q?du=20temps=20de=20jeu.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../parallelTasks/PeriodicEvent.java          |   4 +
 .../parallelTasks/PlayerDataHandler.java      |  55 ++++----
 .../slcraftplugin/utils/Database.java         | 120 ++++++++++++++++++
 3 files changed, 147 insertions(+), 32 deletions(-)
 create mode 100644 src/main/java/com/slprojects/slcraftplugin/utils/Database.java

diff --git a/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PeriodicEvent.java b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/PeriodicEvent.java
index da62f14..4fabf4c 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 751051d..42a2e4f 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 0000000..1fa988e
--- /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;
+    }
+}
-- 
GitLab