diff --git a/src/main/java/com/slprojects/slcraftplugin/Main.java b/src/main/java/com/slprojects/slcraftplugin/Main.java index 023443147788d34ddb2e5a89ca68ed233776f85b..e0e04cec9a1f67627d2753299f01a6eb07a7e936 100644 --- a/src/main/java/com/slprojects/slcraftplugin/Main.java +++ b/src/main/java/com/slprojects/slcraftplugin/Main.java @@ -1,9 +1,10 @@ package com.slprojects.slcraftplugin; -import com.slprojects.slcraftplugin.commandes.linkCodeCommand; -import com.slprojects.slcraftplugin.commandes.wildCommand; -import com.slprojects.slcraftplugin.tachesParalleles.savePlayerData; -import com.slprojects.slcraftplugin.tachesParalleles.internalWebServer; +import com.slprojects.slcraftplugin.commands.admins.wildReset; +import com.slprojects.slcraftplugin.commands.publics.linkCode; +import com.slprojects.slcraftplugin.commands.publics.wild; +import com.slprojects.slcraftplugin.parallelTasks.playerDataHandler; +import com.slprojects.slcraftplugin.parallelTasks.internalWebServer; import me.clip.placeholderapi.PlaceholderAPI; import net.luckperms.api.LuckPerms; import net.luckperms.api.cacheddata.CachedMetaData; @@ -38,8 +39,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.UUID; -import java.util.concurrent.TimeUnit; -import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -48,7 +47,8 @@ public final class Main extends JavaPlugin implements Listener { private List<UUID> wildCommandActiveUsers; private static FileConfiguration config; private static LuckPerms luckPermsApi; - private com.slprojects.slcraftplugin.tachesParalleles.savePlayerData savePlayerData; + public playerDataHandler playerDataHandler; + public wild wildCommand; // Fonctions appelées à des évènements clés @Override @@ -59,7 +59,7 @@ public final class Main extends JavaPlugin implements Listener { // On initialise les listeners getServer().getPluginManager().registerEvents(this, this); } else { - getServer().getConsoleSender().sendMessage(ChatColor.RED+"[\"+ this.getName() +\"] PlaceholderAPI n'est pas accessible!"); + getServer().getConsoleSender().sendMessage(ChatColor.RED+"["+ this.getName() +"] PlaceholderAPI n'est pas accessible!"); getServer().getPluginManager().disablePlugin(this); } @@ -84,17 +84,19 @@ public final class Main extends JavaPlugin implements Listener { reloadConfig(); config = getConfig(); updateConfig(); - savePlayerData = new savePlayerData(this); + playerDataHandler = new playerDataHandler(this); // On initialise la base de donnée initDatabase(); - wildCommandActiveUsers = new ArrayList<>(); - wildCommand wildCommand = new wildCommand(this); - Objects.requireNonNull(getCommand("wild")).setExecutor(wildCommand); + wildCommand = new wild(this); + getCommand("wild").setExecutor(wildCommand); - linkCodeCommand linkCodeCommand = new linkCodeCommand(this); - Objects.requireNonNull(getCommand("getLinkCode")).setExecutor(linkCodeCommand); + wildReset wildReset = new wildReset(this); + getCommand("reset-wild").setExecutor(wildReset); + + linkCode linkCodeCommand = new linkCode(this); + getCommand("getLinkCode").setExecutor(linkCodeCommand); internalWebServer.startServer(this); @@ -106,14 +108,14 @@ public final class Main extends JavaPlugin implements Listener { // Plugin shutdown logic getServer().getConsoleSender().sendMessage(ChatColor.RED+"SL-Craft | Plugin éteint"); - getServer().getOnlinePlayers().forEach(player -> savePlayerData.saveOnQuit(player)); + getServer().getOnlinePlayers().forEach(player -> playerDataHandler.quitEvent(player)); } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerJoin(PlayerJoinEvent e) { // On désactive le message par défaut e.joinMessage(null); - savePlayerData.saveOnJoin(e.getPlayer()); + playerDataHandler.joinEvent(e.getPlayer()); // On affiche le message de bienvenue String welcomeMessage = PlaceholderAPI.setPlaceholders(e.getPlayer(), Objects.requireNonNull(getConfig().getString("player-join-message"))); @@ -131,7 +133,7 @@ public final class Main extends JavaPlugin implements Listener { public void onPlayerQuit(PlayerQuitEvent e) { // On désactive le message par défaut e.quitMessage(null); - savePlayerData.saveOnQuit(e.getPlayer()); + playerDataHandler.quitEvent(e.getPlayer()); String quitMessage = PlaceholderAPI.setPlaceholders(e.getPlayer(), Objects.requireNonNull(getConfig().getString("player-quit-message"))); for(Player p : getServer().getOnlinePlayers()){ p.sendMessage(quitMessage); @@ -268,26 +270,6 @@ public final class Main extends JavaPlugin implements Listener { sendMessageToDiscord(message, "SL-Craft"); } - // Propre à la commande wild: évite les spams de la commande - public boolean checkActiveUserForWildCommand(UUID playerUuid){ - if(wildCommandActiveUsers.contains(playerUuid)){ - return false; - }else{ - wildCommandActiveUsers.add(playerUuid); - return true; - } - } - public void removeActiveUserForWildCommand(UUID playerUuid){ - if(wildCommandActiveUsers.contains(playerUuid)){ - try { - TimeUnit.SECONDS.sleep(5); - } catch (InterruptedException e) { - e.printStackTrace(); - } - wildCommandActiveUsers.remove(playerUuid); - } - } - public Connection bddOpenConn() { // si mot de passe avec des caractère spéciaux Connection conn=null; try { @@ -310,11 +292,26 @@ public final class Main extends JavaPlugin implements Listener { private void updateConfig(){ getLogger().info("Vérification du fichier de configuration..."); - // On va vérifier si l'on dispose de la nouvelle variable du port du serveur web + // 1.6.0 if(!config.contains("server-type")){ getLogger().info("Ajout de la variable serverType dans le fichier de configuration..."); config.set("server-type", "dev"); + saveConfig(); + reloadConfig(); + } + + if(config.contains("wild") && (config.contains("excluded-biomes") && config.contains("world") && config.contains("max-range"))){ + getLogger().info("Mise à jour des paramètres concernant la commande /wild"); + + config.set("wild.excluded-biomes", config.get("excluded-biomes")); + config.set("wild.world", config.get("world")); + config.set("wild.max-range", config.get("max-range")); + + config.set("excluded-biomes", null); + config.set("world", null); + config.set("max-range", null); + config.options().copyDefaults(true); saveConfig(); reloadConfig(); diff --git a/src/main/java/com/slprojects/slcraftplugin/commandes/wildCommand.java b/src/main/java/com/slprojects/slcraftplugin/commandes/wildCommand.java deleted file mode 100644 index c36e6f6f2fdf4371a60bfe335ba956af0408a805..0000000000000000000000000000000000000000 --- a/src/main/java/com/slprojects/slcraftplugin/commandes/wildCommand.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.slprojects.slcraftplugin.commandes; - -import com.slprojects.slcraftplugin.Main; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.block.Biome; -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.util.List; -import java.util.Objects; -import java.util.Random; - -import static java.lang.Math.abs; - -public class wildCommand implements CommandExecutor { - // Variables - private final Main plugin; - - - public wildCommand(Main plugin){ - // On récupère la classe parente pour les paramètres - this.plugin = plugin; - } - - @Override - @SuppressWarnings("unchecked") - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - // On vérifie que la commande a bien été lancée par un joueur - if (sender instanceof Player) { - Player player = (Player) sender; - - // On vérifie qu'il n'a pas déjà lancé la commande wild - if(!plugin.checkActiveUserForWildCommand(player.getUniqueId())){ - plugin.getServer().getConsoleSender().sendMessage("Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.RED+"refusé"); - player.sendMessage("§cVous devez attendre 5s avant de relancer la commande."); - return true; - } - plugin.getServer().getConsoleSender().sendMessage("Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.GREEN+"accepté"); - - // on récupère la liste des biomes exclus - List<String> excludedBiomes; - excludedBiomes = (List<String>) plugin.getConfig().getList("excluded-biomes"); - - player.sendMessage("§6Téléportation vers une coordonnée aléatoire."); - - // On défini le radius de téléportation - Random r = new Random(); - int low = plugin.getConfig().getInt("max-range")*(-1); - int high = plugin.getConfig().getInt("max-range"); - - // Tant qu'on a un biome non souhaite, on va regérer les coordonnées - boolean flag=true; - int x=0, z=0, y=0; - while(flag){ - flag=false; - x = r.nextInt(high-low) + low; - z = r.nextInt(high-low) + low; - y = Objects.requireNonNull(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("world")))).getHighestBlockYAt(x, z); - y++; // On incrémente la pos Y pour éviter que le joueur se retrouve dans le sol - - for (String excludedBiome : Objects.requireNonNull(excludedBiomes)) { - try{ - Biome.valueOf(excludedBiome.toUpperCase()); - if (Objects.requireNonNull(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("world")))).getBiome(x, y, z).equals(Biome.valueOf(excludedBiome.toUpperCase()))) { - flag = true; - } - }catch(Exception ignored){} - } - } - // On téléporte le joueur - - Location loc = new Location(Bukkit.getWorld(Objects.requireNonNull(plugin.getConfig().getString("world"))), x, y, z, 0, 0); - player.teleport(loc); - - int maxVal = Math.max(abs(x), abs(z)); - - if(maxVal <= 10000){ - player.sendMessage("§7§oVous êtes sur un biome généré en 1.16"); - }else if(maxVal <= 14500){ - player.sendMessage("§7§oVous êtes sur un biome généré en 1.17"); - }else{ - player.sendMessage("§7§oVous êtes sur un biome généré en 1.18"); - } - - // Vu qu'il y a un sleep et que ça bloque le thread, on va exécuter la fonction dans un thread - Runnable runnableRemoveActiveUser = () -> { - // On retire le joueur de la liste des utilisateurs en attente - plugin.removeActiveUserForWildCommand(player.getUniqueId()); - }; - - new Thread(runnableRemoveActiveUser).start(); - } - return true; - } -} diff --git a/src/main/java/com/slprojects/slcraftplugin/commands/admins/wildReset.java b/src/main/java/com/slprojects/slcraftplugin/commands/admins/wildReset.java new file mode 100644 index 0000000000000000000000000000000000000000..4b199bc8153b075fb3e8982d000b6c32c14e01d3 --- /dev/null +++ b/src/main/java/com/slprojects/slcraftplugin/commands/admins/wildReset.java @@ -0,0 +1,62 @@ +package com.slprojects.slcraftplugin.commands.admins; + +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.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +public class wildReset implements CommandExecutor { + private final Main plugin; + + public wildReset(Main plugin){ + this.plugin = plugin; + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args){ + if(args.length > 0){ + for(int i=0; i< args.length; i++){ + Player player = plugin.getServer().getPlayer(args[i]); + if(player != null){ + List<Object> reset = new ArrayList<Object>(){ + { + add(0); + add(LocalDateTime.parse("2001-12-11 12:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); + } + }; + plugin.playerDataHandler.savePlayerWildCmdStats(player, reset); + plugin.wildCommand.setPlayerStats(player, reset); + String msg = "Passage de 'wildCmdLastUsed' au 11/12/2001 et 'wildCmdAskNum' à 0 pour " + player.getName() + " UUID: " + player.getUniqueId(); + if (sender instanceof Player){ + sender.sendMessage("§7§o"+msg); + }else{ + plugin.getServer().getConsoleSender().sendMessage(msg); + } + }else{ + String errorMsg = "Joueur n°" + i + " (dans la liste) non trouvé. :("; + if (sender instanceof Player){ + sender.sendMessage("§c"+errorMsg); + }else{ + plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + errorMsg); + } + } + } + }else{ + String errorMsg = "Vous devez écrire le pseudo d'un ou plusieurs joueurs."; + if (sender instanceof Player){ + sender.sendMessage("§c"+errorMsg); + }else{ + plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + errorMsg); + } + } + return true; + } +} diff --git a/src/main/java/com/slprojects/slcraftplugin/commandes/linkCodeCommand.java b/src/main/java/com/slprojects/slcraftplugin/commands/publics/linkCode.java similarity index 96% rename from src/main/java/com/slprojects/slcraftplugin/commandes/linkCodeCommand.java rename to src/main/java/com/slprojects/slcraftplugin/commands/publics/linkCode.java index b7691d00b5e19faf6d2268002f6d1d53f1de7169..1633f2d54371ad9f348fe7c4c0f31927308e45dc 100644 --- a/src/main/java/com/slprojects/slcraftplugin/commandes/linkCodeCommand.java +++ b/src/main/java/com/slprojects/slcraftplugin/commands/publics/linkCode.java @@ -1,4 +1,4 @@ -package com.slprojects.slcraftplugin.commandes; +package com.slprojects.slcraftplugin.commands.publics; import com.slprojects.slcraftplugin.Main; import org.bukkit.ChatColor; @@ -14,12 +14,12 @@ import java.sql.ResultSet; import java.time.LocalDateTime; import java.util.Random; -public class linkCodeCommand implements CommandExecutor { +public class linkCode implements CommandExecutor { // Variables private final Main plugin; - public linkCodeCommand(Main plugin){ + public linkCode(Main plugin){ // On récupère la classe parente pour les paramètres this.plugin = plugin; } diff --git a/src/main/java/com/slprojects/slcraftplugin/commands/publics/wild.java b/src/main/java/com/slprojects/slcraftplugin/commands/publics/wild.java new file mode 100644 index 0000000000000000000000000000000000000000..f22a80655b61f18c97a190cac452a4a45e653469 --- /dev/null +++ b/src/main/java/com/slprojects/slcraftplugin/commands/publics/wild.java @@ -0,0 +1,192 @@ +package com.slprojects.slcraftplugin.commands.publics; + +import com.slprojects.slcraftplugin.Main; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.block.Biome; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; + +import static java.lang.Math.abs; + +public class wild implements CommandExecutor { + + // Variables + private final Main plugin; + + private List<UUID> wildUsersIndexes; + private List<LocalDateTime> wildUsersLastAsked; + private List<Integer> wildUsersAskNum; + private List<Location> wildUsersStartLocation; + private final int usageCooldown; + private final int usagePerDay; + + public wild(Main plugin){ + // On récupère la classe parente pour les paramètres + this.plugin = plugin; + wildUsersIndexes = new ArrayList<>(); + wildUsersLastAsked = new ArrayList<>(); + wildUsersAskNum = new ArrayList<>(); + wildUsersStartLocation = new ArrayList<>(); + usageCooldown = plugin.getConfig().getInt("wild.usage-cooldown"); + usagePerDay = plugin.getConfig().getInt("wild.usage-per-day"); + + plugin.getServer().getConsoleSender().sendMessage("Instance de wild."); + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + // On vérifie que la commande a bien été lancée par un joueur + if (sender instanceof Player) { + Player player = (Player) sender; + UUID playerUUID = player.getUniqueId(); + int playerIndex; + LocalDateTime dateTimeNow = LocalDateTime.now(); + + playerIndex = wildUsersIndexes.indexOf(playerUUID); + + if(abs(ChronoUnit.SECONDS.between(wildUsersLastAsked.get(playerIndex), dateTimeNow)) > usageCooldown){ + if(wildUsersAskNum.get(playerIndex) < usagePerDay){ + wildUsersLastAsked.set(playerIndex, dateTimeNow); + wildUsersStartLocation.set(playerIndex, player.getLocation()); + askForTeleport(player); + }else{ + plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.RED+"refusé"); + player.sendMessage("§cVous n'avez le droit qu'à §n"+usagePerDay+"§r§c téléportations aléatoires par jour."); + } + }else{ + plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.RED+"refusé"); + player.sendMessage("§cVous devez attendre §n"+usageCooldown+"s§r§c avant de relancer la commande."); + } + } + return true; + } + + private void askForTeleport(Player player){ + int playerIndex = wildUsersIndexes.indexOf(player.getUniqueId()); + plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] Le joueur "+ChatColor.GOLD+player.getName()+ChatColor.RESET+" a exécuté la commande "+ChatColor.GOLD+"/wild"+ChatColor.RESET+" : "+ChatColor.GREEN+"accepté"); + player.sendMessage("Vous allez être téléporté dans §c" + plugin.getConfig().getInt("wild.move-cooldown") + "s§r, ne bougez pas."); + int delayInTicks = plugin.getConfig().getInt("wild.move-cooldown") * 20; + + new BukkitRunnable() { + @Override + public void run(){ + Location oldPlayerLocation = wildUsersStartLocation.get(playerIndex); + Location newPlayerLocation = player.getLocation(); + + if((oldPlayerLocation.getX() != newPlayerLocation.getX()) && (oldPlayerLocation.getY() != newPlayerLocation.getY()) && (oldPlayerLocation.getZ() != newPlayerLocation.getZ())){ + player.sendMessage("§cVous avez bougé, téléportation annulée."); + // Date bidon pour annuler le cooldown (c'est ma date de naissance :D) + wildUsersLastAsked.set(playerIndex, LocalDateTime.parse("2001-12-11 12:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); + }else{ + teleportPlayer(player); + } + } + }.runTaskLater(plugin, delayInTicks); + } + + private void teleportPlayer(Player player){ + int playerIndex = wildUsersIndexes.indexOf(player.getUniqueId()); + wildUsersAskNum.set(playerIndex, wildUsersAskNum.get(playerIndex)+1); + + // on récupère la liste des biomes exclus + List<String> excludedBiomes; + excludedBiomes = (List<String>) plugin.getConfig().getList("wild.excluded-biomes"); + + player.sendMessage("§6Téléportation vers une coordonnée aléatoire."); + + // On défini le radius de téléportation + Random r = new Random(); + int low = plugin.getConfig().getInt("wild.max-range")*(-1); + int high = plugin.getConfig().getInt("wild.max-range"); + + // Tant qu'on a un biome non souhaite, on va regérer les coordonnées + boolean flag=true; + int x=0, z=0, y=0; + while(flag){ + flag=false; + x = r.nextInt(high-low) + low; + z = r.nextInt(high-low) + low; + y = Bukkit.getWorld(plugin.getConfig().getString("wild.world")).getHighestBlockYAt(x, z); + y++; // On incrémente la pos Y pour éviter que le joueur se retrouve dans le sol + + for (String excludedBiome : excludedBiomes) { + // Biomes non reconnus ou supprimés (deep warm ocean) + try{ + Biome.valueOf(excludedBiome.toUpperCase()); + if (Bukkit.getWorld(plugin.getConfig().getString("wild.world")).getBiome(x, y, z).equals(Biome.valueOf(excludedBiome.toUpperCase()))) { + flag = true; + } + }catch(Exception ignored){} + } + } + + // On téléporte le joueur + Location loc = new Location(Bukkit.getWorld(plugin.getConfig().getString("wild.world")), x, y, z, 0, 0); + player.teleport(loc); + + int maxVal = Math.max(abs(x), abs(z)); + + if(maxVal <= 10000){ + player.sendMessage("§7§oVous êtes sur un biome généré en 1.16"); + }else if(maxVal <= 14500){ + player.sendMessage("§7§oVous êtes sur un biome généré en 1.17"); + }else{ + player.sendMessage("§7§oVous êtes sur un biome généré en 1.18"); + } + if((usagePerDay - wildUsersAskNum.get(playerIndex)) > 0){ + player.sendMessage("§7§oIl vous reste " + (usagePerDay - wildUsersAskNum.get(playerIndex)) + " téléportations pour aujourd'hui."); + }else{ + player.sendMessage("§7§oVous avez épuisé toutes vos téléportations du jour."); + } + } + + public List<Object> getPlayerStats(Player player){ + if(!wildUsersIndexes.contains(player.getUniqueId())){ + return new ArrayList<>(); + }else{ + int playerIndex = wildUsersIndexes.indexOf(player.getUniqueId()); + // Indexes: + // - 0: Nombre d'utilisation du jour + // - 1: Date de la dernière commande + List<Object> stats = new ArrayList<Object>(); + stats.add(wildUsersAskNum.get(playerIndex)); + stats.add(wildUsersLastAsked.get(playerIndex)); + return stats; + } + } + + public void setPlayerStats(Player player, List<Object> stats){ + LocalDateTime dateTimeNow = LocalDateTime.now(); + + if(!wildUsersIndexes.contains(player.getUniqueId())){ + wildUsersIndexes.add(player.getUniqueId()); + wildUsersLastAsked.add(dateTimeNow); + wildUsersAskNum.add(0); + wildUsersStartLocation.add(player.getLocation()); + } + int playerIndex = wildUsersIndexes.indexOf(player.getUniqueId()); + + // Indexes: + // - 0: Nombre d'utilisation du jour + // - 1: Date de la dernière commande + LocalDateTime savedDateTime = (LocalDateTime)stats.get(1); + if(ChronoUnit.HOURS.between(savedDateTime, dateTimeNow) > 24){ + wildUsersAskNum.set(playerIndex, 0); + wildUsersLastAsked.set(playerIndex, savedDateTime); + }else{ + wildUsersAskNum.set(playerIndex, (int)stats.get(0)); + wildUsersLastAsked.set(playerIndex, savedDateTime); + } + } +} diff --git a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/internalWebServer.java b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/internalWebServer.java similarity index 91% rename from src/main/java/com/slprojects/slcraftplugin/tachesParalleles/internalWebServer.java rename to src/main/java/com/slprojects/slcraftplugin/parallelTasks/internalWebServer.java index 8612aa21f497867c70ea25361cbb3c0f0e7cc0ab..1de5e8ab7a2bbf3912cec57107f3a8973be24b95 100644 --- a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/internalWebServer.java +++ b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/internalWebServer.java @@ -1,4 +1,4 @@ -package com.slprojects.slcraftplugin.tachesParalleles; +package com.slprojects.slcraftplugin.parallelTasks; import com.slprojects.slcraftplugin.Main; import org.bukkit.ChatColor; @@ -18,8 +18,8 @@ public class internalWebServer { public static void startServer(Main plugin){ int serverPort = plugin.getConfig().getInt("internal-webserver-port"); - plugin.getServer().getConsoleSender().sendMessage("Lancement du serveur web intégré sur le port " + ChatColor.GOLD + serverPort); - plugin.getServer().getConsoleSender().sendMessage(ChatColor.YELLOW + "Attention! Le serveur ne fonctionne pas avec les requêtes https!"); + plugin.getServer().getConsoleSender().sendMessage("["+ plugin.getName() +"] Lancement du serveur web intégré sur le port " + ChatColor.GOLD + serverPort); + plugin.getServer().getConsoleSender().sendMessage(ChatColor.YELLOW + "["+ plugin.getName() +"] Attention! Le serveur ne fonctionne pas avec les requêtes https!"); // On fait un thread pour écouter le port Runnable serverThread = () -> { try { @@ -113,7 +113,7 @@ public class internalWebServer { client.close(); // Close the socket itself } } catch (IOException e) { - plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "Erreur lors de l'écoute du port " + ChatColor.GOLD + serverPort); + plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "["+ plugin.getName() +"] Erreur lors de l'écoute du port " + ChatColor.GOLD + serverPort); e.printStackTrace(); // On va logger le message sur discord @@ -125,7 +125,7 @@ public class internalWebServer { urlString = plugin.getConfig().getString("discordBot-api-url") + "mc/error/" + URLEncoder.encode(json.toJSONString(), "UTF-8").replace("+", "%20"); relaunchListener(plugin); } catch (UnsupportedEncodingException ex) { - plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "Erreur lors de l'encodage du message. Func waitForDiscordMsg::startServer(Main plugin)"); + plugin.getServer().getConsoleSender().sendMessage(ChatColor.RED + "["+ plugin.getName() +"] Erreur lors de l'encodage du message. Func waitForDiscordMsg::startServer(Main plugin)"); ex.printStackTrace(); } plugin.getHttp(urlString); @@ -137,7 +137,7 @@ public class internalWebServer { new Thread(serverThread).start(); } - //TODO: Vérifier l'utilité de cette fonction + // TODO: Vérifier l'utilité de cette fonction public static void relaunchListener(Main plugin) { // On relance la fonction avec une latence startServer(plugin); diff --git a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/savePlayerData.java b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/playerDataHandler.java similarity index 60% rename from src/main/java/com/slprojects/slcraftplugin/tachesParalleles/savePlayerData.java rename to src/main/java/com/slprojects/slcraftplugin/parallelTasks/playerDataHandler.java index 4dcd682f601f47ad1f6531123d701da6cb55e31f..e1f8b23c2a48eccded03c844108589d41be4c651 100644 --- a/src/main/java/com/slprojects/slcraftplugin/tachesParalleles/savePlayerData.java +++ b/src/main/java/com/slprojects/slcraftplugin/parallelTasks/playerDataHandler.java @@ -1,35 +1,34 @@ -package com.slprojects.slcraftplugin.tachesParalleles; +package com.slprojects.slcraftplugin.parallelTasks; import com.slprojects.slcraftplugin.Main; import org.bukkit.ChatColor; import org.bukkit.Statistic; import org.bukkit.entity.Player; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.sql.*; import java.time.Duration; 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 savePlayerData { +public class playerDataHandler { private final Main plugin; private Connection con; // Playtime private final List<UUID> playTimeUsersIndexes; private final List<LocalDateTime> playTimeUsersDate; - public savePlayerData(Main plugin){ + public playerDataHandler(Main plugin){ this.plugin = plugin; playTimeUsersIndexes = new ArrayList<>(); playTimeUsersDate = new ArrayList<>(); } - public void saveOnJoin(Player player) { + public void joinEvent(Player player) { // On ouvre la bdd con = plugin.bddOpenConn(); @@ -37,31 +36,33 @@ public class savePlayerData { playTimeUsersDate.add(LocalDateTime.now()); insertPlayerName(player); // On check si le nom du joueur est déjà enregistré - playerAddPlayerEntryOrExit(player, true); // On ajoute son entée - checkJoinedDate(player); // On check si on dipose de sa date de rejoint + 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)); // On ferme la bdd try { con.close(); } catch (SQLException e) { - plugin.getLogger().warning(ChatColor.RED + "Impossible de fermer la connexion à la bdd. Func savePlayerData::saveOnJoin(Player player)"); + plugin.getLogger().warning("Impossible de fermer la connexion à la bdd. Func savePlayerData::saveOnJoin(Player player)"); e.printStackTrace(); } } - public void saveOnQuit(Player player) { + public void quitEvent(Player player) { // On ouvre la bdd con = plugin.bddOpenConn(); calculatePlayerPlayTime(player); // On actualise le temps de jeu du joueur - playerAddPlayerEntryOrExit(player, false); // On ajoute son sortie + statsPlayerEntryExit(player, false); // On ajoute son sortie + savePlayerWildCmdStats(player, plugin.wildCommand.getPlayerStats(player)); // On ferme la bdd try { con.close(); } catch (SQLException e) { - plugin.getLogger().warning(ChatColor.RED + "Impossible de fermer la connexion à la bdd. Func savePlayerData::saveOnQuit(Player player)"); + plugin.getLogger().warning("Impossible de fermer la connexion à la bdd. Func savePlayerData::saveOnQuit(Player player)"); e.printStackTrace(); } } @@ -92,25 +93,25 @@ public class savePlayerData { insertUtilisateur.executeQuery(); } } catch (SQLException e) { - plugin.getLogger().warning(ChatColor.RED + "Func savePlayerData::insertPlayerName(Player player)"); + plugin.getLogger().warning("Func savePlayerData::insertPlayerName(Player player)"); e.printStackTrace(); } } - private void playerAddPlayerEntryOrExit(Player player, boolean isEnter){ + 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, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()).toString()); + insertPlayerEntryOrExit.setString(3, Timestamp.valueOf(java.time.LocalDateTime.now()).toString()); insertPlayerEntryOrExit.executeQuery(); } catch (SQLException e) { - plugin.getLogger().warning(ChatColor.RED + "Func savePlayerData::playerAddPlayerEntryOrExit(Player player, boolean isEnter)"); + plugin.getLogger().warning("Func savePlayerData::playerAddPlayerEntryOrExit(Player player, boolean isEnter)"); e.printStackTrace(); } } - private void checkJoinedDate(Player player){ + private void checkPlayerJoinedDate(Player player){ try { // On va vérifier si on l'a déjà renseigné par le passé PreparedStatement rechercheUtilisateur = con.prepareStatement("SELECT * FROM site_userSetting WHERE uuid = ? AND name = 'joinedDate'"); @@ -156,12 +157,12 @@ public class savePlayerData { // Le joueur est nouveau, on insère la date d'inscription PreparedStatement insertionDateInscription = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'joinedDate',?)"); insertionDateInscription.setString(1, player.getUniqueId().toString()); - insertionDateInscription.setString(2, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()).toString()); + insertionDateInscription.setString(2, Timestamp.valueOf(java.time.LocalDateTime.now()).toString()); insertionDateInscription.executeQuery(); } } } catch (SQLException e) { - plugin.getLogger().warning(ChatColor.RED + "Func savePlayerData::checkJoinedDate(Player player)"); + plugin.getLogger().warning("Func savePlayerData::checkJoinedDate(Player player)"); e.printStackTrace(); } } @@ -188,7 +189,7 @@ public class savePlayerData { } } catch (SQLException e) { - plugin.getLogger().warning(ChatColor.RED + "Func savePlayerData::setPlayerJoinCount(Player player)"); + plugin.getLogger().warning("Func savePlayerData::setPlayerJoinCount(Player player)"); e.printStackTrace(); } } @@ -220,7 +221,114 @@ public class savePlayerData { } } catch (SQLException e) { - plugin.getLogger().warning(ChatColor.RED + "Func savePlayerData::increasePlayerPlayTime(Player player)"); + plugin.getLogger().warning("Func savePlayerData::increasePlayerPlayTime(Player player)"); + e.printStackTrace(); + } + } + + private List<Object> getPlayerWildCmdStats(Player player){ + // Indexes: + // - 0: Nombre d'utilisation du jour + // - 1: Date de la dernière commande + + try { + PreparedStatement playerLastUsed = con.prepareStatement("SELECT * FROM site_userSetting WHERE uuid = ? AND name = 'wildCmdLastUsed'"); + playerLastUsed.setString(1, player.getUniqueId().toString()); + ResultSet lastUsedResult = playerLastUsed.executeQuery(); + + if(lastUsedResult.next()){ + LocalDateTime lastUsed = Timestamp.valueOf(lastUsedResult.getString("value")).toLocalDateTime(); + if(ChronoUnit.HOURS.between(lastUsed, LocalDateTime.now()) > 24){ + return new ArrayList<Object>(){ + { + add(0); + add(lastUsed); + } + }; + }else{ + PreparedStatement playerAskNum = con.prepareStatement("SELECT * FROM site_userSetting WHERE uuid = ? AND name = 'wildCmdAskNum'"); + playerAskNum.setString(1, player.getUniqueId().toString()); + ResultSet askNumResult = playerAskNum.executeQuery(); + + if(askNumResult.next()){ + return new ArrayList<Object>(){ + { + add(Integer.valueOf(askNumResult.getString("value"))); + add(lastUsed); + } + }; + }else{ + plugin.getLogger().warning("Func savePlayerData::getPlayerWildCmdStats(Player player)"); + plugin.getLogger().warning("Fonctionnement anormal! On dispose de la date de 'wildCmdLastUsed' mais pas de 'wildCmdAskNum' pour le joueur " + player.getName() + " UUID: " + player.getUniqueId()); + plugin.getLogger().warning("Passage de 'wildCmdAskNum' à 0."); + return new ArrayList<Object>(){ + { + add(0); + add(lastUsed); + } + }; + } + } + }else{ + plugin.getLogger().info("Mise à jour du joueur " + player.getName() + " UUID: " + player.getUniqueId()); + plugin.getLogger().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")); + PreparedStatement insertWildCmdLastUsed = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'wildCmdLastUsed',?)"); + insertWildCmdLastUsed.setString(1, player.getUniqueId().toString()); + insertWildCmdLastUsed.setString(2, Timestamp.valueOf(dateBidon).toString()); + insertWildCmdLastUsed.executeQuery(); + + PreparedStatement insertWildCmdAskNum = con.prepareStatement("INSERT INTO site_userSetting (`uuid`, `name`, `value`) VALUES (?,'wildCmdAskNum',?)"); + insertWildCmdAskNum.setString(1, player.getUniqueId().toString()); + insertWildCmdAskNum.setString(2, "0"); + insertWildCmdAskNum.executeQuery(); + + return new ArrayList<Object>(){ + { + add(0); + add(dateBidon); + } + }; + } + + } catch (SQLException e) { + plugin.getLogger().warning("Func savePlayerData::getPlayerWildCmdStats(Player player)"); + e.printStackTrace(); + } + + plugin.getLogger().warning("Func savePlayerData::getPlayerWildCmdStats(Player player)"); + plugin.getLogger().warning("Fonctionnement anormal! La recherche dans la bdd a échouée pour le joueur " + player.getName() + " UUID: " + player.getUniqueId()); + plugin.getLogger().warning("Passage de 'wildCmdLastUsed' au 11 décembre 2001 et 'wildCmdAskNum' à 0"); + + return new ArrayList<Object>(){ + { + add(0); + add(LocalDateTime.parse("2001-12-11 12:30", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))); + } + }; + } + + public void savePlayerWildCmdStats(Player player, List<Object> stats){ + // Indexes: + // - 0: Nombre d'utilisation du jour + // - 1: Date de la dernière commande + + try { + // On va zapper la vérification de présence car on suppose que la commande getWildCmdStats avait réussie + PreparedStatement updateWildCmdAskNum = con.prepareStatement("UPDATE site_userSetting SET value = ? WHERE uuid = ? AND name = 'wildCmdAskNum'"); + updateWildCmdAskNum.setString(1, String.valueOf(stats.get(0))); + updateWildCmdAskNum.setString(2, player.getUniqueId().toString()); + updateWildCmdAskNum.executeUpdate(); + + PreparedStatement updateWildCmdLastUsed = con.prepareStatement("UPDATE site_userSetting SET value = ? WHERE uuid = ? AND name = 'wildCmdLastUsed'"); + updateWildCmdLastUsed.setString(1, Timestamp.valueOf((LocalDateTime)stats.get(1)).toString()); + updateWildCmdLastUsed.setString(2, player.getUniqueId().toString()); + updateWildCmdLastUsed.executeUpdate(); + + } catch (SQLException e) { + plugin.getLogger().warning("Func savePlayerData::getPlayerWildCmdStats(Player player)"); e.printStackTrace(); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 237af8a1f79988d42ca1d63ff56a4355a6c0f1fe..545d91fc007eab14046124467cc1264d1eac5bc4 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,19 +1,22 @@ # /wild -excluded-biomes: - - cold_ocean - - deep_cold_ocean - - deep_frozen_ocean - - deep_lukewarm_ocean - - deep_ocean - - deep_warm_ocean - - frozen_ocean - - frozen_river - - lukewarm_ocean - - ocean - - river - - warm_ocean -world: survie -max-range: 20000 #14500 -> 1.17, 10000 -> 1.16 +wild: + excluded-biomes: + - cold_ocean + - deep_cold_ocean + - deep_frozen_ocean + - deep_lukewarm_ocean + - deep_ocean + - frozen_ocean + - frozen_river + - lukewarm_ocean + - ocean + - river + - warm_ocean + world: survie + max-range: 20000 #14500 -> 1.17, 10000 -> 1.16 + usage-cooldown: 30 + move-cooldown: 5 + usage-per-day: 5 # Configuration de la base de donnée database: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 59d20de2c394777f349990e02ee79f3beacb112b..85da917c30a52d0f4be08aca37891b0491ad56c6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -13,6 +13,12 @@ commands: usage: /wild permission: slcraft.wild + reset-wild: + description: ADMIN - Permet de réinitialiser le compteur de téléportation aléatoire d'un joueur + aliases: [reset-wild, wildreset] + usage: /reset-wild + permission: slcraft.admin.reset-wild + getlinkcode: description: Te permet d'obtenir un code pour associer ton compte Minecraft au site internet du serveur.' aliases: [ getlinkcode ]