Corrections de nombreux bugs relatif à la consultation des messages privés
This commit is contained in:
parent
2fd3bc316c
commit
e8fdf7f77c
@ -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+"----------------------------------------------",
|
||||
};
|
||||
|
||||
|
@ -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+"----------------------------------------------");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user