Skip to content
Snippets Groups Projects
Commit 6b897976 authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

1.4

parent a462c5b5
Branches
Tags
No related merge requests found
......@@ -6,7 +6,7 @@
<groupId>com.slprojects</groupId>
<artifactId>SLCraftPlugin</artifactId>
<version>1.3</version>
<version>1.4</version>
<packaging>jar</packaging>
<name>SLCraftPlugin</name>
......
......@@ -2,6 +2,7 @@
package com.slprojects.slcraftplugin;
import com.slprojects.slcraftplugin.commandes.linkCodeCommand;
import com.slprojects.slcraftplugin.commandes.wildCommand;
import org.bukkit.ChatColor;
import org.bukkit.Sound;
......@@ -15,14 +16,12 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.mariadb.jdbc.MariaDbPoolDataSource;
import java.io.FileReader;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
......@@ -60,12 +59,15 @@ public final class Main extends JavaPlugin implements Listener {
// On initialise la base de donnée
initDatabase();
wildCommandActiveUsers = new ArrayList<UUID>();
playTimeUsersIndexes = new ArrayList<UUID>();
playTimeUsersDate = new ArrayList<LocalDateTime>();
wildCommandActiveUsers = new ArrayList<>();
playTimeUsersIndexes = new ArrayList<>();
playTimeUsersDate = new ArrayList<>();
wildCommand wildCommand = new wildCommand(this);
getCommand("wild").setExecutor(wildCommand);
linkCodeCommand linkCodeCommand = new linkCodeCommand(this);
getCommand("getLinkCode").setExecutor(linkCodeCommand);
getLogger().info(ChatColor.GREEN+"SL-Craft | Plugin démarré");
}
......@@ -82,9 +84,11 @@ public final class Main extends JavaPlugin implements Listener {
playTimeUsersIndexes.add(e.getPlayer().getUniqueId());
playTimeUsersDate.add(LocalDateTime.now());
// On affiche le message de bienvenue
String welcomeMessage = PlaceholderAPI.setPlaceholders(e.getPlayer(), getConfig().getString("player-join-message"));
e.setJoinMessage(welcomeMessage);
// Et on joue un petit son chez tous les joueurs
for(Player p : getServer().getOnlinePlayers()){
p.sendMessage(welcomeMessage);
if(getConfig().getBoolean("player-join-playSound")){
p.playSound(p.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 0);
}
......@@ -96,9 +100,8 @@ public final class Main extends JavaPlugin implements Listener {
public void onPlayerQuit(PlayerQuitEvent e) {
savePlayer(e.getPlayer());
String quitMessage = PlaceholderAPI.setPlaceholders(e.getPlayer(), getConfig().getString("player-quit-message"));
e.setQuitMessage(quitMessage);
for(Player p : getServer().getOnlinePlayers()){
//p.sendMessage(quitMessage);
p.sendMessage(quitMessage);
}
}
......@@ -106,25 +109,30 @@ public final class Main extends JavaPlugin implements Listener {
@SuppressWarnings("unchecked")
public void savePlayer(Player player) {
JSONObject target = new JSONObject();
// On ajoute l'uuid et son nom
target.put("uuid", player.getUniqueId().toString());
target.put("name", player.getName());
// La date de join (locale, au cas où CoreProtect ne l'a pas)
target.put("joinedDate", playTimeUsersDate.get(playTimeUsersIndexes.indexOf(player.getUniqueId())).toString());
// On calcule le temps de jeu
LocalDateTime timeNow = LocalDateTime.now();
Duration duration = Duration.between(timeNow, playTimeUsersDate.get(playTimeUsersIndexes.indexOf(player.getUniqueId())));
long playedTimeInSeconds = Math.abs(duration.toSeconds());
target.put("time", playedTimeInSeconds);
// On ajoute le temps de jeu au joueur
target.put("playedTime", playedTimeInSeconds);
playTimeUsersDate.remove(playTimeUsersIndexes.indexOf(player.getUniqueId()));
playTimeUsersIndexes.remove(player.getUniqueId());
target.put("joins", Integer.valueOf(player.getStatistic(Statistic.LEAVE_GAME) + 1));
target.put("joins", player.getStatistic(Statistic.LEAVE_GAME) + 1);
target.put("hasPlayedBefore", player.hasPlayedBefore());
writePlayer(target);
}
@SuppressWarnings("unchecked")
private void writePlayer(JSONObject target) {
JSONParser jsonParser = new JSONParser();
// On ouvre la bdd
Connection con = bddOpenConn();
try {
......@@ -139,29 +147,107 @@ public final class Main extends JavaPlugin implements Listener {
// On insère la dernière date de join
PreparedStatement insertionLastJoin = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'playedTime',?)");
insertionLastJoin.setString(1, target.get("uuid").toString());
insertionLastJoin.setString(2, target.get("time").toString());
resultat = insertionLastJoin.executeQuery();
insertionLastJoin.setString(2, target.get("playedTime").toString());
insertionLastJoin.executeQuery();
// On insère le nombre de connexions
PreparedStatement insertionNbJoins = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joins',?)");
insertionNbJoins.setString(1, target.get("uuid").toString());
insertionNbJoins.setString(2, target.get("joins").toString());
resultat = insertionNbJoins.executeQuery();
insertionNbJoins.executeQuery();
// On va regarder si l'utilisateur a déjà joué avant (vu qu'on avait pas de données sur ce joueur)
if(target.get("hasPlayedBefore").toString().equals("true")){
// 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, target.get("uuid").toString());
resultat = rechercheDateInscription.executeQuery();
if(resultat.next()){
// On insère la date d'inscription
PreparedStatement insertionDateInscription = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joinedDate',?)");
insertionDateInscription.setString(1, target.get("uuid").toString());
insertionDateInscription.setString(2, java.sql.Timestamp.valueOf(LocalDateTime.ofEpochSecond(Long.parseLong(resultat.getString("time")), 0, ZoneOffset.UTC)).toString()); // Il faut convertir le timestamp (epoch second) en date
insertionDateInscription.executeQuery();
// On va précisier que la date d'inscription a été trouvée chez CoreProtect
getLogger().info("L'utilisateur "+ChatColor.GOLD+target.get("name").toString()+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 l'utilisateur n'a pas joué avant, malgré la condition)
PreparedStatement insertionDateInscription = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joinedDate',?)");
insertionDateInscription.setString(1, target.get("uuid").toString());
insertionDateInscription.setString(2, java.sql.Timestamp.valueOf(target.get("joinedDate").toString()).toString());
insertionDateInscription.executeQuery();
// On va préciser que la date d'inscription n'a pas été trouvée chez CoreProtect
PreparedStatement insertionInaccurrateJoinedDate = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'inaccurrateJoinedDate',?)");
insertionInaccurrateJoinedDate.setString(1, target.get("uuid").toString());
insertionInaccurrateJoinedDate.setString(2, "true");
insertionInaccurrateJoinedDate.executeQuery();
getLogger().info("L'utilisateur "+ChatColor.GOLD+target.get("name").toString()+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{
// C'est un nouvel utilisateur, on peut lui attribuer la date d'inscription précédement calculée
PreparedStatement insertionDateInscription = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joinedDate',?)");
insertionDateInscription.setString(1, target.get("uuid").toString());
insertionDateInscription.setString(2, java.sql.Timestamp.valueOf(target.get("joinedDate").toString()).toString());
insertionDateInscription.executeQuery();
}
}else{
PreparedStatement tempsJeuJoueur = con.prepareStatement("SELECT value FROM site_userSetting WHERE uuid = ? AND name = 'playedTime'");
tempsJeuJoueur.setString(1, target.get("uuid").toString());
resultat = tempsJeuJoueur.executeQuery();
if(resultat.next()) {
int totalPlayedTime = parseInt(resultat.getString(1)) + parseInt(target.get("time").toString());
int totalPlayedTime = parseInt(resultat.getString(1)) + parseInt(target.get("playedTime").toString());
PreparedStatement modifyPlayedTime = con.prepareStatement("UPDATE `site_userSetting` SET `value`=? WHERE `uuid`=? AND `name`='playedTime'");
modifyPlayedTime.setInt(1, totalPlayedTime);
modifyPlayedTime.setString(2, target.get("uuid").toString());
resultat = modifyPlayedTime.executeQuery();
modifyPlayedTime.executeQuery();
PreparedStatement modifyNbJoins = con.prepareStatement("UPDATE `site_userSetting` SET `value`=? WHERE `uuid`=? AND `name`='joins'");
modifyNbJoins.setString(1, target.get("joins").toString());
modifyNbJoins.setString(2, target.get("uuid").toString());
resultat = modifyNbJoins.executeQuery();
modifyNbJoins.executeQuery();
// On va regarder s'il a sa date d'inscription de renseignée
PreparedStatement rechercheDateInscription = con.prepareStatement("SELECT * FROM site_userSetting WHERE uuid = ? AND name = 'joinedDate'");
rechercheDateInscription.setString(1, target.get("uuid").toString());
resultat = rechercheDateInscription.executeQuery();
if(!resultat.next()){
// On va regarder si l'on dispose de sa date d'inscription chez CoreProtect
rechercheDateInscription = con.prepareStatement("SELECT time FROM co_user WHERE uuid = ?");
rechercheDateInscription.setString(1, target.get("uuid").toString());
resultat = rechercheDateInscription.executeQuery();
if(resultat.next()){
// On insère la date d'inscription
PreparedStatement insertionDateInscription = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joinedDate',?)");
insertionDateInscription.setString(1, target.get("uuid").toString());
insertionDateInscription.setString(2, java.sql.Timestamp.valueOf(LocalDateTime.ofEpochSecond(Long.parseLong(resultat.getString("time")), 0, ZoneOffset.UTC)).toString()); // Il faut convertir le timestamp (epoch second) en date
insertionDateInscription.executeQuery();
// On va précisier que la date d'inscription a été trouvée chez CoreProtect
getLogger().info("L'utilisateur "+ChatColor.GOLD+target.get("name").toString()+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, comme précédement, on prend la date d'inscription locale)
PreparedStatement insertionDateInscription = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joinedDate',?)");
insertionDateInscription.setString(1, target.get("uuid").toString());
insertionDateInscription.setString(2, java.sql.Timestamp.valueOf(target.get("joinedDate").toString()).toString());
insertionDateInscription.executeQuery();
// On va préciser que la date d'inscription n'a pas été trouvée chez CoreProtect
PreparedStatement insertionInaccurrateJoinedDate = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'inaccurrateJoinedDate',?)");
insertionInaccurrateJoinedDate.setString(1, target.get("uuid").toString());
insertionInaccurrateJoinedDate.setString(2, "true");
insertionInaccurrateJoinedDate.executeQuery();
getLogger().info("L'utilisateur "+ChatColor.GOLD+target.get("name").toString()+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{
getLogger().warning(ChatColor.RED+"Erreur, nous n'avons pas de resultats pour la requête: SELECT value FROM site_userSetting WHERE uuid = '"+target.get("uuid")+"' AND name = playedTime");
}
......@@ -206,7 +292,7 @@ public final class Main extends JavaPlugin implements Listener {
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();
getLogger().info(ChatColor.GREEN+"Connexion à la base de données réussie!");
//getLogger().info(ChatColor.GREEN+"Connexion à la base de données réussie!");
}// ou les saisir
catch (SQLException e) {
getLogger().warning(ChatColor.RED+"Erreur lors de la connexion à la base de données.");
......@@ -224,7 +310,16 @@ public final class Main extends JavaPlugin implements Listener {
" `value` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,\n" +
" PRIMARY KEY (`uuid`,`name`) USING BTREE\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
ResultSet rs=ps.executeQuery();
ps.executeQuery();
ps=con.prepareStatement("CREATE TABLE IF NOT EXISTS `site_linkCode` (\n" +
" `uuid` VARCHAR(36) NOT NULL,\n" +
" `code` VARCHAR(8) NOT NULL,\n" +
" `time` TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),\n" +
" `used` BOOLEAN,\n" +
" PRIMARY KEY (`uuid`),\n" +
" UNIQUE INDEX `code` (`code`)\n" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
ps.executeQuery();
con.close();
}catch(Exception e){
getLogger().warning(ChatColor.RED+"Erreur lors de l'exécution de initDatabase(): "+e);
......
package com.slprojects.slcraftplugin.commandes;
import com.slprojects.slcraftplugin.Main;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.time.LocalDateTime;
import java.util.Random;
public class linkCodeCommand implements CommandExecutor {
// Variables
private final Main plugin;
public linkCodeCommand(Main plugin){
// On récupère la classe parente pour les paramètres
this.plugin = plugin;
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args){
if (sender instanceof Player){
Player player = (Player) sender;
// On ouvre la bdd
Connection con = plugin.bddOpenConn();
try{
// On créé le code
int leftLimit = 48; // numeral '0'
int rightLimit = 122; // letter 'z'
int targetStringLength = 8;
Random random = new Random();
String generatedString = random.ints(leftLimit, rightLimit + 1)
.filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
.limit(targetStringLength)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
// On va regarder si l'utilisateur a déjà généré un code auparavant
PreparedStatement rechercheLinkingCode = con.prepareStatement("SELECT * FROM site_linkCode WHERE uuid = ?");
rechercheLinkingCode.setString(1, player.getUniqueId().toString());
ResultSet resultat = rechercheLinkingCode.executeQuery();
if(resultat.next()){
PreparedStatement modifyAccountLinkingCode = con.prepareStatement("UPDATE `site_linkCode` SET `code`=?, `time`=?, `used`='0' WHERE `uuid`=?");
modifyAccountLinkingCode.setString(1, generatedString);
modifyAccountLinkingCode.setString(2, java.sql.Timestamp.valueOf(LocalDateTime.now()).toString());
modifyAccountLinkingCode.setString(3, player.getUniqueId().toString());
modifyAccountLinkingCode.executeQuery();
}else{
PreparedStatement insertionAccountLinkingCode = con.prepareStatement("INSERT INTO site_linkCode (`uuid`, `code`, `time`, `used`) VALUES (?, ?, ?, '0')");
insertionAccountLinkingCode.setString(1, player.getUniqueId().toString());
insertionAccountLinkingCode.setString(2, generatedString);
insertionAccountLinkingCode.setString(3, java.sql.Timestamp.valueOf(LocalDateTime.now()).toString());
insertionAccountLinkingCode.executeQuery();
}
player.sendMessage("Utilise ce code pour lier ton compte: "+ChatColor.GREEN+generatedString);
player.sendMessage(ChatColor.GRAY+"Ce code à usage unique expirera dans 5 minutes.");
plugin.getLogger().info("Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a généré le code "+ChatColor.GREEN+generatedString+ChatColor.RESET+ChatColor.GRAY+" - Il expirera le "+java.sql.Timestamp.valueOf(LocalDateTime.now().plusMinutes(5)).toString());
}catch (Exception e){
e.printStackTrace();
}
}
return true;
}
}
......@@ -12,3 +12,9 @@ commands:
aliases: [wild, tpr, tprandom]
usage: /wild
permission: slcraft.wild
getlinkcode:
description: Te permet d'obtenir un code pour associer ton compte Minecraft au site internet du serveur.'
aliases: [ getlinkcode ]
usage: /getlinkcode
permission: slcraft.getlinkcode
\ No newline at end of file
No preview for this file type
File added
name: SLCraftPlugin
version: '1.3'
version: '1.4'
main: com.slprojects.slcraftplugin.Main
depend: [PlaceholderAPI]
api-version: 1.18
......@@ -12,3 +12,9 @@ commands:
aliases: [wild, tpr, tprandom]
usage: /wild
permission: slcraft.wild
getlinkcode:
description: Te permet d'obtenir un code pour associer ton compte Minecraft au site internet du serveur.'
aliases: [ getlinkcode ]
usage: /getlinkcode
permission: slcraft.getlinkcode
\ No newline at end of file
#Generated by Maven
#Fri Jan 28 14:26:51 CET 2022
#Sat Mar 05 15:11:15 CET 2022
groupId=com.slprojects
artifactId=SLCraftPlugin
version=1.3
version=1.4
com\slprojects\slcraftplugin\commandes\wildCommand.class
com\slprojects\slcraftplugin\Main.class
com\slprojects\slcraftplugin\commandes\linkCodeCommand.class
com\slprojects\slcraftplugin\commandes\wildCommand$1.class
C:\Users\sofia\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\commandes\wildCommand.java
C:\Users\sofia\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\Main.java
C:\Users\sofia\Documents\Minecraft Plugin Workspace\SL-Craft Plugin\src\main\java\com\slprojects\slcraftplugin\commandes\linkCodeCommand.java
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment