package fr.she3py.foo;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* La classe principale de ton plugin
*/
public class FooPlugin extends JavaPlugin implements Listener {
/**
* Une Map<K, V> est équivalant à un tableau, sauf qu'au lieu d'accéder aux éléments
* avec leurs indices (son emplacement dans le tableau), on le fait avec un object.
*
* Ici, on associe chaque joueur à un entier, qui représente la date en millisecondes à
* laquelle il a bougé pour la dernière fois.
*/
private final Map<Player, Long> LAST_ACTIVITY = new HashMap<>();
@Override
public void onEnable() {
// On enregistre notre classe, pour qu'on puisse recevoir des évènements
Bukkit.getPluginManager().registerEvents(this, this);
// Ensuite, on créer une tâche qui s'activera toutes les 10 minutes
// Le premier paramètre est le plugin qui enregistre la tâche
// Le deuxième paramètre est la tâche à effectué, on lui passe une fonction
// Le troisième paramètre est le délai initial avant que la tâche s'exécute pour la 1ère fois
// Le quatrième paramètre est le délai entre deux exécutions de la tâche
// Les temps indiqués sont en ticks (20 ticks = 1 seconde), 10 mn = 600 s, 600 * 20 = 12 000 ticks
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, this::timeoutTask, 12000, 12000);
}
/**
* En mettant l'annotation @EventHandler, on indique à Bukkit que cette fonction
* est un point d'entrée ; elle sera appelée automatiquement si l'évènement correspondant
* à son paramètre est déclanché.
*
* Bukkit ne cherche de telles fonctions que dans les classes enregistrées,
* d'où le fait qu'il faille enregistrer nos évènements en amont.
*/
@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {
// On récupère le joueur qui a bougé
Player player = e.getPlayer();
// On récupère la date actuelle, en millisecondes
long time = System.currentTimeMillis();
// Et on ajoute le joueur dans notre tableau associatif
// S'il y est déjà présent, l'ancienne valeure sera écrasée.
LAST_ACTIVITY.put(player, time);
}
/**
* Cette fonction est appelée toutes les 10 minutes
*/
public void timeoutTask() {
// On recupère la date actuelle
long currentTime = System.currentTimeMillis();
// On créer une liste qui contiendra tous les joueurs à kick
List<Player> toKick = new ArrayList<>();
// On ajoute tous les joueurs qui n'ont pas bougés depuis 600 000 ms (10 mn) dans notre liste
LAST_ACTIVITY.entrySet().stream().filter(entry -> (currentTime - entry.getValue()) > 600000).map(Map.Entry::getKey).forEach(toKick::add);
// Et on les kicks
toKick.forEach(player -> player.kickPlayer("Inactivité prolongée"));
}
/**
* Appelée lorsqu'un joueur quitte le serveur
*/
@EventHandler
public void onPlayerQuit(PlayerQuitEvent e) {
// On l'enlève de notre liste
LAST_ACTIVITY.remove(e.getPlayer());
}
}