From 497c5ad749d072d8ceda87be2f47a2c039cc0e53 Mon Sep 17 00:00:00 2001 From: lars Date: Wed, 2 Oct 2024 23:37:45 +0200 Subject: [PATCH] too old conversations get deleted, added prefix, changed some logic --- .../privateMessage/PrivateMessage.java | 86 ++++++++++++++----- 1 file changed, 66 insertions(+), 20 deletions(-) diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/privateMessage/PrivateMessage.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/privateMessage/PrivateMessage.java index f497fec..407019e 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/privateMessage/PrivateMessage.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/privateMessage/PrivateMessage.java @@ -19,17 +19,52 @@ import java.util.stream.Collectors; public class PrivateMessage extends Appliance { public final int targetChangeTimeoutSeconds = 30; + public final int conversationTimeoutMinutes = 30; private record Conversation(UUID target, Long lastSet) {} private final Map> replyMapping = new WeakHashMap<>(); public void reply(Player sender, String message) { - if(this.replyMapping.get(sender) == null || this.replyMapping.get(sender).isEmpty()) throw new ApplianceCommand.Error("Du kannst nicht auf eine Konversation antworten, da keine vorhanden ist."); + if(this.replyMapping.get(sender) != null) { + List tooOldConversations = this.replyMapping.get(sender).stream() + .filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (conversationTimeoutMinutes*60*1000)) + .toList(); + this.replyMapping.get(sender).removeAll(tooOldConversations); + } + + if(this.replyMapping.get(sender) == null || this.replyMapping.get(sender).isEmpty()) throw new ApplianceCommand.Error("Du führst aktuell keine Konversation."); + + + Component privatePrefix = Component.text("[Privat] ", NamedTextColor.LIGHT_PURPLE); + ChatMessages chatMessages = Main.instance().getAppliance(ChatMessages.class); Conversation youngestEntry = this.replyMapping.get(sender).stream() .max(Comparator.comparingLong(o -> o.lastSet)) .orElse(this.replyMapping.get(sender).getLast()); + String youngestTargetName; + if(Bukkit.getPlayer(youngestEntry.target()) == null) { + youngestTargetName = Bukkit.getOfflinePlayer(youngestEntry.target()).getName(); + } else { + youngestTargetName = Objects.requireNonNull(Bukkit.getPlayer(youngestEntry.target())).getName(); + } + + + if(message.isBlank() && youngestTargetName != null) { + sender.sendMessage( + privatePrefix + .append(Component.text("Du schreibst aktuell mit ", NamedTextColor.GRAY)) + .append(chatMessages.getReportablePlayerName(sender)) + ); + return; + } else if(message.isBlank()) { + sender.sendMessage( + privatePrefix + .append(Component.text("Du schreibst aktuell mit niemandem.", NamedTextColor.GRAY)) + ); + return; + } + if(youngestEntry.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000) || this.replyMapping.get(sender).size() == 1) { Player target = Bukkit.getPlayer(youngestEntry.target()); if(target == null) throw new ApplianceCommand.Error("Der Spieler " + Bukkit.getOfflinePlayer(youngestEntry.target()).getName() + " ist nicht mehr verfügbar."); @@ -42,7 +77,14 @@ public class PrivateMessage extends Appliance { List oldConversations = this.replyMapping.get(sender).stream() .filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000)) .toList(); - this.replyMapping.get(sender).removeAll(oldConversations); + + Conversation youngestOldConversation = null; + if(!oldConversations.isEmpty()) { + youngestOldConversation = oldConversations.stream() + .max(Comparator.comparingLong(o -> o.lastSet)) + .orElse(oldConversations.getLast()); + this.replyMapping.get(sender).removeAll(oldConversations); + } List playerNames = this.replyMapping.get(sender).stream() .map(conversation -> { @@ -55,34 +97,41 @@ public class PrivateMessage extends Appliance { .distinct() .toList(); + sender.sendMessage(""); sender.sendMessage( Component.text() - .append(Component.text("Das Ziel für /r hat sich bei dir in den letzten ")) - .append(Component.text(String.valueOf(this.targetChangeTimeoutSeconds))) - .append(Component.text(" Sekunden geändert. Wer soll deine Nachricht bekommen? ")) + .append(privatePrefix) + .append(Component.text("Das Ziel für /r hat sich bei dir in den letzten ", NamedTextColor.RED)) + .append(Component.text(String.valueOf(this.targetChangeTimeoutSeconds), NamedTextColor.RED)) + .append(Component.text(" Sekunden geändert. Wer soll deine Nachricht bekommen? ", NamedTextColor.RED)) ); - final Component[] finalComponent = {Component.text("")}; - String firstTargetName; - if(Bukkit.getPlayer(youngestEntry.target()) == null) { - firstTargetName = Bukkit.getOfflinePlayer(youngestEntry.target()).getName(); - } else { - firstTargetName = Objects.requireNonNull(Bukkit.getPlayer(youngestEntry.target())).getName(); + String firstTargetName = null; + if(youngestOldConversation != null && Bukkit.getPlayer(youngestOldConversation.target()) == null) { + firstTargetName = Bukkit.getOfflinePlayer(youngestOldConversation.target()).getName(); + } else if(youngestOldConversation != null){ + firstTargetName = Objects.requireNonNull(Bukkit.getPlayer(youngestOldConversation.target())).getName(); } if(firstTargetName != null && !playerNames.contains(firstTargetName)) { - finalComponent[0] = finalComponent[0].append(Component.text(firstTargetName, NamedTextColor.GOLD) - .clickEvent(ClickEvent.runCommand("/msg " + firstTargetName + " " + message)) - .hoverEvent(HoverEvent.showText(Component.text("Klicke, um diesem Spieler zu schreiben.").color(NamedTextColor.GOLD)))) + finalComponent[0] = finalComponent[0].append( + Component.text("[") + .append(Component.text(firstTargetName, NamedTextColor.GOLD)) + .append(Component.text("]")) + .clickEvent(ClickEvent.runCommand("/msg " + firstTargetName + " " + message)) + .hoverEvent(HoverEvent.showText(Component.text("Klicke, um diesem Spieler zu schreiben.").color(NamedTextColor.GOLD)))) .append(Component.text(" ")); } - playerNames.forEach(playerName -> finalComponent[0] = finalComponent[0].append(Component.text(playerName, NamedTextColor.GOLD) - .clickEvent(ClickEvent.runCommand("/msg " + playerName + " " + message)) - .hoverEvent(HoverEvent.showText(Component.text("Klicke, um diesem Spieler zu schreiben.").color(NamedTextColor.GOLD)))) + playerNames.forEach(playerName -> finalComponent[0] = finalComponent[0].append( + Component.text("[") + .append(Component.text(playerName, NamedTextColor.GOLD)) + .append(Component.text("]")) + .clickEvent(ClickEvent.runCommand("/msg " + playerName + " " + message)) + .hoverEvent(HoverEvent.showText(Component.text("Klicke, um diesem Spieler zu schreiben.").color(NamedTextColor.GOLD)))) .append(Component.text(" "))); sender.sendMessage(""); @@ -93,7 +142,6 @@ public class PrivateMessage extends Appliance { public void sendWhisper(Player sender, ResolvedPmUserArguments userArguments) { - // Ältere Einträge bei replyMapping für den receiver entfernen if(!(this.replyMapping.get(userArguments.receiver) == null)) { List oldEntries = this.replyMapping.get(userArguments.receiver).stream() .filter(conversation -> conversation.target() == sender.getUniqueId()) @@ -101,7 +149,6 @@ public class PrivateMessage extends Appliance { this.replyMapping.get(userArguments.receiver).removeAll(oldEntries); } - // Neuen Eintrag bei replyMapping für den receiver Conversation newReceiverConversation = new Conversation( sender.getUniqueId(), System.currentTimeMillis() @@ -119,7 +166,6 @@ public class PrivateMessage extends Appliance { this.replyMapping.get(userArguments.receiver).add(newReceiverConversation); } - // Einträge für sender bei replyMapping überschreiben mit receiver List senderConversationList = new ArrayList<>(); senderConversationList.add( new Conversation(