Select Git revision
PlayerDataHandler.java

Sofiane Lasri authored
Portage des appels aux paramètres utilisateurs de la classe PlayerDataHandler pour utiliser les deux fonctions de Database.
PlayerDataHandler.java 11.23 KiB
package com.slprojects.slcraftplugin.parallelTasks.dataHandlers;
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;
import java.sql.*;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class PlayerDataHandler implements dataHandler {
private final Main plugin;
private Connection con;
// Playtime
public final PlayedTimeHandler playedTimeHandler;
private final List<UUID> playerIndexes;
private final List<Boolean> playerAlreadyJoined;
public PlayerDataHandler(Main plugin) {
this.plugin = plugin;
this.playedTimeHandler = new PlayedTimeHandler(plugin);
playerIndexes = new ArrayList<>();
playerAlreadyJoined = new ArrayList<>();
}
@Override
public void joinEvent(Player player) {
// On ouvre la bdd
con = plugin.bddOpenConn();
playerIndexes.add(player.getUniqueId());
playerAlreadyJoined.add(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));
playedTimeHandler.joinEvent(player);
// On ferme la bdd
try {
con.close();
} catch (SQLException e) {
ConsoleLog.warning("Impossible de fermer la connexion à la bdd. Func savePlayerData::saveOnJoin(Player player)");
e.printStackTrace();
}
}
@Override
public void quitEvent(Player player) {
// On ouvre la bdd
con = plugin.bddOpenConn();
playedTimeHandler.quitEvent(player);
statsPlayerEntryExit(player, false); // On ajoute son sortie
savePlayerWildCmdStats(player, plugin.wildCommand.getPlayerStats(player));
// On ferme la bdd
try {
con.close();
} catch (SQLException e) {
ConsoleLog.warning("Impossible de fermer la connexion à la bdd. Func savePlayerData::saveOnQuit(Player player)");
e.printStackTrace();
}
}
// Fonctions
private boolean insertPlayerName(Player player) {
String savedPlayerName = Database.getUserSetting(player.getUniqueId().toString(), "playerName");
if (savedPlayerName != null) {
// On a déjà renseigné le nom du joueur on va donc vérifier s'il a besoin d'être mis à jour
if (!savedPlayerName.equals(player.getName())) {
Database.setUserSetting(player.getUniqueId().toString(), "playerName", player.getName());
}
return true;
} else {
// On peut insérer le nom du joueur
Database.setUserSetting(player.getUniqueId().toString(), "playerName", player.getName());
return false;
}
}
private void statsPlayerEntryExit(Player player, boolean isEnter) {
try {
PreparedStatement insertPlayerEntryOrExit = con.prepareStatement("INSERT INTO site_playerEntries (uuid, isJoin, date) VALUES (?, ?, ?)");
insertPlayerEntryOrExit.setString(1, player.getUniqueId().toString());
insertPlayerEntryOrExit.setBoolean(2, isEnter);
insertPlayerEntryOrExit.setString(3, Timestamp.valueOf(java.time.LocalDateTime.now()).toString());
insertPlayerEntryOrExit.executeQuery();
} catch (SQLException e) {
ConsoleLog.warning("Func savePlayerData::playerAddPlayerEntryOrExit(Player player, boolean isEnter)");
e.printStackTrace();
}
}
private void checkPlayerJoinedDate(Player player) {
try {
// On va vérifier si on l'a déjà renseigné par le passé
String joinedDate = Database.getUserSetting(player.getUniqueId().toString(), "joinedDate");
if (joinedDate == null) {
// On n'a pas renseigné la date de création du joueur
if (player.hasPlayedBefore()) {
// On va piocher la date d'inscription chez CoreProtect (si elle existe)
// On la prend chez CoreProtect car le plugin a été installé dans les premières semaines du serveur. Il a donc bcp plus de données que nous concernant les anciens joueurs.
PreparedStatement rechercheDateInscription = con.prepareStatement("SELECT time FROM co_user WHERE uuid = ?");
rechercheDateInscription.setString(1, player.getUniqueId().toString());
ResultSet resultat = rechercheDateInscription.executeQuery();
if (resultat.next()) {
// On insère la date d'inscription
Database.setUserSetting(player.getUniqueId().toString(),
"joinedDate",
java.sql.Timestamp.valueOf(
LocalDateTime.ofEpochSecond(
Long.parseLong(resultat.getString("time")),
0,
ZoneOffset.UTC
)
).toString()
);
// On va précisier que la date d'inscription a été trouvée chez CoreProtect
ConsoleLog.info("Le joueur " + ChatColor.GOLD + player.getName() + ChatColor.RESET + " n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs. On lui a donc attribué comme date de création du compte, celle que détenait CoreProtect.");
} else {
// On insère la date d'inscription (du coup on considère que Le joueur n'a pas joué avant, malgré la condition)
Database.setUserSetting(
player.getUniqueId().toString(),
"joinedDate",
java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()).toString()
);
// On va préciser que la date d'inscription n'a pas été trouvée chez CoreProtect
Database.setUserSetting(player.getUniqueId().toString(),
"inaccurrateJoinedDate",
"true"
);
// On est daccord que ceci n'est pas censé arriver, cela ne concerne que mes potes n'étant venus que durant les premières semaines du serveur.
ConsoleLog.info("Le joueur " + ChatColor.GOLD + player.getName() + ChatColor.RESET + " n'avait pas de données sur sa date d'inscription dans dans la table des paramètres utilisateurs, ni dans la table des utilisateurs de CoreProtect. On lui a donc attribué comme date de création du compte, la date du début de sa partie.");
}
} else {
// Le joueur est nouveau, on insère la date d'inscription
Database.setUserSetting(
player.getUniqueId().toString(),
"joinedDate",
java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()).toString()
);
}
}
} catch (SQLException e) {
ConsoleLog.warning("Func savePlayerData::checkJoinedDate(Player player)");
e.printStackTrace();
}
}
void setPlayerJoinCount(Player player) {
Database.setUserSetting(player.getUniqueId().toString(), "joins", String.valueOf(player.getStatistic(Statistic.LEAVE_GAME) + 1));
}
private List<Object> getPlayerWildCmdStats(Player player) {
// Indexes:
// - 0: Nombre d'utilisation du jour
// - 1: Date de la dernière commande
String playerLastUsed = Database.getUserSetting(player.getUniqueId().toString(), "wildCmdLastUsed");
if (playerLastUsed != null) {
LocalDateTime lastUsed = Timestamp.valueOf(playerLastUsed).toLocalDateTime();
if (ChronoUnit.HOURS.between(lastUsed, LocalDateTime.now()) > 24) {
return new ArrayList<>() {
{
add(0);
add(lastUsed);
}
};
} else {
String playerAskNum = Database.getUserSetting(player.getUniqueId().toString(), "wildCmdAskNum");
if (playerAskNum != null) {
return new ArrayList<>() {
{
add(Integer.valueOf(playerAskNum));
add(lastUsed);
}
};
} else {
ConsoleLog.warning("Func savePlayerData::getPlayerWildCmdStats(Player player)");
ConsoleLog.warning("Fonctionnement anormal! On dispose de la date de 'wildCmdLastUsed' mais pas de 'wildCmdAskNum' pour le joueur " + player.getName() + " UUID: " + player.getUniqueId());
ConsoleLog.warning("Passage de 'wildCmdAskNum' à 0.");
return new ArrayList<>() {
{
add(0);
add(lastUsed);
}
};
}
}
} else {
ConsoleLog.info("Mise à jour du joueur " + player.getName() + " UUID: " + player.getUniqueId());
ConsoleLog.info("Création des champs 'wildCmdLastUsed' et 'wildCmdAskNum'");
// On va insérer une date bidon pour éviter un potentiel cooldown
LocalDateTime dateBidon = LocalDateTime.parse("2001-12-11 12:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
Database.setUserSetting(player.getUniqueId().toString(), "wildCmdLastUsed", Timestamp.valueOf(dateBidon).toString());
Database.setUserSetting(player.getUniqueId().toString(), "wildCmdAskNum", "0");
return new ArrayList<>() {
{
add(0);
add(dateBidon);
}
};
}
}
public void savePlayerWildCmdStats(Player player, List<Object> stats) {
// Indexes:
// - 0: Nombre d'utilisation du jour
// - 1: Date de la dernière commande
// On va zapper la vérification de présence car on suppose que la commande getWildCmdStats avait réussie
Database.setUserSetting(player.getUniqueId().toString(), "wildCmdAskNum", String.valueOf(stats.get(0)));
Database.setUserSetting(player.getUniqueId().toString(), "wildCmdLastUsed", Timestamp.valueOf((LocalDateTime) stats.get(1)).toString());
}
public boolean playerAlreadyJoined(Player player) {
return playerAlreadyJoined.get(playerIndexes.indexOf(player.getUniqueId()));
}
}