Corrections de nombreux bugs relatif à la consultation des messages privés

This commit is contained in:
Marc Baloup 2015-05-15 04:46:50 +02:00
parent 2fd3bc316c
commit e8fdf7f77c
4 changed files with 203 additions and 27 deletions

View File

@ -16,7 +16,8 @@ public class CommandMail extends AbstractCommandExecutor {
String[] m = new String[] {
ChatColor.GOLD+"--------------- Messagerie privée ---------------",
ChatColor.GRAY+"/m <Pseudo> <Message>"+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+"----------------------------------------------",
};

View File

@ -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 <Pseudo> <Message>"+ChatColor.GOLD+" pour envoyer un message à un joueur même quand il est hors-ligne",
ChatColor.GRAY+"/m g:<NomGroupe> <Message>"+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:<Nombre>"+ChatColor.GOLD+" pour voir les dernières conversations. Le nombre correspond au nombre de conversation affiché",
ChatColor.GRAY+"/m d:<Pseudo> [Nombre]"+ChatColor.GOLD+" pour voir les derniers messages avec ce joueur. Le nombre correspond au nombre de message à afficher",
ChatColor.GRAY+"/m d:g:<NomGroupe> [Nombre]"+ChatColor.GOLD+" pour voir les derniers messages de ce groupe",
ChatColor.GRAY+"/r <Message>"+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 <Pseudo> <Message>"+ChatColor.GOLD+" pour envoyer un message à un joueur même quand il est hors-ligne",
ChatColor.GRAY+"/m g:<NomGroupe> <Message>"+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<PrivateDiscussion> lastDiscussions = plugin.privateMessagesManager.getLastDiscussions(player, 5);
private void onCommandDiscussionsList(Player player, int number) {
List<PrivateDiscussion> 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+"----------------------------------------------");
}
}

View File

@ -60,18 +60,45 @@ public class MPMessageTable extends SQLTable<MPMessageElement> {
public List<MPMessageElement> getAllUnreadForPlayer(String player) throws SQLException {
return getForPlayer(player, true, null);
return getForPlayer(player, true, null, false);
}
public List<MPMessageElement> 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<MPMessageElement> getForPlayer(String player, boolean onlyUnread, Integer numberLast) throws SQLException {
public List<MPMessageElement> 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
}

View File

@ -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<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);
// 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<MPMessageElement> messages = ORM.getTable(MPMessageTable.class).getForPlayer(p.getName(), false, 1000, true);
List<PrivateDiscussion> discussionList = new ArrayList<PrivateDiscussion>();
@ -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<MPMessageElement> messages = ORM.getTable(MPMessageTable.class).getOneDiscussionForPlayer(p.getName(), discussionName, discType, 1000, true); // TODO modifier ça
List<MPMessageElement> messagesToDisplay = new ArrayList<MPMessageElement>();
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);
}