develop-chatReply #5
@ -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<Player, List<Conversation>> 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<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()
|
||||
.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();
|
||||
Pupsi marked this conversation as resolved
|
||||
} 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<Conversation> oldConversations = this.replyMapping.get(sender).stream()
|
||||
.filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000))
|
||||
.toList();
|
||||
this.replyMapping.get(sender).removeAll(oldConversations);
|
||||
|
||||
Pupsi marked this conversation as resolved
MineTec
commented
gibt es einen Grund warum die Variable hier außerhalb allokiert wird aber nur innerhalb des if statements genutzt wird? gibt es einen Grund warum die Variable hier außerhalb allokiert wird aber nur innerhalb des if statements genutzt wird?
|
||||
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()
|
||||
.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<Conversation> 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);
|
||||
}
|
||||
MineTec marked this conversation as resolved
MineTec
commented
wird in der reply methode auch aufgerufen, macht ggf sinn die chatMessages referenz als objektvariable zu halten. wird in der reply methode auch aufgerufen, macht ggf sinn die chatMessages referenz als objektvariable zu halten.
|
||||
|
||||
// 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<Conversation> senderConversationList = new ArrayList<>();
|
||||
senderConversationList.add(
|
||||
new Conversation(
|
||||
|
Loading…
x
Reference in New Issue
Block a user
initialisierung und sofortig bedingtes überschreiben würde ich als bad practice einstufen...
Umschreiben zu