Skip to content
Snippets Groups Projects
Select Git revision
  • c5bd00da5cc04ab461493b092675fa5ac3ebdba2
  • main default protected
  • feature/revoir_gestion_bdd
  • 1.6.1
  • 1.6.0
5 results

PlayedTimeHandler.java

Blame
  • SofianeLasri's avatar
    Sofiane Lasri authored
    Ajout de vérifications complémentaires à la classe PlayedTimeHandler, concernants LuckPerms et la possible nullité de certains retours de méthodes.
    c5bd00da
    History
    PlayedTimeHandler.java 7.81 KiB
    package com.slprojects.slcraftplugin.parallelTasks.dataHandlers;
    
    import com.slprojects.slcraftplugin.Main;
    import com.slprojects.slcraftplugin.parallelTasks.events.GeneralEvents;
    import com.slprojects.slcraftplugin.utils.ConsoleLog;
    import com.slprojects.slcraftplugin.utils.Database;
    import net.luckperms.api.model.group.Group;
    import net.luckperms.api.model.user.User;
    import net.luckperms.api.node.types.InheritanceNode;
    import org.bukkit.ChatColor;
    import org.bukkit.Sound;
    import org.bukkit.entity.Player;
    import org.bukkit.scheduler.BukkitRunnable;
    
    import java.time.Duration;
    import java.time.LocalDateTime;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Objects;
    import java.util.UUID;
    
    public class PlayedTimeHandler implements dataHandler {
        private final Main plugin;
        private final List<UUID> usersIndexes;
        private final List<LocalDateTime> userSessionJoinDateTime;
        private final List<Long> userStoredPlayedTimeBeforeJoining;
        private final int requiredPlayedTimeForUpgradingPlayersAccount;
        private final Group playersAccountUpgradeGroup;
    
        public PlayedTimeHandler(Main plugin) {
            this.plugin = plugin;
            String playersAccountUpgradeRole = plugin.getConfig().getString("stats.players-account-upgrade-role");
    
            if (playersAccountUpgradeRole != null) {
                usersIndexes = new ArrayList<>();
                userSessionJoinDateTime = new ArrayList<>();
                userStoredPlayedTimeBeforeJoining = new ArrayList<>();
                requiredPlayedTimeForUpgradingPlayersAccount = plugin.getConfig().getInt("stats.required-played-time-for-upgrading-players-account");
                playersAccountUpgradeGroup = Main.luckPermsApi.getGroupManager().getGroup(playersAccountUpgradeRole);
    
                if (playersAccountUpgradeGroup == null) {
                    throw new RuntimeException("Le groupe " + playersAccountUpgradeRole + " n'existe pas !");
                }
            } else {
                throw new RuntimeException("La configuration stats.required-played-time-for-upgrading-players-account n'existe pas !");
            }
        }
    
        @Override
        public void joinEvent(Player player) {
            usersIndexes.add(player.getUniqueId());
            userSessionJoinDateTime.add(LocalDateTime.now());
    
            if (plugin.playerDataHandler.playerAlreadyJoined(player)) {
                userStoredPlayedTimeBeforeJoining.add(Long.valueOf(Database.getUserSetting(player.getUniqueId().toString(), "playedTime")));
                // Delay sinon le joueur ne voit pas
                new BukkitRunnable() {
                    @Override
                    public void run() {
                        checkPlayerTime(player);
                    }
                }.runTaskLater(plugin, 20);
            } else {
                userStoredPlayedTimeBeforeJoining.add(0L);
            }
        }
    
        @Override
        public void quitEvent(Player player) {
            savePlayedTime(player); // On actualise le temps de jeu du joueur
        }
    
        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, userSessionJoinDateTime.get(usersIndexes.indexOf(playerUuid)));
            long playedTimeInSeconds = Math.abs(duration.toSeconds());
            long actualPlayedTime = userStoredPlayedTimeBeforeJoining.get(usersIndexes.indexOf(playerUuid)) + playedTimeInSeconds;
    
            Database.setUserSetting(playerUuid.toString(), "playedTime", String.valueOf(actualPlayedTime));
    
            // Vérification pour avoir le rôle habitué
            checkPlayerTime(player);
        }
    
        public void checkPlayerTime(Player player) {
            // On va calculer le temps de jeu du joueur
            UUID playerUuid = player.getUniqueId();
            LocalDateTime timeNow = LocalDateTime.now();
            Duration duration = Duration.between(timeNow, userSessionJoinDateTime.get(usersIndexes.indexOf(playerUuid)));
            long playedTimeInSeconds = Math.abs(duration.toSeconds());
            long actualPlayedTime = userStoredPlayedTimeBeforeJoining.get(usersIndexes.indexOf(playerUuid)) + playedTimeInSeconds;
    
            if (actualPlayedTime >= requiredPlayedTimeForUpgradingPlayersAccount) {
                String playerGroupName = Main.luckPermsApi.getPlayerAdapter(Player.class).getMetaData(player).getPrimaryGroup();
    
                if (playerGroupName != null && !Objects.equals(playerGroupName, playersAccountUpgradeGroup.getName())) {
                    Group playerGroup = Main.luckPermsApi.getGroupManager().getGroup(playerGroupName);
                    if (playerGroup == null) {
                        throw new RuntimeException("Le groupe " + playerGroupName + " n'existe pas !");
                    }
    
                    if (playerGroup.getWeight().isPresent() && playersAccountUpgradeGroup.getWeight().isPresent()) {
                        if (playerGroup.getWeight().getAsInt() < playersAccountUpgradeGroup.getWeight().getAsInt()) {
                            ConsoleLog.info(ChatColor.GREEN + player.getName() + ChatColor.LIGHT_PURPLE + " a débloqué le rôle des joueurs " + ChatColor.GOLD + "habitués" + ChatColor.LIGHT_PURPLE + "!");
                            User playerLuckPerms = Main.luckPermsApi.getUserManager().getUser(player.getUniqueId());
                            if (playerLuckPerms == null) {
                                throw new RuntimeException("LuckPerms ne semble pas disposer de donnée sur le joueur " + player.getName() + " UUID:" + player.getUniqueId());
                            }
    
                            // https://www.spigotmc.org/threads/how-can-i-set-a-players-group-with-luckperms-api.489404/#post-4084060
                            InheritanceNode node = InheritanceNode.builder(playersAccountUpgradeGroup).value(true).build();
                            playerLuckPerms.data().add(node);
                            Main.luckPermsApi.getUserManager().saveUser(playerLuckPerms);
    
                            int requiredPlayedTimeInHours = requiredPlayedTimeForUpgradingPlayersAccount / 60 / 60;
                            player.sendMessage(ChatColor.GREEN + "Bravo et un grand merci à toi " + ChatColor.YELLOW + player.getName() + ChatColor.GREEN + "!");
                            player.sendMessage(ChatColor.GREEN + "Tu as joué pendant plus de" + ChatColor.GOLD + requiredPlayedTimeInHours + "H " + ChatColor.GREEN + "sur le serveur !!!");
                            player.sendMessage("Pour te récompenser, nous te donnons le rôle des joueurs " + ChatColor.GOLD + "habitués" + ChatColor.RESET + "!");
                            player.sendMessage(ChatColor.GREEN + "Ce rôle te donne accès à un plus grand nombre de homes et à une plus grande surface utilisable pour protéger tes constructions avec RedProtect.");
    
                            for (Player connectedPlayer : plugin.getServer().getOnlinePlayers()) {
                                if (connectedPlayer != player) {
                                    connectedPlayer.sendMessage(ChatColor.GREEN + player.getName() + ChatColor.LIGHT_PURPLE + " a débloqué le rôle des joueurs " + ChatColor.GOLD + "habitués" + ChatColor.LIGHT_PURPLE + "!");
                                }
                                player.playSound(player.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 100, 2);
                            }
    
                            plugin.sendMessageToDiscord("**" + player.getName() + "** a débloqué le rôle des joueurs **habitués**! \uD83E\uDD73");
                            plugin.sendMessageToDiscord("Un grand merci à toi qui a passé plus de 20H de jeu sur le serveur!  ❤");
    
                            // Feux d'artifices
                            GeneralEvents.fireworkSoundEffect(player, plugin);
                        }
                    } else {
                        ConsoleLog.danger("Impossible de vérifier la priorité du ou des rôles suivants : " + playerGroupName + " & " + playersAccountUpgradeGroup.getName());
                    }
                }
            }
        }
    }