Les joueurs peuvent maintenant voir leurs dernières discussions

This commit is contained in:
Marc Baloup 2015-05-15 02:23:25 +02:00
parent 0432d10975
commit 2fd3bc316c
4 changed files with 80 additions and 39 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jardesc>
<jar path="PandacraftUtils/jar_export/PandacraftUtils-4.3.jar"/>
<jar path="PandacraftUtils/jar_export/PandacraftUtils-4.4.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/PandacraftUtils/make_jar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/>

View File

@ -1,6 +1,6 @@
name: PandacraftUtils
main: net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils
version: 4.3
version: 4.4

View File

@ -1,7 +1,13 @@
package net.mc_pandacraft.java.plugin.pandacraftutils.commands;
import java.text.DateFormat;
import java.util.List;
import java.util.Locale;
import mkremins.fanciful.FancyMessage;
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.PrivateMessagesManager.MessageSender;
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.PrivateMessagesManager.MessageSendingException;
import net.mc_pandacraft.java.plugin.pandacraftutils.modules.PrivateMessagesManager.PrivateDiscussion;
import net.mc_pandacraft.java.plugin.pandacraftutils.players.OnlinePlayerManager;
import org.bukkit.ChatColor;
@ -20,11 +26,12 @@ public class CommandTell extends AbstractCommandExecutor {
String[] args) {
if (args.length == 0 && sender instanceof Player) {
plugin.privateMessagesManager.displayUnreadMessages((Player)sender);
Player player = (Player) sender;
onCommandDiscussionsList(player);
return true;
}
else if (args.length == 0) {
sender.sendMessage(ChatColor.RED+"Seul un joueur en ligne peut lire ses messages non lus.");
sender.sendMessage(ChatColor.RED+"Seul un joueur en ligne peut voir la liste de ses discussions.");
return false;
}
@ -60,5 +67,46 @@ public class CommandTell extends AbstractCommandExecutor {
}
private void onCommandDiscussionsList(Player player) {
List<PrivateDiscussion> lastDiscussions = plugin.privateMessagesManager.getLastDiscussions(player, 5);
player.sendMessage(ChatColor.GOLD+"--- Messagerie privée - Liste des conversations ---");
for (PrivateDiscussion pvd : lastDiscussions) {
String name = (pvd.name == null) ?
new MessageSender(pvd.name).getDisplayName() :
(pvd.name.toLowerCase().startsWith("g:")) ?
ChatColor.GOLD+pvd.name.substring(2) :
new MessageSender(pvd.name).getDisplayName();
String line = name+ChatColor.RESET;
int nbM = pvd.nbUnread;
if (nbM > 0)
line += ChatColor.GRAY+" - "+ChatColor.RED+nbM+" message"+((nbM > 1)?"s":"")+" non lu"+((nbM > 1)?"s":"");
DateFormat date = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.FRANCE);
DateFormat hour = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.FRANCE);
String affDate = date.format(pvd.timeLastMessage) + " à " + hour.format(pvd.timeLastMessage);
line += ChatColor.GRAY+" - "+affDate;
new FancyMessage("").then(line).color(ChatColor.GRAY).command("/m d:"+((pvd.name == null)?"null":pvd.name)).send(player);
}
player.sendMessage(ChatColor.GOLD+"Cliquez sur une conversation pour voir les messages");
player.sendMessage(ChatColor.GOLD+"----------------------------------------------");
}
}

View File

@ -24,6 +24,7 @@ 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.apache.commons.lang.NullArgumentException;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@ -262,37 +263,21 @@ public class PrivateMessagesManager extends BukkitRunnable {
/**
*
* @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
* Retourne les dernières discussions auquel a participé le joueur passé en paramètre.
* @param p le joueur pour lequel on doit retourner les dernières discussions
* @param nbLastMin le nombre de discussion minimum qui doit être retourné (si il en existe au moins ce nombre minimum)<br/>
* Si le nombre de discussion totale est inférieur ou égale à <i>nbLastMin</i>, aucune suppression n'est faite.<br/>
* Dans le cas contraire, la méthode supprime itérativement la discussion déjà lu la plus ancienne, jusqu'à ce que le nombre de discussion restante
* soit égale à <i>nbLastMin</i> ou jusqu'à ce qu'il ne reste que des discussion non lus.
* @return les discussions, dans l'ordre chronologique inverse des derniers messages de chaque discussions. Plus clairement, la discussion la
* plus récente est placé à l'indice 0 de la liste.
*/
public boolean displayUnreadMessages(Player player) {
try {
List<MPMessageElement> 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;
}
}
public List<PrivateDiscussion> getLastDiscussions(Player p, Integer nbLast) {
public List<PrivateDiscussion> getLastDiscussions(Player p, Integer nbLastMin) {
try {
// récupère les messages, triés de la plus vieille à la plus récente
List<MPMessageElement> messages = ORM.getTable(MPMessageTable.class).getForPlayer(p.getName(), false, 1000);
@ -321,9 +306,11 @@ public class PrivateMessagesManager extends BukkitRunnable {
}
if (nbLast != null && nbLast >= 0) {
while (discussionList.size()>nbLast.intValue()) {
discussionList.remove(discussionList.size()-1);
if (nbLastMin != null && nbLastMin >= 0) {
for (int i = discussionList.size()-1; i >= 0 && discussionList.size() > nbLastMin; i--) {
if (discussionList.get(i).nbUnread == 0) {
discussionList.remove(i);
}
}
}
@ -342,6 +329,7 @@ public class PrivateMessagesManager extends BukkitRunnable {
public class PrivateDiscussion {
/**
* Le pseudo du joueur ou du groupe de discussion (avec "g:" devant)
* ou null si il s'agit d'un message système (hors groupe)
*/
public final String name;
public int nbUnread;
@ -383,6 +371,8 @@ public class PrivateMessagesManager extends BukkitRunnable {
*/
private void tryDisplayMessage(MPMessageElement message) {
if (message == null) throw new NullArgumentException("message doit être non null");
try {
OffPlayer offP = new OffPlayer(message.getViewerNick());
@ -546,12 +536,15 @@ public class PrivateMessagesManager extends BukkitRunnable {
try {
List<MPMessageElement> messages = ((MPMessageTable)ORM.getTable("mp_message")).getAllUnreadForPlayer(event.getPlayer().getName());
if (messages.size() == 0) return;
int nbMess = messages.size();
if (nbMess == 0) return;
String[] m = new String[] {
ChatColor.GOLD+"--------------- Messagerie privée ---------------",
ChatColor.GOLD+"Vous avez "+messages.size()+" message"+((messages.size()>1)?"s":"")+" non lu"+((messages.size()>1)?"s":""),
ChatColor.GOLD+"Faites "+ChatColor.GRAY+"/m"+ChatColor.GOLD+" pour voir le"+((messages.size()>1)?"s":"")+" message"+((messages.size()>1)?"s":""),
ChatColor.GOLD+"Vous avez "+nbMess+" message"+((nbMess>1)?"s":"")+" non lu"+((nbMess>1)?"s":""),
ChatColor.GOLD+"Faites "+ChatColor.GRAY+"/m"+ChatColor.GOLD+" pour voir le"+((nbMess>1)?"s":"")+" message"+((nbMess>1)?"s":""),
ChatColor.GOLD+"----------------------------------------------",
};