develop-chatReply #5
@ -7,6 +7,8 @@ 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 net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.ComponentBuilder;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.event.ClickEvent;
|
||||
import net.kyori.adventure.text.event.HoverEvent;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
@ -25,27 +27,29 @@ public class PrivateMessage extends Appliance {
|
||||
private final Map<Player, List<Conversation>> replyMapping = new WeakHashMap<>();
|
||||
|
||||
public void reply(Player sender, String message) {
|
||||
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);
|
||||
}
|
||||
this.replyMapping.computeIfAbsent(sender, player -> new ArrayList<>());
|
||||
|
||||
if(this.replyMapping.get(sender) == null || this.replyMapping.get(sender).isEmpty()) throw new ApplianceCommand.Error("Du führst aktuell keine Konversation.");
|
||||
List<Conversation> tooOldConversations = this.replyMapping.get(sender).stream()
|
||||
.filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (conversationTimeoutMinutes*60*1000))
|
||||
.toList();
|
||||
this.replyMapping.get(sender).removeAll(tooOldConversations);
|
||||
|
||||
List<Conversation> replyMap = this.replyMapping.get(sender);
|
||||
|
||||
if(replyMap.isEmpty()) throw new ApplianceCommand.Error("Du führst aktuell keine Konversation.");
|
||||
|
||||
Component privatePrefix = Component.text("[Privat] ", NamedTextColor.LIGHT_PURPLE);
|
||||
|
||||
Conversation youngestEntry = this.replyMapping.get(sender).stream()
|
||||
Conversation youngestEntry = replyMap.stream()
|
||||
.max(Comparator.comparingLong(o -> o.lastSet))
|
||||
.orElse(this.replyMapping.get(sender).getLast());
|
||||
.orElse(replyMap.getLast());
|
||||
|
||||
if(message.isBlank()) {
|
||||
Pupsi marked this conversation as resolved
|
||||
Component currentTargetComponent = Component.text("niemandem.");
|
||||
Player currentTargetPlayer = Bukkit.getPlayer(youngestEntry.target());
|
||||
if(currentTargetPlayer != null) {
|
||||
currentTargetComponent = Main.instance().getAppliance(ChatMessages.class).getReportablePlayerName(currentTargetPlayer);
|
||||
}
|
||||
|
||||
Component currentTargetComponent = currentTargetPlayer != null
|
||||
? Main.instance().getAppliance(ChatMessages.class).getReportablePlayerName(currentTargetPlayer)
|
||||
: Component.text("niemandem.");
|
||||
|
||||
sender.sendMessage(
|
||||
privatePrefix
|
||||
@ -55,84 +59,79 @@ public class PrivateMessage extends Appliance {
|
||||
return;
|
||||
}
|
||||
|
||||
if(youngestEntry.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000) || this.replyMapping.get(sender).size() == 1) {
|
||||
List<Conversation> oldConversations = replyMap.stream()
|
||||
.filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000))
|
||||
.toList();
|
||||
|
||||
if(oldConversations.contains(youngestEntry) || replyMap.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));
|
||||
this.sendWhisper(sender, new ResolvedPmUserArguments(target, message));
|
||||
return;
|
||||
}
|
||||
|
||||
sender.sendMessage("");
|
||||
sender.sendMessage(
|
||||
Component.text()
|
||||
ComponentBuilder<TextComponent, TextComponent.Builder> component = Component.text();
|
||||
|
||||
component.append(
|
||||
Component.newline()
|
||||
.append(privatePrefix)
|
||||
.append(Component.text("Das Ziel für /r hat sich bei dir in den letzten ", NamedTextColor.RED))
|
||||
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?
|
||||
.append(Component.text(String.valueOf(this.targetChangeTimeoutSeconds), NamedTextColor.RED))
|
||||
.append(Component.text(" Sekunden geändert. Wer soll deine Nachricht bekommen? ", NamedTextColor.RED))
|
||||
.append(Component.text(" Sekunden geändert. Wer soll deine Nachricht erhalten? ", NamedTextColor.RED))
|
||||
.appendNewline()
|
||||
.appendNewline()
|
||||
);
|
||||
|
||||
List<Conversation> oldConversations = this.replyMapping.get(sender).stream()
|
||||
.filter(conversation -> conversation.lastSet < System.currentTimeMillis() - (targetChangeTimeoutSeconds*1000))
|
||||
.toList();
|
||||
|
||||
Conversation youngestOldConversation;
|
||||
if(!oldConversations.isEmpty()) {
|
||||
youngestOldConversation = oldConversations.stream()
|
||||
Conversation youngestOldConversation = oldConversations.stream()
|
||||
.max(Comparator.comparingLong(o -> o.lastSet))
|
||||
.orElse(oldConversations.getLast());
|
||||
this.replyMapping.get(sender).removeAll(oldConversations);
|
||||
this.replyMapping.get(sender).add(youngestOldConversation);
|
||||
replyMap = this.replyMapping.get(sender);
|
||||
}
|
||||
|
||||
List<String> playerNames = this.replyMapping.get(sender).stream()
|
||||
List<String> playerNames = replyMap.stream()
|
||||
.map(conversation -> Bukkit.getOfflinePlayer(conversation.target()).getName())
|
||||
.distinct()
|
||||
.toList();
|
||||
|
||||
final Component[] finalComponent = {Component.text("")};
|
||||
|
||||
playerNames.forEach(playerName -> finalComponent[0] = finalComponent[0].append(
|
||||
playerNames.forEach(playerName -> component.append(
|
||||
Component.text("[")
|
||||
.append(Component.text(playerName, NamedTextColor.GOLD))
|
||||
.append(Component.text("]"))
|
||||
.clickEvent(ClickEvent.runCommand("/msg " + playerName + " " + message))
|
||||
.clickEvent(ClickEvent.runCommand(String.format("/msg %s %s", playerName, message)))
|
||||
.hoverEvent(HoverEvent.showText(Component.text("Klicke, um diesem Spieler zu schreiben.").color(NamedTextColor.GOLD))))
|
||||
.append(Component.text(" ")));
|
||||
.append(Component.text(" "))
|
||||
);
|
||||
component.appendNewline();
|
||||
|
||||
sender.sendMessage("");
|
||||
sender.sendMessage(finalComponent[0]);
|
||||
sender.sendMessage("");
|
||||
sender.sendMessage(component.build());
|
||||
|
||||
}
|
||||
|
||||
public void sendWhisper(Player sender, ResolvedPmUserArguments userArguments) {
|
||||
|
||||
if(!(this.replyMapping.get(userArguments.receiver) == null)) {
|
||||
List<Conversation> oldEntries = this.replyMapping.get(userArguments.receiver).stream()
|
||||
.filter(conversation -> conversation.target() == sender.getUniqueId())
|
||||
.toList();
|
||||
this.replyMapping.get(userArguments.receiver).removeAll(oldEntries);
|
||||
}
|
||||
|
||||
Conversation newReceiverConversation = new Conversation(
|
||||
sender.getUniqueId(),
|
||||
System.currentTimeMillis()
|
||||
);
|
||||
|
||||
if(this.replyMapping.get(userArguments.receiver) == null) {
|
||||
List<Conversation> receiverConversationList = new ArrayList<>();
|
||||
receiverConversationList.add(newReceiverConversation);
|
||||
|
||||
if(this.replyMapping.get(userArguments.receiver) != null) {
|
||||
List<Conversation> oldEntries = this.replyMapping.get(userArguments.receiver).stream()
|
||||
.filter(conversation -> conversation.target() == sender.getUniqueId())
|
||||
.toList();
|
||||
this.replyMapping.get(userArguments.receiver).removeAll(oldEntries);
|
||||
} else {
|
||||
this.replyMapping.put(
|
||||
userArguments.receiver,
|
||||
receiverConversationList
|
||||
new ArrayList<>()
|
||||
);
|
||||
} else {
|
||||
this.replyMapping.get(userArguments.receiver).add(newReceiverConversation);
|
||||
}
|
||||
|
||||
this.replyMapping.get(userArguments.receiver).add(newReceiverConversation);
|
||||
|
||||
List<Conversation> senderConversationList = new ArrayList<>();
|
||||
senderConversationList.add(
|
||||
new Conversation(
|
||||
@ -146,7 +145,6 @@ public class PrivateMessage extends Appliance {
|
||||
senderConversationList
|
||||
);
|
||||
|
||||
|
||||
ChatMessages chatMessages = Main.instance().getAppliance(ChatMessages.class);
|
||||
Component privatePrefix = Component.text("[Privat] ", NamedTextColor.LIGHT_PURPLE);
|
||||
|
||||
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.
|
||||
|
@ -1,27 +0,0 @@
|
||||
package eu.mhsl.craftattack.spawn.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class LimitedSizedList<T> extends ArrayList<T> {
|
||||
private final int maxSize;
|
||||
|
||||
public LimitedSizedList(int size){
|
||||
this.maxSize = size;
|
||||
}
|
||||
|
||||
public boolean add(T element){
|
||||
boolean r = super.add(element);
|
||||
if (size() > maxSize){
|
||||
removeRange(0, size() - maxSize);
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
public T getYoungest() {
|
||||
return get(size() - 1);
|
||||
}
|
||||
|
||||
public T getOldest() {
|
||||
return get(0);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user
initialisierung und sofortig bedingtes überschreiben würde ich als bad practice einstufen...
Umschreiben zu