From 26b9fd5e0f65e1b264cc217e279c561eff5574bf Mon Sep 17 00:00:00 2001 From: lars Date: Sun, 29 Sep 2024 22:43:55 +0200 Subject: [PATCH] changed basic reply logic --- .../privateMessage/PrivateMessage.java | 110 ++++++++++++++---- 1 file changed, 85 insertions(+), 25 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 ce9922c..2f265aa 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 @@ -6,7 +6,6 @@ import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages; import eu.mhsl.craftattack.spawn.appliances.privateMessage.commands.PrivateMessageCommand; import eu.mhsl.craftattack.spawn.appliances.privateMessage.commands.PrivateReplyCommand; -import eu.mhsl.craftattack.spawn.util.LimitedSizedList; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.NamedTextColor; @@ -18,37 +17,98 @@ import java.util.*; import java.util.stream.Collectors; public class PrivateMessage extends Appliance { - public final int targetChangeTimeout = 30; + public final int targetChangeTimeoutSeconds = 30; private record Conversation(UUID target, Long lastSet) {} - private final Map> replyMapping = new WeakHashMap<>(); + private final Map> replyMapping = new WeakHashMap<>(); public void reply(Player sender, String message) { - Conversation senderConversation = this.replyMapping.get(sender).getLast(); - if(senderConversation == null) throw new ApplianceCommand.Error("Du kannst nicht auf eine konversation antworten, da keine vorhanden ist."); -// if(!senderConversation.isChecked && senderConversation.lastSet > System.currentTimeMillis() - targetChangeTimeout) { -// throw new ApplianceCommand.Error("ziel geändedrt......."); -// } - Player target = Bukkit.getPlayer(senderConversation.target); - if(target == null) throw new ApplianceCommand.Error("Der Spieler ist nicht mehr verfügbar."); - sendWhisper(sender, new ResolvedPmUserArguments(target, 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."); + + Conversation youngestEntry = this.replyMapping.get(sender).stream() + .max(Comparator.comparingLong(o -> o.lastSet)) + .orElse(this.replyMapping.get(sender).getLast()); + + 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."); + + this.replyMapping.get(sender).clear(); + sendWhisper(sender, new ResolvedPmUserArguments(target, message)); + return; + } + + List oldConversations = this.replyMapping.get(sender).stream() + .filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000)) + .toList(); + this.replyMapping.get(sender).removeAll(oldConversations); + + List playerNames = this.replyMapping.get(sender).stream() + .map(conversation -> { + if(Bukkit.getPlayer(conversation.target()) != null) { + return Objects.requireNonNull(Bukkit.getPlayer(conversation.target())).getName(); + } else { + return Bukkit.getOfflinePlayer(conversation.target()).getName(); + } + }) + .toList(); + + 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? ")) + ); + // TODO: add options to click on with the players names +// sender.sendMessage( +// Component.text() +// .append(Component.text()) +// ); + } public void sendWhisper(Player sender, ResolvedPmUserArguments userArguments) { -// this.replyMapping.put( -// sender, -// new Conversation( -// userArguments.receiver.getUniqueId(), -// System.currentTimeMillis() -// ) -// ); -// this.replyMapping.put( -// userArguments.receiver, -// new Conversation( -// sender.getUniqueId(), -// System.currentTimeMillis() -// ) -// ); + + // Ä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()) + .toList(); + this.replyMapping.get(userArguments.receiver).removeAll(oldEntries); + } + + // Neuen Eintrag bei replyMapping für den receiver + Conversation newReceiverConversation = new Conversation( + sender.getUniqueId(), + System.currentTimeMillis() + ); + + if(this.replyMapping.get(userArguments.receiver) == null) { + List receiverConversationList = new ArrayList<>(); + receiverConversationList.add(newReceiverConversation); + + this.replyMapping.put( + userArguments.receiver, + receiverConversationList + ); + } else { + 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( + userArguments.receiver.getUniqueId(), + System.currentTimeMillis() + ) + ); + + this.replyMapping.put( + sender, + senderConversationList + ); + ChatMessages chatMessages = Main.instance().getAppliance(ChatMessages.class); Component privatePrefix = Component.text("[Privat] ", NamedTextColor.LIGHT_PURPLE);