diff --git a/resources/plugin.yml b/resources/plugin.yml index 7b24f2a..e0ab1dd 100644 --- a/resources/plugin.yml +++ b/resources/plugin.yml @@ -44,8 +44,9 @@ commands: permission: pandacraft.selection staff: description: Gère la file d'attente de joueurs qui ont besoin de l'assitance du staff - usage: /staff [annuler|] + usage: /staff permission: pandacraft.staff + aliases: [ticket] cubo: description: Gère les protections de la map Survie usage: /cubo @@ -90,6 +91,11 @@ commands: description: mystère :3 usage: /ghost permission: pandacraft.ghost + tell: + description: Envoyer un message privé + usage: /tell + permission: pandacraft.tell + aliases: [m, msg, t, w, whisper] @@ -189,6 +195,11 @@ permissions: pandacraft.muco.*: description: Utiliser toutes les listes de commandes muco default: op + +#### à ajouter + pandacraft.tell: + description: Utiliser la commande tell + default: true pandacraft.modo: diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/PandacraftUtils.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/PandacraftUtils.java index 4e92901..f9ae6e9 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/PandacraftUtils.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/PandacraftUtils.java @@ -13,6 +13,7 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.listener.XAuthListener; import net.mc_pandacraft.java.plugin.pandacraftutils.modules.AutoMessagesManager; import net.mc_pandacraft.java.plugin.pandacraftutils.modules.CalculatorManager; import net.mc_pandacraft.java.plugin.pandacraftutils.modules.CommandAliasManager; +import net.mc_pandacraft.java.plugin.pandacraftutils.modules.PrivateMessagesManager; import net.mc_pandacraft.java.plugin.pandacraftutils.modules.VanillaMessageManager; import net.mc_pandacraft.java.plugin.pandacraftutils.modules.PacketOutServerInfoListener; import net.mc_pandacraft.java.plugin.pandacraftutils.modules.SpawnTimeManager; @@ -93,6 +94,7 @@ public class PandacraftUtils extends JavaPlugin { public HeartThrowManager heartThrowManager; public JailsManager jailsManager; public GhostManager ghostManager; + public PrivateMessagesManager privateMessagesManager; @@ -144,6 +146,7 @@ public class PandacraftUtils extends JavaPlugin { heartThrowManager = new HeartThrowManager(); jailsManager = new JailsManager(); ghostManager = new GhostManager(); + privateMessagesManager = new PrivateMessagesManager(); // chargement des écouteurs d'évènement @@ -203,6 +206,7 @@ public class PandacraftUtils extends JavaPlugin { worldBorderManager = null; heartThrowManager = null; jailsManager = null; + privateMessagesManager = null; instance = null; diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/AbstractCommandExecutor.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/AbstractCommandExecutor.java index 5a28080..122e74d 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/AbstractCommandExecutor.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/AbstractCommandExecutor.java @@ -1,9 +1,14 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; +import java.util.ArrayList; +import java.util.List; + import org.apache.commons.lang.StringUtils; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.util.StringUtil; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; @@ -11,7 +16,7 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; * Classe parente de toutes les classes devant prendre en charge l'exécution d'une commande Minecraft */ -public abstract class AbstractCommandExecutor implements CommandExecutor { +public abstract class AbstractCommandExecutor implements CommandExecutor, TabCompleter { protected PandacraftUtils plugin = PandacraftUtils.getInstance(); @@ -26,6 +31,7 @@ public abstract class AbstractCommandExecutor implements CommandExecutor { commandName = cName; plugin.getCommand(commandName).setExecutor(this); + plugin.getCommand(commandName).setTabCompleter(this); } public String getCommandName() { return commandName; } @@ -33,6 +39,31 @@ public abstract class AbstractCommandExecutor implements CommandExecutor { public abstract boolean onCommand(CommandSender sender, Command cmd, String label, String[] args); + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + return null; + } + + /** + * Prends en charge les tokens avec des espaces, mais retourne les propositions complets + * @param token + * @param allProposal + * @return + */ + public List getTabProposalFromToken(String token, List allProposal) { + List ret = new ArrayList(); + + for (String s : allProposal) + if (StringUtil.startsWithIgnoreCase(s, token)) + ret.add(s); + + if (ret.isEmpty()) + ret.addAll(allProposal); + + return ret; + } + + public static final List NO_PROPOSAL = new ArrayList(); + @@ -42,6 +73,20 @@ public abstract class AbstractCommandExecutor implements CommandExecutor { } + /** + *

Concatène les chaines de caractères passés dans args (avec " " comme séparateur), en ommettant + * celles qui se trouvent avant index.
+ * Par exemple :

+ * + * getLastParams(new String[] {"test", "bouya", "chaka", "bukkit"}, 1); + * + *

retournera la chaine "bouya chaka bukkit" + * @param args liste des arguments d'une commandes.
+ * Le premier élément est l'argument qui suit le nom de la commande. + * Usuellement, ce paramètre correspond au paramètre args de la méthode onCommand + * @param index + * @return + */ public static String getLastParam(String[] args, int index) { if (index < 0 || index >= args.length) return null; diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAdmin.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAdmin.java index 6cd5d78..38d8221 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAdmin.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAdmin.java @@ -1,5 +1,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; +import java.util.List; + import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.NetworkAPI; import net.mc_pandacraft.java.plugin.pandacraftutils.network_api.NetworkAPIListener; @@ -8,11 +10,15 @@ import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import com.google.common.collect.ImmutableList; + public class CommandAdmin extends AbstractCommandExecutor { public CommandAdmin() { super("admin"); } + + @Override public boolean onCommand(CommandSender sender, Command cmd, String label, @@ -25,7 +31,7 @@ public class CommandAdmin extends AbstractCommandExecutor { if (nwAPI.isAlive()) sender.sendMessage(ChatColor.GREEN+"NetworkAPI écoute au port "+NetworkAPIListener.getInstance().getPort()); else - sender.sendMessage(ChatColor.GREEN+"NetworkAPI n'est pas démarré. Voir la console pour les détails, ou faites /admin reload "); + sender.sendMessage(ChatColor.GREEN+"NetworkAPI n'est pas démarré. Voir la console pour les détails, ou faites /admin reload network"); return true; } @@ -47,6 +53,28 @@ public class CommandAdmin extends AbstractCommandExecutor { return false; } + + + + + + public static final List FIRST_ARG = ImmutableList.of("reload"); + public static final List RELOAD_SECOND_ARG = ImmutableList.of("config", "network"); + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + if (args.length == 1) { + return getTabProposalFromToken(args[0], FIRST_ARG); + } + else if (args.length > 1) { + if (args[0].equalsIgnoreCase("reload")) + if (args.length == 2) + return getTabProposalFromToken(args[1], RELOAD_SECOND_ARG); + } + + return NO_PROPOSAL; + } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAnimal.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAnimal.java index cb18f66..9250fe1 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAnimal.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAnimal.java @@ -1,5 +1,8 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; +import java.util.ArrayList; +import java.util.List; + import net.mc_pandacraft.java.plugin.pandacraftutils.modules.protection.TamedEntityProtectManager; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; @@ -46,7 +49,8 @@ public class CommandAnimal extends AbstractCommandExecutor { // si je joueur n'a pas encore sélectionné d'animal if (op.getSelectedAnimal() == null) { - p.sendMessage(ChatColor.RED+"Faites d'abord un clic droite sur un animal apprivoisé (cheval, loup ou chat)"); + p.sendMessage(ChatColor.RED+"Faites d'abord un clic droit sur un animal apprivoisé (cheval, loup ou chat)"); + p.sendMessage(ChatColor.RED+"Pour désactiver la sélection, faites "+ChatColor.GRAY+"/cubo annuler"); return true; } @@ -90,5 +94,48 @@ public class CommandAnimal extends AbstractCommandExecutor { return false; } + + + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + + if (!(sender instanceof Player)) { + return NO_PROPOSAL; + } + + Player p = (Player) sender; + OnlinePlayer op = OnlinePlayerManager.get(p); + + if (!op.isAnimalSelectionEnabled()) { + return NO_PROPOSAL; + } + // la sélection d'un animal est déjà activée + List proposal_first_arg = new ArrayList(); + + proposal_first_arg.add("annuler"); + + + if (op.getSelectedAnimal() != null) + proposal_first_arg.add("donner"); + + + + + if (args.length == 1) { + return getTabProposalFromToken(args[0], proposal_first_arg); + } + else if (args.length > 1) { + if (args.length == 2) { + if (args[0].equalsIgnoreCase("donner")) + return getTabProposalFromToken(args[1], OnlinePlayerManager.getNamesOnlyVisible(p)); + } + } + + + + return NO_PROPOSAL; + } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAutomessager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAutomessager.java index e26f238..3c602d8 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAutomessager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandAutomessager.java @@ -1,5 +1,6 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; +import java.util.ArrayList; import java.util.List; import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager; @@ -49,5 +50,23 @@ public class CommandAutomessager extends AbstractCommandExecutor { return true; } + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + if (args.length == 1) { + + List messages = ConfigManager.getInstance().autoMessagesConfig.getAutoMessages(); + + List nb = new ArrayList(); + for (int i=0; i 2) return false; + if (args.length < 2) return false; - String perm = args[0]; - args[0] = null; - - - plugin.broadcast(ChatColor.translateAlternateColorCodes('&', StringUtils.join(args, ' ')), true, perm); + plugin.broadcast(ChatColor.translateAlternateColorCodes('&', getLastParam(args, 1)), true, args[0]); return true; } + + + + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + if (cmd.getAliases().contains("broadcast")) + return null; + + // ici, il s'agit de /broadcastperm + + if (args.length == 1) { + return NO_PROPOSAL; + } + else + return null; + + + // return NO_PROPOSAL; + } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCoeur.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCoeur.java index 782f24f..a296391 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCoeur.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCoeur.java @@ -1,5 +1,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; +import java.util.List; + import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; @@ -40,5 +42,10 @@ public class CommandCoeur extends AbstractCommandExecutor { return true; } + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + return NO_PROPOSAL; + } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCubo.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCubo.java index 7472712..1c3bcf7 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCubo.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandCubo.java @@ -16,6 +16,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import com.google.common.collect.ImmutableList; import com.sk89q.worldedit.bukkit.selections.CuboidSelection; public class CommandCubo extends AbstractCommandExecutor { @@ -394,10 +395,50 @@ public class CommandCubo extends AbstractCommandExecutor { + + public static final List FIRST_ARG = ImmutableList.of("devis", "creer", "info", "selectionner", "supprimer", "ajouter", "enlever", "liste", "vendre", "acheter"); - - + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + if (args.length == 0 || !(sender instanceof Player)) + return NO_PROPOSAL; + + boolean senderIsStaff = plugin.survivalCuboManager.hasStaffPermission((Player)sender); + + if (args.length == 1) { + return getTabProposalFromToken(args[0], FIRST_ARG); + } + else if (args.length > 1) { + if (args[0].equalsIgnoreCase("devis")) { + if (args.length == 2 && senderIsStaff) + return null; + } + if (args[0].equalsIgnoreCase("creer")) { + if (args.length == 3 && senderIsStaff) + return null; + } + if (args[0].equalsIgnoreCase("ajouter")) { + if (args.length == 2) + return null; + } + if (args[0].equalsIgnoreCase("enlever")) { + if (args.length == 2) + return null; + } + if (args[0].equalsIgnoreCase("liste")) { + if (args.length == 2 && senderIsStaff) + return null; + } + if (args[0].equalsIgnoreCase("vendre")) { + if (args.length == 2) + return null; + } + + } + + return NO_PROPOSAL; + } @@ -572,7 +613,7 @@ public class CommandCubo extends AbstractCommandExecutor { // on vérifie si le joueur peut payer StatsAchatCubo achatCubo = plugin.survivalCuboManager.getStatsAchatCubo(selection, newOwner); - + if (achatCubo.soldeCompteApresCreation < 0) { // le joueur ne peut pas payer commandSender.sendMessage(ChatColor.RED+"La protection ne peut pas se faire"); @@ -592,6 +633,8 @@ public class CommandCubo extends AbstractCommandExecutor { // affichage des messages de réussite + sendConsoleMessage(commandSender.getName(), " vient de créer le cubo ", cubo.getId(), " pour le joueur ", newOwner.getName()); + if (!ownerIsCommandSender) { newOwner.sendMessage(ChatColor.GOLD+"---------- Création d'un cubo ----------"); newOwner.sendMessage(ChatColor.GOLD+"Protection faite par "+ChatColor.RESET+commandSender.getDisplayName()); @@ -682,6 +725,9 @@ public class CommandCubo extends AbstractCommandExecutor { gagnerArgentVenteCubo(insideCubo); plugin.survivalCuboManager.removeCubo(insideCubo); + + sendConsoleMessage(commandSender.getName(), " vient de supprimr le cubo ", insideCubo.getId(), " qui appartenait à ", insideCubo.getOwnerName()); + Player player_cubo = plugin.getServer().getPlayerExact(proprio_cubo); @@ -716,6 +762,7 @@ public class CommandCubo extends AbstractCommandExecutor { plugin.survivalCuboManager.saveRegionManager(commandSender.getWorld()); commandSender.sendMessage(ChatColor.GREEN+"Vous venez d'ajouter "+ChatColor.GRAY+newMember+ChatColor.GREEN+" dans le cubo"); + sendConsoleMessage(commandSender.getName(), " vient d'ajouter ", newMember, " dans le cubo ", insideCubo.getId(), " qui appartient à ", insideCubo.getOwnerName()); } @@ -732,6 +779,7 @@ public class CommandCubo extends AbstractCommandExecutor { plugin.survivalCuboManager.saveRegionManager(commandSender.getWorld()); commandSender.sendMessage(ChatColor.GREEN+"Vous venez de retirer "+ChatColor.GRAY+oldMember+ChatColor.GREEN+" du cubo"); + sendConsoleMessage(commandSender.getName(), " vient de retirer ", oldMember, " du cubo ", insideCubo.getId(), " qui appartient à ", insideCubo.getOwnerName()); } @@ -764,6 +812,8 @@ public class CommandCubo extends AbstractCommandExecutor { StatsAchatCubo achatCubo = plugin.survivalCuboManager.getStatsAchatCubo(insideCubo.getWESelection(), newOwner); + + sendConsoleMessage(commandSender.getName(), " vient de mettre en vente le cubo ", insideCubo.getId(), " de ", insideCubo.getOwnerName(), " pour le joueur ", newOwner.getName()); newOwner.sendMessage(commandSender.getDisplayName()+ChatColor.GREEN+" vient de mettre en ventre en vente le cubo "+ChatColor.GRAY+insideCubo.getId()+ChatColor.GREEN+" et vous en êtes le destinataire."); newOwner.sendMessage(ChatColor.GREEN+"Prix du cubo mis en vente : "+ChatColor.GRAY+StringUtil.formatDouble(achatCubo.valeurCuboCree)); @@ -793,6 +843,8 @@ public class CommandCubo extends AbstractCommandExecutor { if (ok) { EssentialsInterface.getPlayer(commandSender).setMoney(new BigDecimal(achatCubo.soldeCompteApresCreation)); EssentialsInterface.getPlayer(commandSender).save(); + + sendConsoleMessage(commandSender.getName(), " vient d'acheter le cubo ", insideCubo.getId()); commandSender.sendMessage(ChatColor.GREEN+"---------- Achat de cubo ----------"); commandSender.sendMessage(ChatColor.GREEN+"Le cubo a été acheté avec succès"); @@ -1009,5 +1061,39 @@ public class CommandCubo extends AbstractCommandExecutor { + + + + + + + /** + * Diffuse un message destiné à la console.
+ * Ce message est préfixé de [Modération].
+ * Les 1er, 3ème, 5ème, ... paramètres sont colorés en gris, et 2ème, 4ème, 6ème, ... paramètres + * sont colorés en blanc. Ces paramètres sont ensuite concaténé pour former le message final. + * @param messages + */ + protected void sendConsoleMessage(String ... messages) { + boolean colorToggle = true; + StringBuilder sb = new StringBuilder(); + for (String message : messages) { + sb.append(colorToggle?ChatColor.GRAY:ChatColor.RESET); + + sb.append(message); + + colorToggle = !colorToggle; + } + plugin.getServer().getConsoleSender().sendMessage("["+ChatColor.GREEN+"Cubo"+ChatColor.RESET+"] "+sb.toString()); + } + + + + + + + + + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandGhost.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandGhost.java index f2168cb..a8065f5 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandGhost.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandGhost.java @@ -16,6 +16,8 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import com.google.common.collect.ImmutableList; + public class CommandGhost extends AbstractCommandExecutor { private static final long timeBetweenThorCommand = 5000; private long timeLastThorCommand = System.currentTimeMillis(); @@ -86,8 +88,18 @@ public class CommandGhost extends AbstractCommandExecutor { - - + + public static final List FIRST_ARG = ImmutableList.of("thor", "particle"); + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + if (args.length == 1) { + return getTabProposalFromToken(args[0], FIRST_ARG); + } + + return NO_PROPOSAL; + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandList.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandList.java index 9b3cd5a..5c962cf 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandList.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandList.java @@ -1,6 +1,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; import java.util.ArrayList; +import java.util.List; import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer; @@ -18,6 +19,8 @@ import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; import org.bukkit.entity.Damageable; import org.bukkit.entity.Player; +import com.google.common.collect.ImmutableList; + public class CommandList extends AbstractCommandExecutor { public CommandList() { @@ -269,8 +272,21 @@ public class CommandList extends AbstractCommandExecutor { return true; } + + public static final List FIRST_ARG = ImmutableList.of("loc", "world", "uuid", "ip", "ping", "afk", "gm", "gamemode", "spam"); - + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + boolean detailPermission = (!(sender instanceof Player)) || OnlinePlayerManager.get((Player)sender).hasPermission("pandacraft.players.details"); + + if (args.length == 1 && detailPermission) { + return getTabProposalFromToken(args[0], FIRST_ARG); + } + + return NO_PROPOSAL; + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMe.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMe.java index a108a8d..1c6e4a1 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMe.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMe.java @@ -2,7 +2,6 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface; -import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -37,15 +36,12 @@ public class CommandMe extends AbstractCommandExecutor { name = ChatColor.ITALIC+"@ "; // message à afficher - String message; + String message = getLastParam(args, 0); if (!(sender instanceof Player) || ((Player)sender).hasPermission("pandacraft.me.color")) { - message = ChatColor.translateAlternateColorCodes('&', StringUtils.join(args, ' ')); - } - else { - message = StringUtils.join(args, ' '); + message = ChatColor.translateAlternateColorCodes('&', message); } - plugin.getServer().broadcastMessage(name + message); + plugin.broadcast(name + message, false); return true; } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandModo.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandModo.java index 9f3d202..4a7aa08 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandModo.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandModo.java @@ -3,6 +3,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; +import java.util.List; import net.mc_pandacraft.java.plugin.pandacraftutils.config.ConfigManager; import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.ModoHistoryElement; @@ -23,6 +24,7 @@ import org.bukkit.util.Vector; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.DateUtil; +import com.google.common.collect.ImmutableList; public class CommandModo extends AbstractCommandExecutor { @@ -253,6 +255,55 @@ public class CommandModo extends AbstractCommandExecutor { + + public static final List FIRST_ARG = ImmutableList.of("report", "jails", "jail", "unjail", "mute", "unmute", "ban", "unban", "kick", "amende", "1", "2", "3", "4"); + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + if (args.length == 1) { + return getTabProposalFromToken(args[0], FIRST_ARG); + } + else if (args.length > 1) { + + // + if (args[0].equalsIgnoreCase("report")) { + return null; + } + if (args[0].equalsIgnoreCase("kick")) { + return null; + } + if (args[0].equalsIgnoreCase("unjail")) { + return null; + } + if (args[0].equalsIgnoreCase("unmute")) { + return null; + } + if (args[0].equalsIgnoreCase("unban")) { + return null; + } + + // + if (args[0].equalsIgnoreCase("jail")) { + if (args.length == 2 || args.length > 3) + return null; + } + if (args[0].equalsIgnoreCase("mute")) { + if (args.length == 2 || args.length > 3) + return null; + } + if (args[0].equalsIgnoreCase("ban")) { + if (args.length == 2 || args.length > 3) + return null; + } + if (args[0].equalsIgnoreCase("amende")) { + if (args.length == 2 || args.length > 3) + return null; + } + } + + return NO_PROPOSAL; + } @@ -262,6 +313,63 @@ public class CommandModo extends AbstractCommandExecutor { + + + + + private void showHelp(CommandSender sender, int page) { + ArrayList s = new ArrayList(); + + s.add(ChatColor.GOLD+"-------- Assistant de modération --------"); + + + + if (page == 1) { + s.add(ChatColor.GOLD+"- Commandes sans sanction :"); + s.add(ChatColor.GRAY+"/modo report "+ChatColor.WHITE+" faire un rapport d'un joueur, sans appliquer de sanction"); + s.add(ChatColor.GRAY+"/modo jails"+ChatColor.WHITE+" aller à la prison"); + s.add(ChatColor.GOLD+"- Aide sur les commandes de sanction :"); + s.add(ChatColor.GRAY+"/modo 2"+ChatColor.WHITE+" application d'une sanction"); + s.add(ChatColor.GRAY+"/modo 3"+ChatColor.WHITE+" retrait d'une sanction"); + s.add(ChatColor.GRAY+"/modo 4"+ChatColor.WHITE+" règles sur les sanctions"); + } + else if (page == 2) { + s.add(ChatColor.GOLD+"- Appliquer une sanction :"); + s.add(ChatColor.GRAY+"/modo jail "+ChatColor.WHITE+" emprisonner un pendant une en précisant la "); + s.add(ChatColor.GRAY+"/modo mute "+ChatColor.WHITE+" rendre muet un pendant une en précisant la "); + s.add(ChatColor.GRAY+"/modo ban "+ChatColor.WHITE+" bannir un pendant une en précisant la "); + s.add(ChatColor.GRAY+"/modo kick "+ChatColor.WHITE+" expulse un en précisant la "); + s.add(ChatColor.GRAY+"/modo amende "+ChatColor.WHITE+" expulse un en précisant la "); + } + else if (page == 3) { + s.add(ChatColor.GOLD+"- Retirer une sanction :"); + s.add(ChatColor.GRAY+"/modo unjail "+ChatColor.WHITE+" sortir de prison un en précisant la "); + s.add(ChatColor.GRAY+"/modo unmute "+ChatColor.WHITE+" rendre la parole à un en précisant la "); + s.add(ChatColor.GRAY+"/modo unban "+ChatColor.WHITE+" retirer le bannissement d'un en précisant la "); + } + else if (page == 4) { + s.add(ChatColor.GOLD+"- Règles sur les sanctions :"); + s.add(ChatColor.WHITE+"- Certains membres du staff on plus ou moins de droits concernant les sanctions (durée de jail, ban et mute)"); + s.add(ChatColor.WHITE+"- Toutes les sanctions doivent être justifiées. Vous êtes obligé d'indiquer la raison de la sanction dans les commandes"); + s.add(ChatColor.WHITE+"- Toutes les actions dans la commande "+ChatColor.GRAY+"/modo"+ChatColor.WHITE+" sont enregistrées"); + s.add(ChatColor.WHITE+"- Rendez vous sur MineAdmin pour les autres règles de Modération"); + s.add(ChatColor.WHITE+"- Rendez vous sur le site web de Pandacraft pour le règlement du serveur et les sanctions à appliquer"); + } + else { + s.add(ChatColor.GOLD+"La page "+page+" n'existe pas"); + } + + s.add(ChatColor.GOLD+"------------------------------------------"); + + sender.sendMessage(s.toArray(new String[s.size()])); + } + + + + + + + @@ -710,60 +818,6 @@ public class CommandModo extends AbstractCommandExecutor { - private void showHelp(CommandSender sender, int page) { - ArrayList s = new ArrayList(); - - s.add(ChatColor.GOLD+"-------- Assistant de modération --------"); - - - - if (page == 1) { - s.add(ChatColor.GOLD+"- Commandes sans sanction :"); - s.add(ChatColor.GRAY+"/modo report "+ChatColor.WHITE+" faire un rapport d'un joueur, sans appliquer de sanction"); - s.add(ChatColor.GRAY+"/modo jails"+ChatColor.WHITE+" aller à la prison"); - s.add(ChatColor.GOLD+"- Aide sur les commandes de sanction :"); - s.add(ChatColor.GRAY+"/modo 2"+ChatColor.WHITE+" application d'une sanction"); - s.add(ChatColor.GRAY+"/modo 3"+ChatColor.WHITE+" retrait d'une sanction"); - s.add(ChatColor.GRAY+"/modo 4"+ChatColor.WHITE+" règles sur les sanctions"); - } - else if (page == 2) { - s.add(ChatColor.GOLD+"- Appliquer une sanction :"); - s.add(ChatColor.GRAY+"/modo jail "+ChatColor.WHITE+" emprisonner un pendant une en précisant la "); - s.add(ChatColor.GRAY+"/modo mute "+ChatColor.WHITE+" rendre muet un pendant une en précisant la "); - s.add(ChatColor.GRAY+"/modo ban "+ChatColor.WHITE+" bannir un pendant une en précisant la "); - s.add(ChatColor.GRAY+"/modo kick "+ChatColor.WHITE+" expulse un en précisant la "); - s.add(ChatColor.GRAY+"/modo amende "+ChatColor.WHITE+" expulse un en précisant la "); - } - else if (page == 3) { - s.add(ChatColor.GOLD+"- Retirer une sanction :"); - s.add(ChatColor.GRAY+"/modo unjail "+ChatColor.WHITE+" sortir de prison un en précisant la "); - s.add(ChatColor.GRAY+"/modo unmute "+ChatColor.WHITE+" rendre la parole à un en précisant la "); - s.add(ChatColor.GRAY+"/modo unban "+ChatColor.WHITE+" retirer le bannissement d'un en précisant la "); - } - else if (page == 4) { - s.add(ChatColor.GOLD+"- Règles sur les sanctions :"); - s.add(ChatColor.WHITE+"- Certains membres du staff on plus ou moins de droits concernant les sanctions (durée de jail, ban et mute)"); - s.add(ChatColor.WHITE+"- Toutes les sanctions doivent être justifiées. Vous êtes obligé d'indiquer la raison de la sanction dans les commandes"); - s.add(ChatColor.WHITE+"- Toutes les actions dans la commande "+ChatColor.GRAY+"/modo"+ChatColor.WHITE+" sont enregistrées"); - s.add(ChatColor.WHITE+"- Rendez vous sur MineAdmin pour les autres règles de Modération"); - s.add(ChatColor.WHITE+"- Rendez vous sur le site web de Pandacraft pour le règlement du serveur et les sanctions à appliquer"); - } - else { - s.add(ChatColor.GOLD+"La page "+page+" n'existe pas"); - } - - s.add(ChatColor.GOLD+"------------------------------------------"); - - sender.sendMessage(s.toArray(new String[s.size()])); - } - - - - - - - - diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMuco.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMuco.java index d6ccdf7..fee8fa4 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMuco.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMuco.java @@ -42,7 +42,8 @@ public class CommandMuco extends AbstractCommandExecutor { return true; } - if ((sender instanceof Player) && !OnlinePlayerManager.get((Player)sender).hasPermission("pandacraft.muco."+list_name)) { + if ((sender instanceof Player) && !OnlinePlayerManager.get((Player)sender).hasPermission("pandacraft.muco."+list_name) + && !OnlinePlayerManager.get((Player)sender).hasPermission("pandacraft.muco.*")) { sender.sendMessage(ChatColor.RED+"Vous n'avez pas la permission pour la sous commande '"+list_name+"'"); return true; } @@ -67,7 +68,20 @@ public class CommandMuco extends AbstractCommandExecutor { } - + + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + if (args.length == 1) { + return getTabProposalFromToken(args[0], getMucoLists((sender instanceof Player)?OnlinePlayerManager.get((Player)sender):null)); + } + else if (args.length > 1) { + return null; + } + + return NO_PROPOSAL; + } @@ -82,7 +96,7 @@ public class CommandMuco extends AbstractCommandExecutor { sender.sendMessage(ChatColor.GOLD+"----- Liste des commandes /muco -----"); for (String name : list_names) { - sender.sendMessage(" - "+ChatColor.GRAY+name); + sender.sendMessage("- "+ChatColor.GRAY+name); } sender.sendMessage(ChatColor.GOLD+"-----------------------------------"); @@ -95,7 +109,7 @@ public class CommandMuco extends AbstractCommandExecutor { List retList = new ArrayList(); for (String name : list_names) { - if (permittedPlayer == null || permittedPlayer.hasPermission("pandacraft.muco."+name)) + if (permittedPlayer == null || permittedPlayer.hasPermission("pandacraft.muco."+name) || permittedPlayer.hasPermission("pandacraft.muco.*")) retList.add(name); } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandPing.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandPing.java index 13f5149..b82012e 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandPing.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandPing.java @@ -1,5 +1,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; +import java.util.List; + import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -45,5 +47,12 @@ public class CommandPing extends AbstractCommandExecutor { return true; } + + + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + return NO_PROPOSAL; + } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandStaff.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandStaff.java index f4763dd..f7fab8a 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandStaff.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandStaff.java @@ -1,18 +1,20 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; import java.util.Date; +import java.util.List; import net.mc_pandacraft.java.plugin.pandacraftutils.modules.staff.StaffQueueManager; import net.mc_pandacraft.java.plugin.pandacraftutils.modules.staff.StaffQueueManager.WaitingPlayer; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; import net.mc_pandacraft.java.util.TimeUtil; -import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import com.google.common.collect.ImmutableList; + public class CommandStaff extends AbstractCommandExecutor { public CommandStaff() { @@ -23,196 +25,211 @@ public class CommandStaff extends AbstractCommandExecutor { public boolean onCommand(CommandSender sender, Command cmd, String alias, String[] args) { + + StaffQueueManager staffManager = plugin.staffQueueManager; if (sender instanceof Player && !OnlinePlayerManager.get((Player)sender).isInStaff()) { // un joueur qui n'est pas du staff - - // le joueur est-il déjà en file d'attente ? - if (staffManager.getWaitingPlayer((Player)sender) != null) { - if (args.length > 0 && args[0].equalsIgnoreCase("annuler")) { - staffManager.removePlayer((Player)sender); - sender.sendMessage(ChatColor.GREEN+"Vous avez été retiré de la file d'attente"); + + if (args.length == 0) { + showHelp(sender); + return true; + } + + Player player = (Player) sender; + + WaitingPlayer wp = staffManager.getWaitingPlayer(player); + + if (args[0].equalsIgnoreCase("ajouter") && args.length > 1) { + if (wp != null) { + sender.sendMessage(ChatColor.RED+"Vous avez déjà envoyé un ticket :"); + displayTicket(sender, wp, false); + sender.sendMessage(ChatColor.RED+"Faites "+ChatColor.GRAY+"/"+alias+" modifier "+ChatColor.RED+" pour modifier le message du ticket"); return true; } - else if (args.length > 0 && args[0].equalsIgnoreCase("position")) { - - sender.sendMessage(ChatColor.GREEN+"Vous êtes à la position "+staffManager.getPlayerPosition((Player)sender)+" de la file d'attente"); + + String message = getLastParam(args, 1); + + staffManager.addWaitingPlayer(player, message); + sender.sendMessage(ChatColor.GREEN+"Votre ticket a été envoyé :)"); + displayTicket(sender, wp, false); + sender.sendMessage(ChatColor.RED+"Faites "+ChatColor.GRAY+"/"+alias+ChatColor.RED+" pour voir les commandes disponibles"); + return true; + } + if (args[0].equalsIgnoreCase("supprimer")) { + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Il n'y a pas de ticket à supprimer"); 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"); + + staffManager.removePlayer(player); 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"); - sender.sendMessage(ChatColor.RED+"Si votre message n'est pas assez explicite ou détaillée, votre demande pourra être ignoré"); + if (args[0].equalsIgnoreCase("modifier") && args.length > 1) { + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Il n'y a pas de ticket à modifier"); + return true; + } + + String message = getLastParam(args, 1); + + wp.setMessage(message); + sender.sendMessage(ChatColor.GREEN+"Votre ticket a été modifié :"); + displayTicket(sender, wp, false); + return true; + } + if (args[0].equalsIgnoreCase("position")) { + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Il n'y a aucun ticket à votre nom"); + return true; + } + + int pos = staffManager.getPlayerPosition(player); + sender.sendMessage(ChatColor.GOLD+"Votre ticket est à la position "+pos+" de la file d'attente"); return true; } - staffManager.addWaitingPlayer((Player)sender, StringUtils.join(args, " ")); - 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 "+staffManager.getPlayerPosition((Player)sender)+" de la file d'attente"); + sender.sendMessage(ChatColor.RED+"Mauvaise utilisation : faites "+ChatColor.GRAY+"/"+alias+ChatColor.RED+" pour voir les commandes disponibles"); return true; } - else if (sender instanceof Player) - { // un joueur du staff - if (args.length == 0) { - staffManager.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) { - staffManager.showWaintingList(sender); - return true; - } - else - { - return onCommand_admin_commands(sender, args); - } - - - } - } - - - - - - - private boolean onCommand_admin_commands(CommandSender sender, String[] args) { + // ------------- + // à partir de là, on fait partie du staff + // ------------- - StaffQueueManager staffManager = plugin.staffQueueManager; - 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 finish"+ChatColor.RESET+" : quand vous avez fini de prendre en charge le joueur en cours"); - sender.sendMessage(ChatColor.GRAY+"/staff cancel"+ChatColor.RESET+" : quand vous ne pouvez pas prendre en charge le joueur en cours"); - } - 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"); + if (args.length == 0) { + staffManager.showWaintingList(sender); + sender.sendMessage(ChatColor.GOLD+"Pour connaitre les commandes, faites "+ChatColor.GRAY+"/staff ?"); return true; } - else if (args[0].equalsIgnoreCase("select") && args.length > 1 && sender instanceof Player) - { - WaitingPlayer wp; - // on vérifie si le membre du staff n'est pas déjà associé à un joueur - if ((wp = staffManager.getSelectedWaitingPlayer((Player)sender)) != null) { - sender.sendMessage(ChatColor.RED+"Vous vous occupez déjà d'un joueur. Faites "+ChatColor.GRAY+"/staff finish"+ChatColor.RED+" si vous en avez fini avec "+wp.getPlayerDisplayName()); - return true; - } + + + if (sender instanceof Player) + { // un joueur du staff IG - // on vérifie que le joueur indiqué se trouve dans la file d'attente - wp = staffManager.getWaitingPlayer(args[1]); - if (wp == null) { - sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la liste"); - return true; - } + Player staffPlayer = (Player) sender; + WaitingPlayer selectedWP = staffManager.getSelectedWaitingPlayer((Player)sender); - // on vérifie si un membre du staff ne s'occupe pas déjà du joueur - if (wp.getStaffPlayerName() != null) { - sender.sendMessage(ChatColor.RED+wp.getStaffPlayerName()+" s'occupe déjà de ce joueur"); - return true; - } - - - wp.setStaffPlayer((Player)sender); - - Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); - if (p != null && p.isOnline()) { - // le joueur est en ligne - sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); - sender.sendMessage(p.getDisplayName()+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+"-----------------------------------------------"); + if (args[0].equalsIgnoreCase("selectionner") && args.length > 1) + { + if (selectedWP != null) { + sender.sendMessage(ChatColor.RED+"Vous avez déjà sélectionné le joueur "+ChatColor.RESET+selectedWP.getPlayerDisplayName()); + sender.sendMessage(ChatColor.RED+"Faites "+ChatColor.RESET+"/"+alias+" finir"+ChatColor.RED+" pour en finir avec ce joueur"); + return true; + } + + WaitingPlayer wp = staffManager.getWaitingPlayer(args[1]); + + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Ce joueur n'est pas dans la file d'attente"); + return true; + } + // on vérifie si un membre du staff ne s'occupe pas déjà du joueur + if (wp.getStaffPlayerName() != null) { + sender.sendMessage(ChatColor.RED+wp.getStaffPlayerName()+" s'occupe déjà de ce joueur"); + return true; + } + + wp.setStaffPlayer(staffPlayer); + + Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); + if (p != null && p.isOnline()) { + // le joueur est en ligne + ((Player)sender).teleport(p.getLocation()); + + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + displayTicket(sender, wp, true); + sender.sendMessage(ChatColor.GREEN+"Vous avez été téléporté vers ce joueur"); + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); - p.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); - p.sendMessage(((Player)sender).getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" s'occupe maintenant de vous :)"); - p.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + p.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + p.sendMessage(((Player)sender).getDisplayName()+ChatColor.RESET+ChatColor.GREEN+" s'occupe maintenant de vous :)"); + p.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + + } + else { + // le joueur n'est pas en ligne + ((Player)sender).teleport(wp.getLocation()); + + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + displayTicket(sender, wp, true); + sender.sendMessage(ChatColor.GREEN+"Vous avez été téléporté vers l'endroit concerné par la demande du joueur"); + sender.sendMessage(ChatColor.GREEN+"-----------------------------------------------"); + } + + + return true; + } + if (args[0].equalsIgnoreCase("finir")) + { + if (selectedWP == null) { + sender.sendMessage(ChatColor.RED+"Vous ne vous occupez actuellement de personne. Faites "+ChatColor.GRAY+"/staff"+ChatColor.RED+" pour voir si vous pouvez aider un joueur"); + return true; + } + + staffManager.removePlayer(selectedWP.getPlayerName()); + + sender.sendMessage(ChatColor.GREEN+selectedWP.getPlayerDisplayName()+ChatColor.RESET+ChatColor.GREEN+" a été retiré de la file d'attente"); + + Player p = plugin.getServer().getPlayerExact(selectedWP.getPlayerName()); + if (p != null && p.isOnline()) { + p.sendMessage(ChatColor.RED+"Vous avez été retiré de la file d'attente"); + } + + return true; } - 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+"-----------------------------------------------"); + if (args[0].equalsIgnoreCase("annuler")) + { + if (selectedWP == null) { + sender.sendMessage(ChatColor.RED+"Vous ne vous occupez actuellement de personne. Faites "+ChatColor.GRAY+"/staff"+ChatColor.RED+" pour voir si vous pouvez aider un joueur"); + return true; + } + + selectedWP.setStaffPlayer(null); + + Player p = plugin.getServer().getPlayerExact(selectedWP.getPlayerName()); + if (p != null && p.isOnline()) { + p.sendMessage(ChatColor.RED+staffPlayer.getDisplayName()+ChatColor.RED+" n'a pas la possibilité de traiter votre demande :/" + + "Mais ne vous en faites pas, vous avez été remis en file d'attente et un autre membre du staff peut vous prendre en charge ;)"); + } + + + sender.sendMessage(ChatColor.GREEN+selectedWP.getPlayerDisplayName()+ChatColor.RESET+ChatColor.GREEN+" a été remis en attente"); + return true; + } - - - return true; } - else if (args[0].equalsIgnoreCase("finish") && sender instanceof Player) + + + + + + // les commandes ci dessous peuvent être pris en charge par la console, ou comme un membre du staff IG + + + if (args[0].equalsIgnoreCase("?")) + { // affichage de l'aide + showHelp(sender); + return true; + } + + if (args[0].equalsIgnoreCase("supprimer") && args.length > 1) { - WaitingPlayer wp = staffManager.getSelectedWaitingPlayer((Player)sender); + WaitingPlayer wp = staffManager.getWaitingPlayer(args[1]); if (wp == null) { - sender.sendMessage(ChatColor.RED+"Vous ne vous occupez actuellement de personne. Faites "+ChatColor.GRAY+"/staff"+ChatColor.RED+" pour voir si vous pouvez aider un joueur"); + sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'est pas dans la file"); return true; } staffManager.removePlayer(wp.getPlayerName()); - - 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("cancel") && sender instanceof Player) - { - WaitingPlayer wp = staffManager.getSelectedWaitingPlayer((Player)sender); - if (wp == null) { - sender.sendMessage(ChatColor.RED+"Vous ne vous occupez actuellement de personne. Faites "+ChatColor.GRAY+"/staff"+ChatColor.RED+" pour voir si vous pouvez aider un joueur"); - return true; - } - - wp.setStaffPlayer(null); - - Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); - if (p != null && p.isOnline()) { - p.sendMessage(ChatColor.RED+((Player)sender).getDisplayName()+ChatColor.RED+" ne s'occupe plus de vous, mais vous restez en file d'attente"); - } - - - sender.sendMessage(ChatColor.GREEN+wp.getPlayerName()+ChatColor.RESET+ChatColor.GREEN+" a été remis en attente"); - - return true; - - } - else if (args[0].equalsIgnoreCase("remove") && args.length > 1) - { - WaitingPlayer wp = staffManager.getWaitingPlayer(args[1]); - if (wp == null) { - sender.sendMessage(ChatColor.RED+"Le joueur n'est pas dans la file"); - return true; - } - - staffManager.removePlayer(args[1]); Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); if (p != null && p.isOnline()) { p.sendMessage(ChatColor.RED+"Vous avez été retiré de la file d'attente"); @@ -223,7 +240,7 @@ public class CommandStaff extends AbstractCommandExecutor { return true; } - else if (args[0].equalsIgnoreCase("add") && args.length > 1) + if (args[0].equalsIgnoreCase("ajouter") && args.length > 2) { Player p = plugin.getServer().getPlayer(args[1]); @@ -235,17 +252,11 @@ public class CommandStaff extends AbstractCommandExecutor { WaitingPlayer wp = staffManager.getWaitingPlayer(p.getName()); if (wp != null) { - sender.sendMessage(ChatColor.RED+"Le joueur est déjà dans la liste"); + sender.sendMessage(ChatColor.RED+"Le joueur a déjà son ticket en attente"); 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 = StringUtils.join(args, " "); + String message = ChatColor.ITALIC+"(Ajouté par "+sender.getName() +") "+ ChatColor.RESET+getLastParam(args, 2); staffManager.addWaitingPlayer(p, message); @@ -255,8 +266,40 @@ public class CommandStaff extends AbstractCommandExecutor { p.sendMessage(ChatColor.GREEN+sender.getName()+" vous a ajouté dans la file d'attente pour traiter votre demande plus tard"); return true; } - sender.sendMessage(ChatColor.RED+"La commande a mal été tapé"); - return false; + if (args[0].equalsIgnoreCase("modifier") && args.length > 2) + { + + WaitingPlayer wp = staffManager.getWaitingPlayer(args[1]); + if (wp == null) { + sender.sendMessage(ChatColor.RED+"Le joueur indiqué n'est pas dans la file"); + return true; + } + + String message = ChatColor.ITALIC+"(Modifié par "+sender.getName() +") "+ ChatColor.RESET+getLastParam(args, 2); + + wp.setMessage(message); + + sender.sendMessage(ChatColor.GREEN+"Le message de "+ChatColor.RESET+wp.getPlayerDisplayName()+ChatColor.GREEN+" a été modifié"); + + Player p = plugin.getServer().getPlayerExact(wp.getPlayerName()); + if (p != null && p.isOnline()) { + p.sendMessage(ChatColor.GOLD+sender.getName()+" a modifié le message de votre ticket "+ChatColor.GRAY+"/staff"+ChatColor.GOLD+" :"); + displayTicket(p, wp, false); + } + + return true; + } + + + + + + sender.sendMessage(ChatColor.RED+"Mauvaise utilisation : faites "+ChatColor.GRAY+"/"+alias+" ?"+ChatColor.RED+" pour voir les commandes disponibles"); + return true; + + + + } @@ -272,6 +315,157 @@ public class CommandStaff extends AbstractCommandExecutor { + + + + public static final List FIRST_ARG_PLAYERS = ImmutableList.of("ajouter", "supprimer", "modifier", "position"); + public static final List FIRST_ARG_STAFF = ImmutableList.of("?", "ajouter", "modifier", "supprimer", "selectionner", "annuler", "finir"); + public static final List FIRST_ARG_CONSOLE = ImmutableList.of("?", "ajouter", "modifier", "supprimer"); + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + StaffQueueManager staffManager = plugin.staffQueueManager; + + if (sender instanceof Player && !OnlinePlayerManager.get((Player)sender).isInStaff()) + { // pour les joueurs + if (args.length == 1) { + return getTabProposalFromToken(args[0], FIRST_ARG_PLAYERS); + } + if (args.length > 1) { + if (args[0].equalsIgnoreCase("ajouter")) + return null; + if (args[0].equalsIgnoreCase("modifier")) + return null; + } + } + else if (sender instanceof Player) + { // pour le staff connecté + if (args.length == 1) + return getTabProposalFromToken(args[0], FIRST_ARG_STAFF); + if (args.length > 1) { + if (args[0].equalsIgnoreCase("ajouter")) { + if (args.length == 2) { + List playerCanBeAdd = OnlinePlayerManager.getNamesOnlyVisible((Player) sender); + playerCanBeAdd.removeAll(staffManager.getWaitingPlayerNames()); + return getTabProposalFromToken(args[1], playerCanBeAdd); + } + if (args.length > 2) + return null; + } + if (args[0].equalsIgnoreCase("modifier")) { + if (args.length == 2) + return getTabProposalFromToken(args[1], staffManager.getWaitingPlayerNames()); + if (args.length > 2) + return null; + } + if (args[0].equalsIgnoreCase("supprimer")) + if (args.length == 2) + return getTabProposalFromToken(args[1], staffManager.getWaitingPlayerNames()); + if (args[0].equalsIgnoreCase("selectionner")) + if (args.length == 2) + return getTabProposalFromToken(args[1], staffManager.getWaitingPlayerNames()); + } + } + else + { // pour la console et le reste (pas les joueurs) + if (args.length == 1) + return getTabProposalFromToken(args[0], FIRST_ARG_CONSOLE); + if (args.length > 1) { + if (args[0].equalsIgnoreCase("ajouter")) { + if (args.length == 2) { + List playerCanBeAdd = OnlinePlayerManager.getNamesOnlyVisible(null); + playerCanBeAdd.removeAll(staffManager.getWaitingPlayerNames()); + return getTabProposalFromToken(args[1], playerCanBeAdd); + } + if (args.length > 2) + return null; + } + if (args[0].equalsIgnoreCase("modifier")) { + if (args.length == 2) + return getTabProposalFromToken(args[1], staffManager.getWaitingPlayerNames()); + if (args.length > 2) + return null; + } + if (args[0].equalsIgnoreCase("supprimer")) + if (args.length == 2) + return getTabProposalFromToken(args[1], staffManager.getWaitingPlayerNames()); + } + } + + + return NO_PROPOSAL; + } + + + + + + private void showHelp(CommandSender sender) { + + String[] messages = null; + if (sender instanceof Player && !OnlinePlayerManager.get((Player)sender).isInStaff()) + { // pour les joueurs + String[] m = { + ChatColor.GOLD+"----- Ticket / file d'attente staff -----", + ChatColor.GOLD+"Les tickets vous permettent de demander assistance à un membre du staff", + ChatColor.GRAY+"/staff ajouter "+ChatColor.GOLD+" pour ajouter un ticket dans la file d'attente", + ChatColor.GRAY+"/staff supprimer"+ChatColor.GOLD+" pour supprimer votre ticket de la file d'attente", + ChatColor.GRAY+"/staff modifier "+ChatColor.GOLD+" pour modifier le message de votre ticket", + ChatColor.GRAY+"/staff position"+ChatColor.GOLD+" pour connaitre votre position dans la file d'attente", + ChatColor.GOLD+"------------------------------------------" + }; + messages = m; + } + else if (sender instanceof Player) + { // pour le staff connecté + String[] m = { + ChatColor.GOLD+"----- Ticket / file d'attente staff -----", + ChatColor.GRAY+"/staff"+ChatColor.GOLD+" pour voir la liste des tickets", + ChatColor.GRAY+"/staff ajouter "+ChatColor.GOLD+" pour ajouter un ticket dans la file d'attente", + ChatColor.GRAY+"/staff supprimer "+ChatColor.GOLD+" pour supprimer le ticket d'un joueur de la file d'attente", + ChatColor.GRAY+"/staff modifier "+ChatColor.GOLD+" pour modifier le message du ticket d'un joueur", + ChatColor.GRAY+"/staff selectionner "+ChatColor.GOLD+" pour prendre en charge un joueur en attente", + ChatColor.GRAY+"/staff annuler"+ChatColor.GOLD+" quand vous ne pouvez pas régler le problème du joueur que vous avez pris en charge", + ChatColor.GRAY+"/staff finir"+ChatColor.GOLD+" quand vous avez réglé le problème du joueur que vous avez pris en charge", + ChatColor.GOLD+"------------------------------------------" + }; + messages = m; + } + else + { // pour la console et le reste (pas les joueurs) + String[] m = { + ChatColor.GOLD+"----- Ticket / file d'attente staff -----", + ChatColor.GRAY+"/staff"+ChatColor.GOLD+" pour voir la liste des tickets", + ChatColor.GRAY+"/staff ajouter "+ChatColor.GOLD+" pour ajouter un ticket dans la file d'attente", + ChatColor.GRAY+"/staff supprimer "+ChatColor.GOLD+" pour supprimer le ticket d'un joueur de la file d'attente", + ChatColor.GRAY+"/staff modifier "+ChatColor.GOLD+" pour modifier le message du ticket d'un joueur", + ChatColor.GOLD+"---------------------------------------------" + }; + messages = m; + } + sender.sendMessage(messages); + } + + + + + + + + + + public void displayTicket(CommandSender sender, WaitingPlayer wp, boolean withPlayerName) { + String out = (withPlayerName) ? wp.getPlayerDisplayName()+ChatColor.RESET+" : " : ""; + + out += wp.getMessage()+" - "+ChatColor.ITALIC+"Il y a "+TimeUtil.durationToString((new Date()).getTime() - wp.getDate().getTime()); + + sender.sendMessage(out); + } + + + + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandSystem.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandSystem.java index 6c26682..7c4e619 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandSystem.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandSystem.java @@ -2,6 +2,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.commands; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; +import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -18,11 +19,12 @@ import org.bukkit.ChatColor; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import com.google.common.collect.ImmutableList; + public class CommandSystem extends AbstractCommandExecutor { public CommandSystem() { @@ -41,7 +43,7 @@ public class CommandSystem extends AbstractCommandExecutor { - if (args.length > 0 && (args[0].equalsIgnoreCase("world") || args[0].equalsIgnoreCase("worlds"))) + if (args.length > 0 && args[0].equalsIgnoreCase("world")) { if (args.length > 1 && plugin.getServer().getWorld(args[1]) != null) @@ -105,7 +107,7 @@ public class CommandSystem extends AbstractCommandExecutor { } } - else if (args.length > 0 && (args[0].equalsIgnoreCase("thread") || args[0].equalsIgnoreCase("threads"))) + else if (args.length > 0 && args[0].equalsIgnoreCase("thread")) { try { @@ -161,16 +163,6 @@ public class CommandSystem extends AbstractCommandExecutor { sender.sendMessage(ChatColor.RED+"Erreur lors de l'exécution de la commande."); } - } - else if (args.length > 0 && args[0].equalsIgnoreCase("tps_graph")) - { - if (!(sender instanceof ConsoleCommandSender)) - sender.sendMessage("Graph envoyé sur la console"); - - - ConsoleCommandSender console = plugin.getServer().getConsoleSender(); - console.sendMessage(plugin.tpsAnalysisManager.getStringTPSHistory(20*20)); - } else { @@ -221,5 +213,67 @@ public class CommandSystem extends AbstractCommandExecutor { return true; } + + + + + + public static final List FIRST_ARG = ImmutableList.of("world", "thread"); + + @Override + public List onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { + + if (args.length == 1) { + return getTabProposalFromToken(args[0], FIRST_ARG); + } + else if (args.length > 1) { + if (args[0].equalsIgnoreCase("world")) + if (args.length == 2) + return getTabProposalFromToken(args[1], getWorldList()); + if (args[0].equalsIgnoreCase("thread")) + return autosuggestThread(getLastParam(args, 1)); + } + + return NO_PROPOSAL; + } + + + + + + private List getWorldList() { + List worldsStr = new ArrayList(); + + for (World w : plugin.getServer().getWorlds()) + worldsStr.add(w.getName()); + + return worldsStr; + } + + private List getThreadsList() { + List threadsStr = new ArrayList(); + + ThreadInfo[] threadsInfo = ManagementFactory.getThreadMXBean().dumpAllThreads(false, false); + + for (ThreadInfo th : threadsInfo) + threadsStr.add(th.getThreadName()); + + return threadsStr; + } + + + private List autosuggestThread(String multiWordToken) { + List threadsList = getTabProposalFromToken(multiWordToken, getThreadsList()); + + String[] wordsToken = multiWordToken.split(" "); + + for (int i = 0; i= 2) { + onCommandSend(sender, args[0], getLastParam(args, 1)); + return true; + } + + + + + + return false; + } + + + + private void onCommandSend(CommandSender sender, String target, String message) { + + if (sender instanceof Player && OnlinePlayerManager.get((Player) sender).getEssentialsUser().isMuted()) { + sender.sendMessage(ChatColor.RED+"Vous ne pouvez pas envoyer de message quand vous êtes muet"); + return; + } + + try { + plugin.privateMessagesManager.inputMessage(new MessageSender(sender), target, message); + } catch (MessageSendingException e) { + sender.sendMessage(ChatColor.RED+e.getMessage()); + } + + } + + + +} diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupElement.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupElement.java index 9a802d7..5723364 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupElement.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupElement.java @@ -1,5 +1,8 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.data_model; +import java.sql.SQLException; +import java.util.List; + public class MPGroupElement extends SQLElement { private String groupName; @@ -45,5 +48,12 @@ public class MPGroupElement extends SQLElement { throw new NullPointerException(); groupName = name; } - + + + + public List getUsers() throws SQLException { + return ((MPGroupUserTable)ORM.getTable("mp_group_user")) + .getAll("groupId = "+getId(), "id ASC", null, null); + } + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupUserElement.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupUserElement.java index 16bf76e..f3cf21e 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupUserElement.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupUserElement.java @@ -1,5 +1,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.data_model; +import java.sql.SQLException; + public class MPGroupUserElement extends SQLElement { private int groupId; @@ -51,5 +53,18 @@ public class MPGroupUserElement extends SQLElement { throw new NullPointerException(); this.playerName = playerName; } + + + + + + + public MPWebSessionElement getWebSessionData() throws SQLException { + return ((MPWebSessionTable)ORM.getTable("mp_web_session")) + .getFirst("playerName LIKE '"+getPlayerName()+"'", "id ASC"); + } + + + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupUserTable.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupUserTable.java index 6d2f79b..fb90412 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupUserTable.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPGroupUserTable.java @@ -3,6 +3,8 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.data_model; import java.sql.ResultSet; import java.sql.SQLException; +import net.mc_pandacraft.java.plugin.pandacraftutils.commands.AbstractCommandExecutor; + public class MPGroupUserTable extends SQLTable { public MPGroupUserTable() throws SQLException { @@ -24,5 +26,13 @@ public class MPGroupUserTable extends SQLTable { sqlResult.getInt("groupId"), sqlResult.getString("playerName")); } + + + + public MPGroupUserElement getPlayerInGroup(MPGroupElement group, String player) throws SQLException { + if (!AbstractCommandExecutor.isValidPlayerName(player)) + return null; + return getFirst("groupId = "+group.getId()+" AND playerName = '"+player+"'", "id"); + } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPMessageElement.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPMessageElement.java index 41e09e5..8a81372 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPMessageElement.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPMessageElement.java @@ -1,5 +1,7 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.data_model; +import java.sql.SQLException; + /** * Représente un message dans la base de donnée
*
@@ -21,7 +23,7 @@ public class MPMessageElement extends SQLElement { private String destNick = null; private Integer destGroup = null; private String message; - private boolean read; + private boolean wasRead; private boolean deleted = false; private boolean serverSync; @@ -77,7 +79,7 @@ public class MPMessageElement extends SQLElement { destNick, (destGroup==null)?null:destGroup.toString(), message, - (read)?"1":"0", + (wasRead)?"1":"0", (deleted)?"1":"0", (serverSync)?"1":"0" }; @@ -96,7 +98,7 @@ public class MPMessageElement extends SQLElement { "destNick", "destGroup", "message", - "read", + "wasRead", "deleted", "serverSync" }; @@ -110,7 +112,7 @@ public class MPMessageElement extends SQLElement { public String getDestNick() { return destNick; } public Integer getDestGroup() { return destGroup; } public String getMessage() { return message; } - public boolean isRead() { return read; } + public boolean isRead() { return wasRead; } public boolean isDeleted() { return deleted; } public boolean isServerSync() { return serverSync; } @@ -146,8 +148,18 @@ public class MPMessageElement extends SQLElement { message = msg; } - public void setRead(boolean r) { read = r; } + public void setRead(boolean r) { wasRead = r; } public void setDeleted(boolean del) { deleted = del; } public void setServerSync(boolean sync) { serverSync = sync; } + + + + + + public MPGroupElement getDestGroupElement() throws SQLException { + if (getDestGroup() == null) return null; + + return ((MPGroupTable)ORM.getTable("mp_group")).get(getDestGroup()); + } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPMessageTable.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPMessageTable.java index 049f7cc..29221ef 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPMessageTable.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/MPMessageTable.java @@ -2,6 +2,9 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.data_model; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.List; + +import net.mc_pandacraft.java.plugin.pandacraftutils.commands.AbstractCommandExecutor; public class MPMessageTable extends SQLTable { @@ -19,7 +22,7 @@ public class MPMessageTable extends SQLTable { + "destNick VARCHAR(16) NULL," + "destGroup INT NULL," + "message VARCHAR(512) NOT NULL," - + "read TINYINT NOT NULL," + + "wasRead TINYINT NOT NULL," + "deleted TINYINT NOT NULL," + "serverSync TINYINT NOT NULL"; } @@ -34,19 +37,33 @@ public class MPMessageTable extends SQLTable { sqlResult.getString("viewerNick"), sqlResult.getString("sourceNick"), sqlResult.getString("message"), - sqlResult.getBoolean("read"), + sqlResult.getBoolean("wasRead"), sqlResult.getBoolean("serverSync")); el.setDestNick(sqlResult.getString("destNick")); int group = sqlResult.getInt("destGroup"); el.setDestGroup(sqlResult.wasNull()?null:group); - el.setDestNick(sqlResult.getString("destNick")); + el.setDeleted(sqlResult.getBoolean("deleted")); return el; } + + + public List getAllUnsyncMessage() throws SQLException { + return getAll("serverSync = 0", "time ASC", null, null); + } + + + + public List getAllUnreadForPlayer(String player) throws SQLException { + if (!AbstractCommandExecutor.isValidPlayerName(player)) return null; + + return getAll("viewerNick = "+player+" AND read = 0", "time ASC", null, null); + } + } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/ORM.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/ORM.java index 68e7a60..d1833f0 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/ORM.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/ORM.java @@ -5,7 +5,16 @@ import java.util.HashMap; import java.util.Map; /** - * ORM = Object-Relational Mapping + * ORM = Object-Relational Mapping
+ * Liste des tables avec leur classes : + *

    + *
  • "modo_history" : ModoHistoryTable
  • + *
  • "staff_ticket" : StaffTicketTable
  • + *
  • "mp_message" : MPMessageTable
  • + *
  • "mp_group" : MPGroupTable
  • + *
  • "mp_group_user" : MPGroupUserTable
  • + *
  • "mp_web_session" : MPWebSessionTable
  • + *
* @author Marc Baloup * */ @@ -23,6 +32,8 @@ public final class ORM { */ tables.put("modo_history", new ModoHistoryTable()); + + tables.put("staff_ticket", new StaffTicketTable()); tables.put("mp_message", new MPMessageTable()); tables.put("mp_group", new MPGroupTable()); @@ -40,7 +51,12 @@ public final class ORM { - + /** + * Récupère l'instance de la classe associé à la table demandé en paramètre.
+ * Il est conseillé de caster le retour de cette méthode par la classe associé à la table demandé. + * @param name nom de la table telle qu'elle est enregistrée dans la classe ORM + * @return ta table dont le nom est passé en paramètre + */ @SuppressWarnings("rawtypes") public synchronized static SQLTable getTable(String name) { return tables.get(name); diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/SQLTable.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/SQLTable.java index 38b40a6..c470caa 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/SQLTable.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/SQLTable.java @@ -59,6 +59,13 @@ public abstract class SQLTable { + + public String getTableName() { + return tableName; + } + + + public T get(int id) throws SQLException { Statement stmt = db.getConnection().createStatement(); String sql = "SELECT * FROM "+tableName+" WHERE id = "+id+";"; @@ -73,11 +80,17 @@ public abstract class SQLTable { public List getAll() throws SQLException { - return getAll(null, null, null, null); } + + public T getFirst(String where, String orderBy) throws SQLException { + List elts = getAll(where, orderBy, 1, null); + return (elts.size() == 0)? null : elts.get(0); + } + + public List getAll(String where, String orderBy, Integer limit, Integer offset) throws SQLException { Statement stmt = db.getConnection().createStatement(); String sql = "SELECT * FROM "+tableName; diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/StaffTicketElement.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/StaffTicketElement.java new file mode 100644 index 0000000..e80800b --- /dev/null +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/StaffTicketElement.java @@ -0,0 +1,104 @@ +package net.mc_pandacraft.java.plugin.pandacraftutils.data_model; + +import org.apache.commons.lang.NullArgumentException; +import org.bukkit.Bukkit; +import org.bukkit.Location; + +public class StaffTicketElement extends SQLElement { + + + private String playerName; + private String message; + private long creationTime; + private String staffPlayer = null; + private String locWorld; + private double locX; + private double locY; + private double locZ; + + + public StaffTicketElement(String pName, String m, long creaTime, Location loc) { + super("pandacraft_staff_ticket"); + setPlayerName(pName); + setMessage(m); + setCreationTime(creaTime); + setLocation(loc); + + } + protected StaffTicketElement(int id, String pName, String m, long creaTime, String locW, double x, double y, double z) { + super("pandacraft_staff_ticket", id); + setPlayerName(pName); + setMessage(m); + setCreationTime(creaTime); + locWorld = locW; + locX = x; + locY = y; + locZ = z; + } + + + @Override + protected String[] getValues() { + return new String[] { + playerName, + message, + Long.toString(creationTime), + staffPlayer, + locWorld, + Double.toString(locX), + Double.toString(locY), + Double.toString(locZ) + }; + } + + @Override + protected String[] getFieldsName() { + return new String[] { + "playerName", + "message", + "creationTime", + "staffPlayer", + "locWorld", + "locX", + "locY", + "locZ" + }; + } + public String getPlayerName() { + return playerName; + } + public void setPlayerName(String playerName) { + if (playerName == null) throw new NullArgumentException("playerName"); + this.playerName = playerName; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + if (message == null) throw new NullArgumentException("message"); + this.message = message; + } + public long getCreationTime() { + return creationTime; + } + public void setCreationTime(long creationTime) { + this.creationTime = creationTime; + } + public String getStaffPlayer() { + return staffPlayer; + } + public void setStaffPlayer(String staffPlayer) { + this.staffPlayer = staffPlayer; + } + public Location getLocation() { + return new Location(Bukkit.getWorld(locWorld), locX, locY, locZ); + } + public void setLocation(Location loc) { + if (loc == null) throw new NullArgumentException("loc"); + locWorld = loc.getWorld().getName(); + locX = loc.getX(); + locY = loc.getY(); + locZ = loc.getZ(); + } + +} diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/StaffTicketTable.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/StaffTicketTable.java new file mode 100644 index 0000000..62ab08e --- /dev/null +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/data_model/StaffTicketTable.java @@ -0,0 +1,43 @@ +package net.mc_pandacraft.java.plugin.pandacraftutils.data_model; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class StaffTicketTable extends SQLTable { + + + public StaffTicketTable() throws SQLException { + super("pandacraft_staff_ticket"); + } + + @Override + protected String createTableParameters() { + return "id INT AUTO_INCREMENT PRIMARY KEY," + + "playerName VARCHAR(16) NOT NULL," + + "message VARCHAR(1024) NOT NULL," + + "creationTime BIGINT NOT NULL," + + "staffPlayer VARCHAR(16) NULL," + + "locWorld VARCHAR(64) NOT NULL," + + "locX DOUBLE NOT NULL," + + "locY DOUBLE NOT NULL," + + "locZ DOUBLE NOT NULL"; + } + + @Override + protected StaffTicketElement getElementInstance(ResultSet sqlResult) + throws SQLException { + StaffTicketElement el = new StaffTicketElement( + sqlResult.getInt("id"), + sqlResult.getString("playerName"), + sqlResult.getString("message"), + sqlResult.getLong("creationTime"), + sqlResult.getString("locWorld"), + sqlResult.getDouble("locX"), + sqlResult.getDouble("locY"), + sqlResult.getDouble("locZ")); + el.setStaffPlayer(sqlResult.getString("staffPlayer")); + + return el; + } + +} diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PrivateMessagesManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PrivateMessagesManager.java new file mode 100644 index 0000000..47d019b --- /dev/null +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PrivateMessagesManager.java @@ -0,0 +1,409 @@ +package net.mc_pandacraft.java.plugin.pandacraftutils.modules; + +import java.sql.Date; +import java.sql.SQLException; +import java.text.DateFormat; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; +import java.util.Random; + +import mkremins.fanciful.FancyMessage; +import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; +import net.mc_pandacraft.java.plugin.pandacraftutils.commands.AbstractCommandExecutor; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPGroupElement; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPGroupTable; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPGroupUserElement; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPGroupUserTable; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPMessageElement; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPMessageTable; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.ORM; +import net.mc_pandacraft.java.plugin.pandacraftutils.players.OffPlayer; +import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayer; +import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class PrivateMessagesManager extends BukkitRunnable { + private PandacraftUtils plugin = PandacraftUtils.getInstance(); + + + + public PrivateMessagesManager() + { + plugin.getServer().getScheduler().runTaskTimer(plugin, this, 2L, 10L); + } + + + + + + + @Override + public void run() { + + // récupération des messages non synchronisé : + try { + + + + List messages = ((MPMessageTable)ORM.getTable("mp_message")).getAllUnsyncMessage(); + + + + for (MPMessageElement message : messages) { + if (message.getViewerNick().equals(message.getSourceNick())) + tryDisplayMessageToConsole(message); + + tryDisplayMessage(message); + + message.setServerSync(true); + message.save(); + + } + + + } catch (SQLException e) { + plugin.getLogger().severe("Impossible de récupérer les messages privés de la base de donnée"); + e.printStackTrace(); + } + + + + } + + + + + + /** + * @param sender l'origine du message + * @param message le message + * @throws MessageSendingException + */ + public void respondMessage(MessageSender sender, String message) throws MessageSendingException { + OnlinePlayer op = OnlinePlayerManager.get(Bukkit.getPlayer(sender.senderName)); + if (op.getLastMessageTarget() == null) + throw new MessageSendingException("Vous n'avez pas encore envoyé de message. Utilisez /msg"); + inputMessage(sender, op.getLastMessageTarget(), message); + } + + + /** + * @param sender l'origine du message + * @param dest pseudo du destinataire ou "g:" suivi du nom du groupe destinataire (insensible à la casse) + * @param message le message + * @throws MessageSendingException + */ + public void inputMessage(MessageSender sender, String dest, String message) throws MessageSendingException { + if (dest.startsWith("g:") || dest.startsWith("G:")) { + // groupe + String groupe = dest.substring(2); + + if (!AbstractCommandExecutor.isValidPlayerName(groupe)) + throw new MessageSendingException("Le nom du groupe n'est pas valide (lettres, chiffres, §7_§r et entre 2 et 16 caractères)"); + + MPGroupElement groupEl = null; + + try { + groupEl = ((MPGroupTable)ORM.getTable("mp_group")).getFirst("groupName LIKE '"+groupe+ "'", "id"); + + if (groupEl == null) + throw new MessageSendingException("Ce groupe n'existe pas"); + + // on vérifie si le joueur source est dans le groupe + if (sender.isPlayer()) { + MPGroupUserElement userInGroup = ((MPGroupUserTable)ORM.getTable("mp_group_user")).getPlayerInGroup(groupEl, sender.senderName); + + if (userInGroup == null) + throw new MessageSendingException("Vous n'êtes pas dans ce groupe"); + } + + + List groupUsers = groupEl.getUsers(); + + long time = System.currentTimeMillis(); + int secKey = new Random().nextInt(); + + for (MPGroupUserElement userInGroup : groupUsers) { + MPMessageElement messEl = new MPMessageElement(time, secKey, userInGroup.getPlayerName(), sender.senderName, message, (userInGroup.getPlayerName().equalsIgnoreCase(sender.senderName)), true); + messEl.setDestGroup(groupEl.getId()); + messEl.save(); + tryDisplayMessage(messEl); + if (userInGroup.getPlayerName().equalsIgnoreCase(sender.senderName)) + tryDisplayMessageToConsole(messEl); + } + + if (sender.isPlayer()) + OnlinePlayerManager.get(plugin.getServer().getPlayer(sender.senderName)).setLastMessageTarget("g:"+groupEl.getGroupName()); + + + } catch (SQLException e) { + e.printStackTrace(); + throw new MessageSendingException("Erreur lors de la récupération du groupe ou de ses membres"); + } + + + + + } + else { + // joueur + OffPlayer offP = new OffPlayer(dest); + if (offP.getBukkitOfflinePlayer() == null) { + throw new MessageSendingException("Le joueur n'a jamais existé"); + } + + String destUserName = offP.getCastCorrectedName(); + + long time = System.currentTimeMillis(); + int secKey = new Random().nextInt(); + + + if (sender.isPlayer()) { + MPMessageElement el = new MPMessageElement(time, secKey, sender.senderName, sender.senderName, message, true, true); + el.setDestNick(destUserName); + el.save(); + tryDisplayMessage(el); + } + + MPMessageElement elCible = new MPMessageElement(time, secKey, destUserName, sender.senderName, message, true, true); + elCible.setDestNick(destUserName); + elCible.save(); + tryDisplayMessage(elCible); + + + tryDisplayMessageToConsole(elCible); + + if (sender.isPlayer()) + OnlinePlayerManager.get(plugin.getServer().getPlayer(sender.senderName)).setLastMessageTarget(destUserName); + + } + + } + + + + + + + /** + * + * @param player le joueur qui veut voir ses messages non lus + * @return vrai si le joueur a bien des messages non lu, faux sinon. Retourne vrai en cas d'erreur lors de la récupération des messages + */ + public boolean displayUnreadMessages(Player player) { + try { + List messages = ((MPMessageTable)ORM.getTable("mp_message")).getAllUnreadForPlayer(player.getName()); + if (messages.size() == 0) { + player.sendMessage(ChatColor.GRAY+"Vous n'avez pas de messages non lus"); + return false; + } + + for(MPMessageElement mess : messages) + tryDisplayMessage(mess); + + return true; + + } catch (SQLException e) { + e.printStackTrace(); + player.sendMessage(ChatColor.RED+"Impossible de lire les messages non lus"); + return true; + } + } + + + + + + + + + + + + /** + * Tente d'afficher le message dans le cas où le joueur cible est en ligne. Si ce + * joueur est en ligne, le message est marqué comme lu. Si le joueur cible ignore + * la source du message, la copie du message est supprimé de la base. + * @param message le message à afficher + */ + private void tryDisplayMessage(MPMessageElement message) { + + try { + + OnlinePlayer op = OnlinePlayerManager.get(new OffPlayer(message.getViewerNick()).getBukkitOnlinePlayer()); + + if (op == null) return; // la cible n'est pas en ligne + + MessageSender sender = new MessageSender(message.getSourceNick()); + + boolean isIgnoring = sender.isPlayer() && op.getEssentialsUser().isIgnoredPlayer(new OffPlayer(message.getSourceNick()).getEssentialsUser()); + + + if (isIgnoring) { + message.delete(); + } + else { + message.setRead(true); + message.save(); + + // le message est affiché sur l'écran de la source du message + boolean dispToSender = (message.getViewerNick().equalsIgnoreCase(message.getSourceNick())); + + + Date d = new Date(message.getTime()); + DateFormat date = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.FRANCE); + DateFormat hour = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.FRANCE); + + String affDate = date.format(d) + " à " + hour.format(d); + + + List tooltipLines = Arrays.asList(new String[] { + ChatColor.GRAY+"(Cliquez pour répondre)", + ChatColor.GRAY+affDate, + }); + + + if (dispToSender) { + + String destAff = (message.getDestGroup() == null)? + new OffPlayer(message.getDestNick()).getDisplayName(): + "g:"+message.getDestGroupElement().getGroupName(); + + String destCommand = (message.getDestGroup() == null)? + message.getDestNick(): + "g:"+message.getDestGroupElement().getGroupName(); + + + new FancyMessage() + .then("§6<§rmoi§6 → §r"+destAff+"§r§6>") + .suggest("/m "+destCommand+" ") + .tooltip(tooltipLines) + .then(" §6"+ChatColor.translateAlternateColorCodes('&', message.getMessage())) + .send(op.getPlayer()); + } + else { + + + String senderAff = new MessageSender(message.getSourceNick()).getDisplayName(); + + + String destAff = (message.getDestGroup() == null)? + ((message.getDestNick().equalsIgnoreCase(message.getViewerNick()))? + "moi": + new OffPlayer(message.getDestNick()).getDisplayName()): + "g:"+message.getDestGroupElement().getGroupName(); + + String destCommand = (message.getDestGroup() == null)? + message.getSourceNick(): + "g:"+message.getDestGroupElement().getGroupName(); + + + new FancyMessage() + .then("§6<§r"+senderAff+"§r§6 → §r"+destAff+"§r§6>") + .suggest("/m "+destCommand+" ") + .tooltip(tooltipLines) + .then(" §6"+ChatColor.translateAlternateColorCodes('&', message.getMessage())) + .send(op.getPlayer()); + + // op.getPlayer().playSound(op.getPlayer().getLocation(), Sound.ORB_PICKUP, 1, 0.3F); + } + + + + } + + } catch (SQLException e) { + plugin.getLogger().severe("Impossible d'afficher un message"); + e.printStackTrace(); + } + + + } + + + + private void tryDisplayMessageToConsole(MPMessageElement message) { + + try { + + + String senderAff = new MessageSender(message.getSourceNick()).getDisplayName(); + + + String destAff = (message.getDestGroup() == null)? + new OffPlayer(message.getDestNick()).getDisplayName(): + "g:"+message.getDestGroupElement().getGroupName(); + + + plugin.getServer().getConsoleSender().sendMessage("§6<§r"+senderAff+"§r§6 → §r"+destAff+"§r§6> §6"+ChatColor.translateAlternateColorCodes('&', message.getMessage())); + + + } catch (SQLException e) { + plugin.getLogger().severe("Impossible d'afficher un message"); + e.printStackTrace(); + } + + + } + + + + + + + + + + + + + public static class MessageSender { + public final String senderName; + + + public MessageSender(String pName) { + senderName = pName; + } + + public MessageSender() { + this((String)null); + } + + public MessageSender(OffPlayer p) { + this(p.getName()); + } + + public MessageSender(CommandSender sender) { + this((sender instanceof Player)?sender.getName():null); + } + + public boolean isPlayer() { + return senderName != null; + } + + + public String getDisplayName() { + if (isPlayer()) + return new OffPlayer(senderName).getDisplayName(); + else + return ChatColor.GOLD+"Système"+ChatColor.RESET; + } + + } + + + @SuppressWarnings("serial") + public class MessageSendingException extends Exception { + private MessageSendingException(String mess) { + super(mess); + } + } + + +} diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/TPSAnalysisManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/TPSAnalysisManager.java index c31633d..241e4f7 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/TPSAnalysisManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/TPSAnalysisManager.java @@ -68,19 +68,5 @@ public class TPSAnalysisManager implements Runnable { } - public String getStringTPSHistory(int nb_tick) - { - double[] history = getTPSHistory(nb_tick); - String s = "{MineAdmin_Graph}{"; - boolean first = true; - for(double d : history) - { - if (first) first = false; else s = s.concat(","); - s = s.concat((Math.round(d*100)/100D)+""); - } - - s = s.concat("}"); - return s; - } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/staff/StaffQueueManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/staff/StaffQueueManager.java index 1fd3db8..ae398a4 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/staff/StaffQueueManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/staff/StaffQueueManager.java @@ -1,11 +1,16 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.modules.staff; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; +import java.util.List; import java.util.Queue; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.ORM; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.StaffTicketElement; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.StaffTicketTable; import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager; import net.mc_pandacraft.java.util.ScoreBoardUtil; import net.mc_pandacraft.java.util.TimeUtil; @@ -31,6 +36,26 @@ public class StaffQueueManager { + public StaffQueueManager() { + + try { + StaffTicketTable dbTable = (StaffTicketTable) ORM.getTable("staff_ticket"); + + List elmts = dbTable.getAll(null, "creationTime ASC, id ASC", null, null); + + for (StaffTicketElement el : elmts) + playerQueue.add(new WaitingPlayer(el)); + + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + updateScoreBoardWaitingList(); + } + + + // le joueur ajouté doit-être en ligne public void addWaitingPlayer(Player p, String m) { @@ -78,6 +103,7 @@ public class StaffQueueManager { if (wp != null) { playerQueue.remove(wp); + wp.deleteFromDB(); updateScoreBoardWaitingList(); } } @@ -174,6 +200,19 @@ public class StaffQueueManager { + public List getWaitingPlayerNames() { + List l = new ArrayList(); + + for (WaitingPlayer wp : playerQueue) { + l.add(wp.getPlayerName()); + } + return l; + } + + + + + @@ -226,16 +265,36 @@ public class StaffQueueManager { private String player; private String message; - private Date creationDate = new Date(); + private Date creationDate; private Location location; // localisation du joueur au moment où il fait /staff private String staffPlayer = null; + private int dbId; + public WaitingPlayer(String p, String m, Location l) { player = p; message = m; + creationDate = new Date(); location = l; + + StaffTicketElement dbEl = new StaffTicketElement(p, m, creationDate.getTime(), l); + dbEl.save(); + + dbId = dbEl.getId(); + } + + private WaitingPlayer(StaffTicketElement dbEl) { + + player = dbEl.getPlayerName(); + message = dbEl.getMessage(); + creationDate = new Date(dbEl.getCreationTime()); + location = dbEl.getLocation(); + + staffPlayer = dbEl.getStaffPlayer(); + + dbId = dbEl.getId(); } /** @@ -258,6 +317,21 @@ public class StaffQueueManager { public String getMessage() { return message; } + public void setMessage(String m) { + if (m == null) return; + message = m; + + try { + StaffTicketElement el = ((StaffTicketTable)ORM.getTable("staff_ticket")).get(dbId); + + el.setMessage(message); + el.save(); + } catch (SQLException e) { + e.printStackTrace(); + } + + } + public Date getDate() { return creationDate; } public Location getLocation() { return location; } @@ -265,8 +339,26 @@ public class StaffQueueManager { public void setStaffPlayer(Player p) { if (p == null) staffPlayer = null; else staffPlayer = p.getName(); + + try { + StaffTicketElement el = ((StaffTicketTable)ORM.getTable("staff_ticket")).get(dbId); + + el.setStaffPlayer(staffPlayer); + el.save(); + } catch (SQLException e) { + e.printStackTrace(); + } + updateScoreBoardWaitingList(); } public String getStaffPlayerName() { return staffPlayer; } + + public void deleteFromDB() { + try { + ((StaffTicketTable)ORM.getTable("staff_ticket")).get(dbId).delete(); + } catch (SQLException e) { + e.printStackTrace(); + } + } } } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OffPlayer.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OffPlayer.java index 8e4a86a..dab36a6 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OffPlayer.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OffPlayer.java @@ -52,6 +52,10 @@ public class OffPlayer { return playerName; } + public String getCastCorrectedName() { + return getEssentialsUser().getName(); + } + diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java index bd31c1d..dcd459d 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayer.java @@ -311,6 +311,26 @@ public class OnlinePlayer extends OffPlayer { + + + + /* + * + */ + private String lastMessageTarget = null; + + public String getLastMessageTarget() { return lastMessageTarget; } + + public void setLastMessageTarget(String messTarget) { + lastMessageTarget = messTarget; + } + + + + + + + /* diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayerManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayerManager.java index 0dbcec6..1a60cd7 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayerManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OnlinePlayerManager.java @@ -1,9 +1,10 @@ package net.mc_pandacraft.java.plugin.pandacraftutils.players; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; +import java.util.List; import java.util.Map; import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils; @@ -78,7 +79,7 @@ public final class OnlinePlayerManager { return getInstance().players.get(p); } - public synchronized static Collection getAll() { + public synchronized static List getAll() { return new ArrayList(getInstance().players.values()); } @@ -87,8 +88,8 @@ public final class OnlinePlayerManager { return getInstance().players.containsKey(p); } - public static Collection getAllNotVanished() { - Collection players = getAll(); + public static List getAllNotVanished() { + List players = getAll(); for (OnlinePlayer op : players.toArray(new OnlinePlayer[players.size()])) { if (op.isVanished()) @@ -98,4 +99,31 @@ public final class OnlinePlayerManager { return players; } + + public static List getNamesOnlyVisible(Player p) { + List players = getAll(); + List playerList = new ArrayList(); + + for (OnlinePlayer op : players) + if (p == null || p.canSee(op.getPlayer())) + playerList.add(op.getName()); + + return playerList; + } + + + + + + + + public static class OnlinePlayerOrderer implements Comparator { + + @Override + public int compare(OnlinePlayer arg0, OnlinePlayer arg1) { + return arg0.getName().compareToIgnoreCase(arg1.getName()); + } + + } + }