diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/ChatMute.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/ChatMute.java new file mode 100644 index 0000000..688b82d --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/ChatMute.java @@ -0,0 +1,44 @@ +package eu.mhsl.craftattack.spawn.appliances.chatMute; + +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +public class ChatMute extends Appliance { + private static final String namespace = ChatMute.class.getSimpleName().toLowerCase(Locale.ROOT); + public static NamespacedKey mutedUntilKey = new NamespacedKey(namespace, "mutedUntilMillis".toLowerCase()); + + public void mutePlayer(Player player, int durationHours) { + PersistentDataContainer container = player.getPersistentDataContainer(); + long mutedUntil = System.currentTimeMillis() + (long) durationHours * 60 * 60 * 1000; + container.set(ChatMute.mutedUntilKey, PersistentDataType.LONG, mutedUntil); + } + + public @Nullable Long muteStatus(Player player) { + PersistentDataContainer container = player.getPersistentDataContainer(); + if(!container.has(mutedUntilKey)) return null; + long mutedUntil = Objects.requireNonNull(container.get(mutedUntilKey, PersistentDataType.LONG)); + if(mutedUntil < System.currentTimeMillis()) return null; + return mutedUntil; + } + + @Override + protected @NotNull List> commands() { + return List.of(new MuteCommand()); + } + + @Override + protected @NotNull List listeners() { + return List.of(new ChatMuteListener()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/ChatMuteListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/ChatMuteListener.java new file mode 100644 index 0000000..ca01046 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/ChatMuteListener.java @@ -0,0 +1,25 @@ +package eu.mhsl.craftattack.spawn.appliances.chatMute; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import eu.mhsl.craftattack.spawn.util.text.DataSizeConverter; +import io.papermc.paper.event.player.AsyncChatEvent; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.event.EventHandler; +import org.jetbrains.annotations.Nullable; + +public class ChatMuteListener extends ApplianceListener { + @EventHandler + public void onChat(AsyncChatEvent event) { + @Nullable Long muteDuration = this.getAppliance().muteStatus(event.getPlayer()); + if(muteDuration == null) return; + event.setCancelled(true); + event.getPlayer().sendMessage(Component.text( + String.format( + "Du bist für %s gestummt!", + DataSizeConverter.formatSecondsToHumanReadable((int) ((muteDuration - System.currentTimeMillis()) / 1000)) + ), + NamedTextColor.RED + )); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/MuteCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/MuteCommand.java new file mode 100644 index 0000000..9a7e01e --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMute/MuteCommand.java @@ -0,0 +1,35 @@ +package eu.mhsl.craftattack.spawn.appliances.chatMute; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Objects; + +public class MuteCommand extends ApplianceCommand { + public MuteCommand() { + super("mute"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) throws Exception { + if(args.length < 2) throw new Error("Syntax: mute "); + Player player = Objects.requireNonNull(Bukkit.getPlayer(args[0])); + int durationInHours = Integer.parseInt(args[1]); + this.getAppliance().mutePlayer(player, durationInHours); + sender.sendMessage(String.format("%s wurde für %d Stunden gestummt!", player.getName(), durationInHours)); + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length == 1) { + return List.of("1", "2", "4", "8", "24", "48"); + } + return null; + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0f1ba62..3d13bc6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -52,4 +52,5 @@ commands: endPrevent: feedback: requestFeedback: - setSpawnpoint: \ No newline at end of file + setSpawnpoint: + mute: \ No newline at end of file