too old conversations get deleted, added prefix, changed some logic

This commit is contained in:
Lars Neuhaus 2024-10-02 23:37:45 +02:00
parent 471cd8e610
commit 497c5ad749

View File

@ -19,17 +19,52 @@ import java.util.stream.Collectors;
public class PrivateMessage extends Appliance { public class PrivateMessage extends Appliance {
public final int targetChangeTimeoutSeconds = 30; public final int targetChangeTimeoutSeconds = 30;
public final int conversationTimeoutMinutes = 30;
private record Conversation(UUID target, Long lastSet) {} private record Conversation(UUID target, Long lastSet) {}
private final Map<Player, List<Conversation>> replyMapping = new WeakHashMap<>(); private final Map<Player, List<Conversation>> replyMapping = new WeakHashMap<>();
public void reply(Player sender, String message) { 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<Conversation> 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() Conversation youngestEntry = this.replyMapping.get(sender).stream()
.max(Comparator.comparingLong(o -> o.lastSet)) .max(Comparator.comparingLong(o -> o.lastSet))
.orElse(this.replyMapping.get(sender).getLast()); .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) { if(youngestEntry.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000) || this.replyMapping.get(sender).size() == 1) {
Player target = Bukkit.getPlayer(youngestEntry.target()); 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."); 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<Conversation> oldConversations = this.replyMapping.get(sender).stream() List<Conversation> oldConversations = this.replyMapping.get(sender).stream()
.filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000)) .filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000))
.toList(); .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<String> playerNames = this.replyMapping.get(sender).stream() List<String> playerNames = this.replyMapping.get(sender).stream()
.map(conversation -> { .map(conversation -> {
@ -55,34 +97,41 @@ public class PrivateMessage extends Appliance {
.distinct() .distinct()
.toList(); .toList();
sender.sendMessage(""); sender.sendMessage("");
sender.sendMessage( sender.sendMessage(
Component.text() Component.text()
.append(Component.text("Das Ziel für /r hat sich bei dir in den letzten ")) .append(privatePrefix)
.append(Component.text(String.valueOf(this.targetChangeTimeoutSeconds))) .append(Component.text("Das Ziel für /r hat sich bei dir in den letzten ", NamedTextColor.RED))
.append(Component.text(" Sekunden geändert. Wer soll deine Nachricht bekommen? ")) .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("")}; final Component[] finalComponent = {Component.text("")};
String firstTargetName; String firstTargetName = null;
if(Bukkit.getPlayer(youngestEntry.target()) == null) { if(youngestOldConversation != null && Bukkit.getPlayer(youngestOldConversation.target()) == null) {
firstTargetName = Bukkit.getOfflinePlayer(youngestEntry.target()).getName(); firstTargetName = Bukkit.getOfflinePlayer(youngestOldConversation.target()).getName();
} else { } else if(youngestOldConversation != null){
firstTargetName = Objects.requireNonNull(Bukkit.getPlayer(youngestEntry.target())).getName(); firstTargetName = Objects.requireNonNull(Bukkit.getPlayer(youngestOldConversation.target())).getName();
} }
if(firstTargetName != null && !playerNames.contains(firstTargetName)) { if(firstTargetName != null && !playerNames.contains(firstTargetName)) {
finalComponent[0] = finalComponent[0].append(Component.text(firstTargetName, NamedTextColor.GOLD) finalComponent[0] = finalComponent[0].append(
.clickEvent(ClickEvent.runCommand("/msg " + firstTargetName + " " + message)) Component.text("[")
.hoverEvent(HoverEvent.showText(Component.text("Klicke, um diesem Spieler zu schreiben.").color(NamedTextColor.GOLD)))) .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(" ")); .append(Component.text(" "));
} }
playerNames.forEach(playerName -> finalComponent[0] = finalComponent[0].append(Component.text(playerName, NamedTextColor.GOLD) playerNames.forEach(playerName -> finalComponent[0] = finalComponent[0].append(
.clickEvent(ClickEvent.runCommand("/msg " + playerName + " " + message)) Component.text("[")
.hoverEvent(HoverEvent.showText(Component.text("Klicke, um diesem Spieler zu schreiben.").color(NamedTextColor.GOLD)))) .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(" "))); .append(Component.text(" ")));
sender.sendMessage(""); sender.sendMessage("");
@ -93,7 +142,6 @@ public class PrivateMessage extends Appliance {
public void sendWhisper(Player sender, ResolvedPmUserArguments userArguments) { public void sendWhisper(Player sender, ResolvedPmUserArguments userArguments) {
// Ältere Einträge bei replyMapping für den receiver entfernen
if(!(this.replyMapping.get(userArguments.receiver) == null)) { if(!(this.replyMapping.get(userArguments.receiver) == null)) {
List<Conversation> oldEntries = this.replyMapping.get(userArguments.receiver).stream() List<Conversation> oldEntries = this.replyMapping.get(userArguments.receiver).stream()
.filter(conversation -> conversation.target() == sender.getUniqueId()) .filter(conversation -> conversation.target() == sender.getUniqueId())
@ -101,7 +149,6 @@ public class PrivateMessage extends Appliance {
this.replyMapping.get(userArguments.receiver).removeAll(oldEntries); this.replyMapping.get(userArguments.receiver).removeAll(oldEntries);
} }
// Neuen Eintrag bei replyMapping für den receiver
Conversation newReceiverConversation = new Conversation( Conversation newReceiverConversation = new Conversation(
sender.getUniqueId(), sender.getUniqueId(),
System.currentTimeMillis() System.currentTimeMillis()
@ -119,7 +166,6 @@ public class PrivateMessage extends Appliance {
this.replyMapping.get(userArguments.receiver).add(newReceiverConversation); this.replyMapping.get(userArguments.receiver).add(newReceiverConversation);
} }
// Einträge für sender bei replyMapping überschreiben mit receiver
List<Conversation> senderConversationList = new ArrayList<>(); List<Conversation> senderConversationList = new ArrayList<>();
senderConversationList.add( senderConversationList.add(
new Conversation( new Conversation(