develop-chatReply #5
@ -19,6 +19,7 @@ import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed;
|
||||
import eu.mhsl.craftattack.spawn.appliances.panicBan.PanicBan;
|
||||
import eu.mhsl.craftattack.spawn.appliances.playerlimit.PlayerLimit;
|
||||
import eu.mhsl.craftattack.spawn.appliances.portableCrafting.PortableCrafting;
|
||||
import eu.mhsl.craftattack.spawn.appliances.privateMessage.PrivateMessage;
|
||||
import eu.mhsl.craftattack.spawn.appliances.projectStart.ProjectStart;
|
||||
import eu.mhsl.craftattack.spawn.appliances.report.Report;
|
||||
import eu.mhsl.craftattack.spawn.appliances.restart.Restart;
|
||||
@ -75,7 +76,8 @@ public final class Main extends JavaPlugin {
|
||||
new AutoShulker(),
|
||||
new AntiSignEdit(),
|
||||
new HotbarRefill(),
|
||||
new ChatMention()
|
||||
new ChatMention(),
|
||||
new PrivateMessage()
|
||||
);
|
||||
|
||||
Main.logger.info("Loading appliances...");
|
||||
|
@ -1,6 +1,8 @@
|
||||
package eu.mhsl.craftattack.spawn.appliances.chatMention;
|
||||
|
||||
import eu.mhsl.craftattack.spawn.Main;
|
||||
import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
|
||||
import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages;
|
||||
import eu.mhsl.craftattack.spawn.appliances.settings.Settings;
|
||||
import eu.mhsl.craftattack.spawn.appliances.settings.settings.ChatMentionSetting;
|
||||
import io.papermc.paper.event.player.AsyncChatDecorateEvent;
|
||||
@ -8,6 +10,7 @@ import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -22,6 +25,7 @@ public class ChatMentionListener extends ApplianceListener<ChatMention> {
|
||||
|
||||
ChatMentionSetting.ChatMentionConfig config = Settings.instance()
|
||||
.getSetting(event.player(), Settings.Key.ChatMentions, ChatMentionSetting.ChatMentionConfig.class);
|
||||
ChatMessages chatMessages = Main.instance().getAppliance(ChatMessages.class);
|
||||
|
||||
Component result = words.stream()
|
||||
.map(word -> {
|
||||
@ -29,10 +33,11 @@ public class ChatMentionListener extends ApplianceListener<ChatMention> {
|
||||
boolean isPlayer = getAppliance().getPlayerNames().contains(wordWithoutAnnotation);
|
||||
if(isPlayer && config.applyMentions()) {
|
||||
mentioned.add(wordWithoutAnnotation);
|
||||
return Component.text(
|
||||
Component mention = Component.text(
|
||||
getAppliance().formatPlayer(wordWithoutAnnotation),
|
||||
NamedTextColor.GOLD
|
||||
);
|
||||
return chatMessages.addReportActions(mention, wordWithoutAnnotation);
|
||||
} else {
|
||||
return Component.text(word);
|
||||
}
|
||||
@ -43,4 +48,9 @@ public class ChatMentionListener extends ApplianceListener<ChatMention> {
|
||||
getAppliance().notifyPlayers(mentioned);
|
||||
event.result(result);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
getAppliance().refreshPlayers();
|
||||
}
|
||||
}
|
||||
|
@ -13,11 +13,13 @@ import java.util.List;
|
||||
|
||||
public class ChatMessages extends Appliance {
|
||||
public Component getReportablePlayerName(Player player) {
|
||||
return Component
|
||||
.text("")
|
||||
.append(player.displayName())
|
||||
return addReportActions(player.displayName(), player.getName());
|
||||
}
|
||||
|
||||
public Component addReportActions(Component message, String username) {
|
||||
return message
|
||||
.hoverEvent(HoverEvent.showText(Component.text("Klicke, um diesen Spieler zu reporten").color(NamedTextColor.GOLD)))
|
||||
.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/report " + player.getName() + " "));
|
||||
.clickEvent(ClickEvent.clickEvent(ClickEvent.Action.SUGGEST_COMMAND, String.format("/report %s ", username)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -0,0 +1,93 @@
|
||||
package eu.mhsl.craftattack.spawn.appliances.privateMessage;
|
||||
|
||||
import eu.mhsl.craftattack.spawn.Main;
|
||||
import eu.mhsl.craftattack.spawn.appliance.Appliance;
|
||||
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;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class PrivateMessage extends Appliance {
|
||||
public final int targetChangeTimeout = 30;
|
||||
|
||||
private record Conversation(UUID target, Long lastSet) {}
|
||||
private final Map<Player, LimitedSizedList<Conversation>> 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));
|
||||
}
|
||||
|
||||
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(
|
||||
Pupsi marked this conversation as resolved
|
||||
// sender.getUniqueId(),
|
||||
// System.currentTimeMillis()
|
||||
// )
|
||||
// );
|
||||
|
||||
ChatMessages chatMessages = Main.instance().getAppliance(ChatMessages.class);
|
||||
Component privatePrefix = Component.text("[Privat] ", NamedTextColor.LIGHT_PURPLE);
|
||||
|
||||
sender.sendMessage(
|
||||
Component.text()
|
||||
.append(privatePrefix.clickEvent(ClickEvent.suggestCommand(String.format("/msg %s ", userArguments.receiver.getName()))))
|
||||
.append(sender.displayName())
|
||||
.append(Component.text(" zu ", NamedTextColor.GRAY))
|
||||
.append(chatMessages.getReportablePlayerName(userArguments.receiver))
|
||||
.append(Component.text(" > ", NamedTextColor.GRAY))
|
||||
.append(Component.text(userArguments.message))
|
||||
);
|
||||
userArguments.receiver.sendMessage(
|
||||
Component.text()
|
||||
.append(privatePrefix.clickEvent(ClickEvent.suggestCommand(String.format("/msg %s ", sender.getName()))))
|
||||
.append(chatMessages.getReportablePlayerName(sender))
|
||||
.append(Component.text(" zu ", NamedTextColor.GRAY))
|
||||
.append(userArguments.receiver.displayName())
|
||||
.append(Component.text(" > ", NamedTextColor.GRAY))
|
||||
.append(Component.text(userArguments.message))
|
||||
);
|
||||
}
|
||||
|
||||
public record ResolvedPmUserArguments(Player receiver, String message) {}
|
||||
public ResolvedPmUserArguments resolveImplicit(String[] args) {
|
||||
if(args.length < 2) throw new ApplianceCommand.Error("Es muss ein Spieler sowie eine Nachricht angegeben werden.");
|
||||
List<String> arguments = List.of(args);
|
||||
Player targetPlayer = Bukkit.getPlayer(arguments.getFirst());
|
||||
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?
|
||||
if(targetPlayer == null) throw new ApplianceCommand.Error(String.format("Der Spieler %s konnte nicht gefunden werden.", arguments.getFirst()));
|
||||
String message = arguments.stream().skip(1).collect(Collectors.joining(" "));
|
||||
return new ResolvedPmUserArguments(targetPlayer, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected @NotNull List<ApplianceCommand<?>> commands() {
|
||||
return List.of(
|
||||
new PrivateMessageCommand(),
|
||||
new PrivateReplyCommand()
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package eu.mhsl.craftattack.spawn.appliances.privateMessage.commands;
|
||||
|
||||
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
|
||||
import eu.mhsl.craftattack.spawn.appliances.privateMessage.PrivateMessage;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class PrivateMessageCommand extends ApplianceCommand.PlayerChecked<PrivateMessage> {
|
||||
public PrivateMessageCommand() {
|
||||
super("msg");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception {
|
||||
getAppliance().sendWhisper(getPlayer(), getAppliance().resolveImplicit(args));
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package eu.mhsl.craftattack.spawn.appliances.privateMessage.commands;
|
||||
|
||||
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
|
||||
import eu.mhsl.craftattack.spawn.appliances.privateMessage.PrivateMessage;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class PrivateReplyCommand extends ApplianceCommand.PlayerChecked<PrivateMessage> {
|
||||
public PrivateReplyCommand() {
|
||||
super("r");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception {
|
||||
getAppliance().reply(getPlayer(), String.join(" ", args));
|
||||
}
|
||||
}
|
@ -43,7 +43,10 @@ public class Whitelist extends Appliance {
|
||||
public void integrityCheck(Player player) throws DisconnectInfo.Throwable {
|
||||
try {
|
||||
Main.instance().getLogger().info(String.format("Running integrityCheck for %s", player.getName()));
|
||||
UserData user = this.fetchUserData(player.getUniqueId());
|
||||
boolean overrideCheck = localConfig().getBoolean("overrideIntegrityCheck", false);
|
||||
UserData user = overrideCheck
|
||||
? new UserData(player.getUniqueId(), player.getName(), "", "", 0L, 0L)
|
||||
: this.fetchUserData(player.getUniqueId());
|
||||
|
||||
if(timestampRelevant(user.banned_until)) {
|
||||
Instant bannedDate = new Date(user.banned_until * 1000L)
|
||||
@ -63,12 +66,9 @@ public class Whitelist extends Appliance {
|
||||
|
||||
Main.instance().getAppliance(Outlawed.class).updateForcedStatus(player, timestampRelevant(user.outlawed_until));
|
||||
|
||||
String purePlayerName;
|
||||
if(Floodgate.isBedrock(player)) {
|
||||
purePlayerName = Floodgate.getBedrockPlayer(player).getUsername();
|
||||
} else {
|
||||
purePlayerName = player.getName();
|
||||
}
|
||||
String purePlayerName = Floodgate.isBedrock(player)
|
||||
? Floodgate.getBedrockPlayer(player).getUsername()
|
||||
: player.getName();
|
||||
|
||||
if(!user.username.trim().equalsIgnoreCase(purePlayerName))
|
||||
throw new DisconnectInfo.Throwable(
|
||||
@ -100,8 +100,7 @@ public class Whitelist extends Appliance {
|
||||
URIBuilder uriBuilder = new URIBuilder(apiEndpoint);
|
||||
uriBuilder.addParameter("uuid", uuid.toString());
|
||||
|
||||
try {
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
try(HttpClient client = HttpClient.newHttpClient()) {
|
||||
HttpRequest httpRequest = HttpRequest.newBuilder()
|
||||
.uri(uriBuilder.build())
|
||||
.header("Content-Type", "application/json")
|
||||
|
@ -0,0 +1,27 @@
|
||||
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);
|
||||
}
|
||||
}
|
@ -9,6 +9,7 @@ import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.Duration;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class NetworkMonitor {
|
||||
private long previousRxBytes = 0;
|
||||
@ -78,7 +79,9 @@ public class NetworkMonitor {
|
||||
String content = new String(Files.readAllBytes(Paths.get(path)));
|
||||
return Long.parseLong(content.trim());
|
||||
} catch(IOException e) {
|
||||
throw new RuntimeException("Failed recieving Network statistic", e);
|
||||
Main.logger().log(Level.SEVERE, "Statistics are only supported on Linux! Is tablist.interface config set correctly?");
|
||||
this.stop();
|
||||
throw new RuntimeException("Failed reading network statistic", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -42,9 +42,10 @@ help:
|
||||
spawn: "Der Weltspawn befindet sich bei x:0 y:0 z:0"
|
||||
|
||||
playerLimit:
|
||||
maxPlayers: 0
|
||||
maxPlayers: 100
|
||||
|
||||
whitelist:
|
||||
overrideIntegrityCheck: false
|
||||
api: https://mhsl.eu/craftattack/api/user
|
||||
|
||||
tablist:
|
||||
|
@ -37,3 +37,5 @@ commands:
|
||||
panicBan:
|
||||
vogelfrei:
|
||||
settings:
|
||||
msg:
|
||||
r:
|
Loading…
x
Reference in New Issue
Block a user
initialisierung und sofortig bedingtes überschreiben würde ich als bad practice einstufen...
Umschreiben zu