diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMail.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMail.java index 7e15d1b..c1c4a13 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMail.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandMail.java @@ -16,7 +16,8 @@ public class CommandMail extends AbstractCommandExecutor { String[] m = new String[] { ChatColor.GOLD+"--------------- Messagerie privée ---------------", ChatColor.GRAY+"/m "+ChatColor.GOLD+" pour envoyer un message à un joueur même quand il est hors-ligne", - ChatColor.GRAY+"/m"+ChatColor.GOLD+" pour lire vos messages non lus", + ChatColor.GRAY+"/m"+ChatColor.GOLD+" pour voir vos dernières conversations et lire les messages non lus", + ChatColor.GRAY+"/m ?"+ChatColor.GOLD+" pour plus de détails", ChatColor.GOLD+"----------------------------------------------", }; diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandTell.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandTell.java index 6442ed6..7bd6234 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandTell.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/commands/CommandTell.java @@ -27,15 +27,43 @@ public class CommandTell extends AbstractCommandExecutor { if (args.length == 0 && sender instanceof Player) { Player player = (Player) sender; - onCommandDiscussionsList(player); + onCommandDiscussionsList(player, 5); return true; } - else if (args.length == 0) { + + if (args.length == 0) { sender.sendMessage(ChatColor.RED+"Seul un joueur en ligne peut voir la liste de ses discussions."); - return false; + return true; } + if (args.length >= 1 && args[0].equalsIgnoreCase("?")) { + showHelp(sender); + return true; + } + if (args.length >= 1 && args[0].toLowerCase().startsWith("d:") && sender instanceof Player) { + Player player = (Player) sender; + int nb = 5; + try { + if (args.length >= 2) + nb = Integer.parseUnsignedInt(args[1]); + } catch(NumberFormatException e) { } + onCommandDiscussionDisplay(player, args[0].substring(2), nb); + return true; + } + + if (args.length >= 1 && args[0].toLowerCase().startsWith("l:") && sender instanceof Player) { + Player player = (Player) sender; + try { + int nb = Integer.parseUnsignedInt(args[0].substring(2)); + + onCommandDiscussionsList(player, nb); + + } catch(NumberFormatException e) { + sender.sendMessage(ChatColor.RED+"Vous devez mettre un nombre entier"); + } + return true; + } if (args.length >= 2) { onCommandSend(sender, args[0], getLastParam(args, 1)); @@ -45,8 +73,42 @@ public class CommandTell extends AbstractCommandExecutor { - - return false; + sender.sendMessage(ChatColor.RED+"Mauvaise utilisation de la commande. Faites "+ChatColor.GRAY+"/m ?"+ChatColor.RED+" pour afficher l'aide"); + return true; + } + + + + + + private void showHelp(CommandSender sender) { + if (sender instanceof Player) { + String[] m = new String[] { + ChatColor.GOLD+"--------------- Messagerie privée ---------------", + ChatColor.GRAY+"/m "+ChatColor.GOLD+" pour envoyer un message à un joueur même quand il est hors-ligne", + ChatColor.GRAY+"/m g: "+ChatColor.GOLD+" pour envoyer un message dans une discussion avec plusieurs joueurs", + ChatColor.GRAY+"/m"+ChatColor.GOLD+" pour voir vos dernières conversations et lire les messages non lus", + ChatColor.GRAY+"/m l:"+ChatColor.GOLD+" pour voir les dernières conversations. Le nombre correspond au nombre de conversation affiché", + ChatColor.GRAY+"/m d: [Nombre]"+ChatColor.GOLD+" pour voir les derniers messages avec ce joueur. Le nombre correspond au nombre de message à afficher", + ChatColor.GRAY+"/m d:g: [Nombre]"+ChatColor.GOLD+" pour voir les derniers messages de ce groupe", + ChatColor.GRAY+"/r "+ChatColor.GOLD+" pour répondre à un joueur (ou au groupe) à qui vous avez parlé la dernière fois", + ChatColor.GRAY+"/r"+ChatColor.GOLD+" pour afficher le joueur (ou le groupe) à qui vous avez parlé la dernière fois", + ChatColor.GOLD+"----------------------------------------------", + }; + + sender.sendMessage(m); + } + else { + String[] m = new String[] { + ChatColor.GOLD+"--------------- Messagerie privée ---------------", + ChatColor.GOLD+"Information : Vous apparaitrez en tant que \"Système\" pour les destinataires de vos messages, et ils ne pourront pas vous répondre.", + ChatColor.GRAY+"/m "+ChatColor.GOLD+" pour envoyer un message à un joueur même quand il est hors-ligne", + ChatColor.GRAY+"/m g: "+ChatColor.GOLD+" pour envoyer un message dans une discussion avec plusieurs joueurs", + ChatColor.GOLD+"----------------------------------------------", + }; + + sender.sendMessage(m); + } } @@ -69,8 +131,8 @@ public class CommandTell extends AbstractCommandExecutor { - private void onCommandDiscussionsList(Player player) { - List lastDiscussions = plugin.privateMessagesManager.getLastDiscussions(player, 5); + private void onCommandDiscussionsList(Player player, int number) { + List lastDiscussions = plugin.privateMessagesManager.getLastDiscussions(player, number); player.sendMessage(ChatColor.GOLD+"--- Messagerie privée - Liste des conversations ---"); @@ -79,7 +141,7 @@ public class CommandTell extends AbstractCommandExecutor { String name = (pvd.name == null) ? new MessageSender(pvd.name).getDisplayName() : (pvd.name.toLowerCase().startsWith("g:")) ? - ChatColor.GOLD+pvd.name.substring(2) : + ChatColor.GOLD+pvd.name : new MessageSender(pvd.name).getDisplayName(); String line = name+ChatColor.RESET; @@ -87,7 +149,7 @@ public class CommandTell extends AbstractCommandExecutor { int nbM = pvd.nbUnread; if (nbM > 0) - line += ChatColor.GRAY+" - "+ChatColor.RED+nbM+" message"+((nbM > 1)?"s":"")+" non lu"+((nbM > 1)?"s":""); + line += ChatColor.GRAY+" - "+ChatColor.LIGHT_PURPLE+ChatColor.BOLD+nbM+" message"+((nbM > 1)?"s":"")+" non lu"+((nbM > 1)?"s":""); DateFormat date = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.FRANCE); @@ -97,8 +159,20 @@ public class CommandTell extends AbstractCommandExecutor { line += ChatColor.GRAY+" - "+affDate; + String messageExtract = pvd.lastMessage; - new FancyMessage("").then(line).color(ChatColor.GRAY).command("/m d:"+((pvd.name == null)?"null":pvd.name)).send(player); + if (messageExtract.length()>50) + messageExtract = messageExtract.subSequence(0, 47)+"..."; + + + new FancyMessage("").then(line) + .color(ChatColor.GRAY) + .command("/m d:"+((pvd.name == null)?"null":pvd.name)) + .tooltip(ChatColor.GRAY+"Cliquez pour lire les derniers messages", + ChatColor.GRAY+"Dernier message de "+ChatColor.RESET+pvd.lastMessageSource.getDisplayName(), + ChatColor.WHITE.toString()+ChatColor.ITALIC+messageExtract + ) + .send(player); } @@ -108,5 +182,16 @@ public class CommandTell extends AbstractCommandExecutor { } + + + private void onCommandDiscussionDisplay(Player player, String discussionName, int nbMin) { + + player.sendMessage(ChatColor.GOLD+"--------------- Messagerie privée ---------------"); + plugin.privateMessagesManager.displayLastDiscussionMessage(player, discussionName, nbMin, 3); + player.sendMessage(ChatColor.GOLD+"----------------------------------------------"); + + } + + } 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 f52c0be..d647445 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 @@ -60,18 +60,45 @@ public class MPMessageTable extends SQLTable { public List getAllUnreadForPlayer(String player) throws SQLException { - return getForPlayer(player, true, null); + return getForPlayer(player, true, null, false); + } + + public List getOneDiscussionForPlayer(String player, String discussionName, DiscussionType discussionType, Integer numberLast, boolean revert) throws SQLException { + if (!AbstractCommandExecutor.isValidPlayerName(player)) return null; + if (discussionName != null && !AbstractCommandExecutor.isValidPlayerName(discussionName)) return null; + if (discussionType == null) return null; + if (discussionName == null && discussionType == DiscussionType.GROUP) return null; + + String where = "viewerNick = '"+player+"'"; + if (discussionType == DiscussionType.GROUP) { + where += " AND destGroup IN (SELECT id FROM pandacraft_mp_group WHERE groupName LIKE '"+discussionName+"')"; + } + else { + if (discussionName == null) + where += " AND sourceNick IS NULL AND destGroup IS NULL"; + else if (discussionName.equalsIgnoreCase(player)) + where += " AND destNick LIKE '"+discussionName+"' AND sourceNick LIKE '"+discussionName+"' AND destGroup IS NULL"; + else + where += " AND (destNick LIKE '"+discussionName+"' OR sourceNick LIKE '"+discussionName+"') AND destGroup IS NULL"; + } + + return getAll(where, (revert)?"time DESC":"time ASC", numberLast, null); } - public List getForPlayer(String player, boolean onlyUnread, Integer numberLast) throws SQLException { + public List getForPlayer(String player, boolean onlyUnread, Integer numberLast, boolean revert) throws SQLException { if (!AbstractCommandExecutor.isValidPlayerName(player)) return null; String where = "viewerNick = '"+player+"'"; if (onlyUnread) where += " AND wasRead = 0"; - return getAll(where, "time ASC", numberLast, null); + return getAll(where, (revert)?"time DESC":"time ASC", numberLast, null); + } + + + public enum DiscussionType { + ALONE, GROUP } diff --git a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PrivateMessagesManager.java b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PrivateMessagesManager.java index 2f3e37c..e5535eb 100644 --- a/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PrivateMessagesManager.java +++ b/src/net/mc_pandacraft/java/plugin/pandacraftutils/modules/PrivateMessagesManager.java @@ -20,6 +20,7 @@ import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPMessageTable; import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPWebSessionElement; import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPWebSessionTable; import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.ORM; +import net.mc_pandacraft.java.plugin.pandacraftutils.data_model.MPMessageTable.DiscussionType; 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; @@ -279,11 +280,8 @@ public class PrivateMessagesManager extends BukkitRunnable { */ public List getLastDiscussions(Player p, Integer nbLastMin) { try { - // récupère les messages, triés de la plus vieille à la plus récente - List messages = ORM.getTable(MPMessageTable.class).getForPlayer(p.getName(), false, 1000); - - // inverse, de la plus récente à la plus vieille - messages = Lists.reverse(messages); + // récupère les messages, triés de la plus récente à la plus vieille + List messages = ORM.getTable(MPMessageTable.class).getForPlayer(p.getName(), false, 1000, true); List discussionList = new ArrayList(); @@ -292,9 +290,9 @@ public class PrivateMessagesManager extends BukkitRunnable { if (message.getDestGroup() != null) name = "g:"+message.getDestGroupElement().getGroupName(); else - name = message.getSourceNick(); + name = (message.getDestNick().equalsIgnoreCase(p.getName()))?message.getSourceNick():message.getDestNick(); - PrivateDiscussion pvd = new PrivateDiscussion(name, (message.isRead())?0:1, new Date(message.getTime())); + PrivateDiscussion pvd = new PrivateDiscussion(name, (message.isRead())?0:1, new Date(message.getTime()), message.getMessage(), new MessageSender(message)); int index; if ((index = discussionList.indexOf(pvd)) >= 0) { @@ -326,6 +324,9 @@ public class PrivateMessagesManager extends BukkitRunnable { + + + public class PrivateDiscussion { /** * Le pseudo du joueur ou du groupe de discussion (avec "g:" devant) @@ -333,13 +334,17 @@ public class PrivateMessagesManager extends BukkitRunnable { */ public final String name; public int nbUnread; - public Date timeLastMessage; + public final Date timeLastMessage; + public final String lastMessage; + public final MessageSender lastMessageSource; - private PrivateDiscussion(String n, int unread, Date lastMess) { - Validate.notNull(n, "n ne doit pas être null"); + private PrivateDiscussion(String n, int unread, Date timeLastMess, String lastMess, MessageSender lastMessSource) { + Validate.notNull(lastMess, "lastMess ne doit pas être null"); name = n; nbUnread = unread; - timeLastMessage = lastMess; + timeLastMessage = timeLastMess; + lastMessage = lastMess; + lastMessageSource = lastMessSource; } @Override @@ -347,7 +352,10 @@ public class PrivateMessagesManager extends BukkitRunnable { if (o == null || !(o instanceof PrivateDiscussion)) return false; - return ((PrivateDiscussion) o).name.equalsIgnoreCase(name); + if (name == null) + return ((PrivateDiscussion) o).name == null; + + return name.equalsIgnoreCase(((PrivateDiscussion) o).name); } } @@ -358,6 +366,57 @@ public class PrivateMessagesManager extends BukkitRunnable { + public void displayLastDiscussionMessage(Player p, String discussionName, int nbMin, int nbReadMin) { + if (nbMin < 0) nbMin = 0; + if (nbReadMin < 0) nbReadMin = 0; + + DiscussionType discType; + if (discussionName.toLowerCase().startsWith("g:")) { + discType = DiscussionType.GROUP; + discussionName = discussionName.substring(2); + } + else { + discType = DiscussionType.ALONE; + if (discussionName.equalsIgnoreCase("null")) + discussionName = null; + } + + try { + // récupère les messages, triés de la plus récente à la plus vieille + List messages = ORM.getTable(MPMessageTable.class).getOneDiscussionForPlayer(p.getName(), discussionName, discType, 1000, true); // TODO modifier ça + + List messagesToDisplay = new ArrayList(); + + int cpt = 0; + int cptRead = 0; + for(MPMessageElement message : messages) { + cpt++; + if (!message.isRead()) { + messagesToDisplay.add(message); + continue; + } + cptRead++; + if (cpt <= nbMin || cptRead <= nbReadMin) { + messagesToDisplay.add(message); + continue; + } + break; + } + + messagesToDisplay = Lists.reverse(messagesToDisplay); + + for(MPMessageElement message : messagesToDisplay) { + tryDisplayMessage(message); + } + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + + + @@ -634,11 +693,15 @@ public class PrivateMessagesManager extends BukkitRunnable { public MessageSender() { this((String)null); } - + public MessageSender(OffPlayer p) { this(p.getName()); } + public MessageSender(MPMessageElement mp) { + this(mp.getSourceNick()); + } + public MessageSender(CommandSender sender) { this((sender instanceof Player)?sender.getName():null); }