diff --git a/resources/plugin.yml b/resources/plugin.yml index 888c19b..4eecef6 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -46,6 +46,10 @@ commands: usage: //selection aliases : [/select] permission: pandacraft.selection + staff: + description: Gère la file d'attente de joueurs qui ont besoin de l'assitance du staff + usage: /staff [annuler|] + permission: pandacraft.staff @@ -84,6 +88,10 @@ permissions: pandacraft.me: description: Utiliser la commande me default: true + + pandacraft.staff: + description: Utiliser la commande staff + default: true pandacraft.afk: description: Utiliser la commande afk @@ -127,4 +135,7 @@ permissions: default: false pandacraft.grade.not_default: description: Représente tout les joueurs inscrits - default: false \ No newline at end of file + default: false + pandacraft.grade.staff: + description: Représente tout le staff + default: false diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/simple_commands/staff_player_help/CommandStaff.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/simple_commands/staff_player_help/CommandStaff.java new file mode 100644 index 0000000..d3c2172 --- /dev/null +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/simple_commands/staff_player_help/CommandStaff.java @@ -0,0 +1,426 @@ +package net.mc_pandacraft.java.plugin.pandacraftutils.simple_commands.staff_player_help; + +import java.util.Date; +import java.util.LinkedList; +import java.util.Queue; + +import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; +import net.mc_pandacraft.java.util.TimeUtil; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Score; +import org.bukkit.scoreboard.Scoreboard; + +public class CommandStaff implements CommandExecutor, Listener { + + private PandacraftUtils plugin; + + + private Queue playerQueue = new LinkedList(); + + private Scoreboard scoreboardPlayerQueue; + + + public CommandStaff(PandacraftUtils pl) { + plugin = pl; + plugin.getCommand("staff").setExecutor(this); + + plugin.getServer().getPluginManager().registerEvents(this, plugin); + + + scoreboardPlayerQueue = Bukkit.getScoreboardManager().getNewScoreboard(); + } + + + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String alias, + String[] args) { + + + + if (sender instanceof Player && !((Player)sender).hasPermission("pandacraft.grade.staff")) + { // un joueur qui n'est pas du staff + + // le joueur est-il déjà en file d'attente ? + if (getWaitingPlayer((Player)sender) != null) { + if (args.length > 0 && args[0].equalsIgnoreCase("annuler")) { + removePlayer((Player)sender); + updateScoreBoardWaitingList(); + sender.sendMessage(ChatColor.GREEN+"Vous avez été retiré de la file d'attente"); + return true; + } + else if (args.length > 0 && args[0].equalsIgnoreCase("position")) { + + sender.sendMessage(ChatColor.GREEN+"Vous êtes à la position "+getPlayerPosition((Player)sender)+" de la file d'attente"); + return true; + } + sender.sendMessage(ChatColor.GREEN+"Vous êtes déjà dans la file d'attente"); + sender.sendMessage(ChatColor.GREEN+"Commande : "+ChatColor.GRAY+"/staff position"+ChatColor.RED+" pour connaitre votre position"+ + "ou "+ChatColor.GRAY+"/staff annuler"+ChatColor.RED+" pour sortir de la file d'attente"); + return true; + } + // le joueur n'a-t-il pas mis un message en argument de la commande + if (args.length == 0) { + sender.sendMessage(ChatColor.GREEN+"Vous n'êtes pas dans la file d'attente"); + sender.sendMessage(ChatColor.GREEN+"Cette file d'attente sers à demander un service à une personne du staff connecté"); + sender.sendMessage(ChatColor.RED+"Commande : "+ChatColor.GRAY+"/staff "+ChatColor.ITALIC+"Message"+ + ChatColor.RED+" pour rentrer dans la file d'attente"); + return true; + } + + playerQueue.add(new WaitingPlayer(((Player)sender).getName(), String.join(" ", args), ((Player)sender).getLocation())); + updateScoreBoardWaitingList(); + sender.sendMessage(ChatColor.GREEN+"Veuillez maintenant patienter quelques instant, le temps que le staff traite le début de la file d'attente ;)"); + sender.sendMessage(ChatColor.GREEN+"Vous êtes à la position "+getPlayerPosition((Player)sender)+" de la file d'attente"); + return true; + } + else if (sender instanceof Player) + { // un joueur du staff + if (args.length == 0) { + showWaintingList(sender); + sender.sendMessage(ChatColor.GOLD+"Pour connaitre les commandes, faites "+ChatColor.GRAY+"/staff ?"); + return true; + } + else + { + return onCommand_admin_commands(sender, args); + } + + } + else + { // ce n'est pas un joueur (console) + + + if (args.length == 0) { + showWaintingList(sender); + return true; + } + else + { + return onCommand_admin_commands(sender, args); + } + + + } + + } + + + + + + + private boolean onCommand_admin_commands(CommandSender sender, String[] args) { + if (args[0].equalsIgnoreCase("?")) + { // affichage de l'aide + sender.sendMessage(ChatColor.GOLD+"--- Commandes administratives pour gérer la file d'attente ---"); + if (sender instanceof Player) + sender.sendMessage(ChatColor.GRAY+"/staff select "+ChatColor.RESET+" : prendre en charge un joueur de la file"); + sender.sendMessage(ChatColor.GRAY+"/staff remove "+ChatColor.RESET+" : retire un joueur de la file sans le prendre en charge"); + sender.sendMessage(ChatColor.GRAY+"/staff add "+ChatColor.RESET+" : ajoute un joueur dans la file"); + return true; + } + else if (args[0].equalsIgnoreCase("select") && args.length > 1 && sender instanceof Player) + { + WaitingPlayer wp = getWaitingPlayer(args[1]); + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la liste"); + return true; + } + + + removePlayer(args[1]); + updateScoreBoardWaitingList(); + + + Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); + if (p != null && p.isOnline()) { + // le joueur est en ligne + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + sender.sendMessage(p.getName()+ChatColor.RESET+" : "+wp.getMessage()+" - "+ChatColor.ITALIC+"Il y a "+TimeUtil.durationToString((new Date()).getTime() - wp.getDate().getTime())); + sender.sendMessage(ChatColor.GREEN+"Vous avez été téléporté vers ce joueur"); + ((Player)sender).teleport(p.getLocation()); + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + p.sendMessage(((Player)sender).getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" s'occupe maintenant de vous :)"); + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + + } + else { + // le joueur n'est pas en ligne + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + sender.sendMessage(wp.getPlayerName()+ChatColor.RESET+" : "+wp.getMessage()); + sender.sendMessage(ChatColor.GREEN+"Vous avez été téléporté vers l'endroit concerné par la demande du joueur"); + ((Player)sender).teleport(wp.getLocation()); + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + p.sendMessage(((Player)sender).getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" s'occupe maintenant de vous :)"); + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + return true; + } + + + + + return true; + + } + else if (args[0].equalsIgnoreCase("remove") && args.length > 1) + { + WaitingPlayer wp = getWaitingPlayer(args[1]); + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la liste"); + return true; + } + + removePlayer(args[1]); + updateScoreBoardWaitingList(); + Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); + if (p != null && p.isOnline()) { + p.sendMessage(ChatColor.RED+"Vous avez été retiré de la liste des joueurs en attente"); + } + + sender.sendMessage(ChatColor.GREEN+wp.getPlayerName()+ChatColor.RESET+ChatColor.GREEN+" a été retiré de la file d'attente"); + + return true; + + } + else if (args[0].equalsIgnoreCase("add") && args.length > 1) + { + + Player p = plugin.getServer().getPlayer(args[1]); + + if (p == null || !p.isOnline()) { + sender.sendMessage(ChatColor.RED+"Le joueur n'existe pas ou n'est pas en ligne"); + return true; + } + + WaitingPlayer wp = getWaitingPlayer(p.getName()); + if (wp != null) { + sender.sendMessage(ChatColor.RED+"Le joueur est déjà dans la liste"); + return true; + } + + + // on trafique le message pour 2 raisons : + // - on retire les paramètres qui ne font pas partie du message ("add" et le nom du joueur ajouté) + // - on les replaces par l'info sur le membre du staff qui l'a ajouté à la liste + args[0] = ChatColor.ITALIC+"(Ajouté par"; + args[1] = sender.getName() +")"+ ChatColor.RESET; + String message = String.join(" ", args); + + + playerQueue.add(new WaitingPlayer(p.getName(),message, p.getLocation())); + + updateScoreBoardWaitingList(); + + sender.sendMessage(ChatColor.GREEN+"Vous venez d'ajouter "+p.getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" dans la file d'attente"); + + p.sendMessage(ChatColor.GREEN+sender.getName()+" vous a ajouté dans la file d'attente pour traiter votre demande plus tard"); + return true; + } + return false; + } + + + + + + + + + + + + + + + + + private WaitingPlayer getWaitingPlayer(String p) { + for (WaitingPlayer wp : playerQueue) + { + if (wp != null && wp.getPlayerName().equalsIgnoreCase(p)) + return wp; + } + return null; + } + + + private WaitingPlayer getWaitingPlayer(OfflinePlayer p) { + return getWaitingPlayer(p.getName()); + } + + + + + private int getPlayerPosition(OfflinePlayer p) { + int i = 0; + for (WaitingPlayer wp : playerQueue) + { + if (wp != null && wp.getPlayerName().equalsIgnoreCase(p.getName())) + return i; + i++; + } + return -1; + } + + + + private void removePlayer(String p) { + WaitingPlayer wp = getWaitingPlayer(p); + if (wp != null) + playerQueue.remove(wp); + } + private void removePlayer(OfflinePlayer p) { + removePlayer(p.getName()); + } + + + + + + + + + private void showWaintingList(CommandSender sender) { + sender.sendMessage(ChatColor.BOLD+"----- File d'attente des joueurs pour le staff -----"); + + int i=0; + for (WaitingPlayer wp : playerQueue) { + i++; + Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); + String name; + if (p == null || !p.isOnline()) + name = wp.getPlayerName(); + else + name = p.getDisplayName(); + + sender.sendMessage(i+". "+name+ChatColor.RESET+" : "+wp.getMessage()+" - " + +ChatColor.ITALIC+"Il y a "+TimeUtil.durationToString((new Date()).getTime() - wp.getDate().getTime())); + } + sender.sendMessage(ChatColor.BOLD+"-----------------------------------------------"); + + } + + + + + + + + + private void updateScoreBoardWaitingList() { + Objective obj = scoreboardPlayerQueue.getObjective("file_attente"); + if (obj != null) + obj.unregister(); + + obj = scoreboardPlayerQueue.registerNewObjective("file_attente", "dummy"); + obj.setDisplaySlot(DisplaySlot.SIDEBAR); + obj.setDisplayName(ChatColor.GOLD+"File d'attente staff"); + + int i=0; + for (WaitingPlayer wp : playerQueue) { + i++; + + Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); + String name; + if (p == null || !p.isOnline()) + name = wp.getPlayerName(); + else + name = p.getDisplayName(); + + String line = i+". "+name; + int boardPos = playerQueue.size()-i; + + + Score score = obj.getScore(plugin.getServer().getOfflinePlayer(line)); + + score.setScore(boardPos); + } + + + } + + + + + + + + + + + + + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player p = event.getPlayer(); + if (p.hasPermission("pandacraft.grade.staff")) + p.setScoreboard(scoreboardPlayerQueue); + updateScoreBoardWaitingList(); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + // lancer l'update un ou deux tick plus tard si ça ne marche pas comme ça + updateScoreBoardWaitingList(); + } + + + + + + + + + + + + + + + + private class WaitingPlayer { + + private String player; + private String message; + private Date creationDate; + private Location location; + + + public WaitingPlayer(String p, String m, Location l) { + + player = p; + message = m; + creationDate = new Date(); + location = l; + } + + + public String getPlayerName() { return player; } + + public String getMessage() { return message; } + + public Date getDate() { return creationDate; } + + public Location getLocation() { return location; } + } +}