From 7e3b043c98e5c7933c149424f28709ea14e469dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sun, 24 Nov 2024 21:13:25 +0100 Subject: [PATCH] added afkTag --- .../appliances/afkTag/AfkResetListener.java | 30 ++++++++ .../spawn/appliances/afkTag/AfkTag.java | 71 +++++++++++++++++++ .../appliances/displayName/DisplayName.java | 9 ++- .../spawn/appliances/outlawed/Outlawed.java | 3 +- .../spawn/appliances/yearRank/YearRank.java | 4 +- 5 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkResetListener.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkResetListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkResetListener.java new file mode 100644 index 0000000..4c758f9 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkResetListener.java @@ -0,0 +1,30 @@ +package eu.mhsl.craftattack.spawn.appliances.afkTag; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; +import io.papermc.paper.event.player.AsyncChatEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerMoveEvent; + +public class AfkResetListener extends ApplianceListener { + @EventHandler + public void onMove(PlayerMoveEvent event) { + getAppliance().resetTiming(event.getPlayer()); + } + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + getAppliance().resetTiming(event.getPlayer()); + } + + @EventHandler + public void onChat(AsyncChatEvent event) { + getAppliance().resetTiming(event.getPlayer()); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + getAppliance().resetTiming(event.getPlayer()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java new file mode 100644 index 0000000..055aa4e --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java @@ -0,0 +1,71 @@ +package eu.mhsl.craftattack.spawn.appliances.afkTag; + +import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliances.displayName.DisplayName; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.util.Ticks; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.WeakHashMap; + +public class AfkTag extends Appliance implements DisplayName.DisplayNamed { + private final WeakHashMap afkTimings = new WeakHashMap<>(); + private static final int updateIntervalSeconds = 30; + private static final int afkWhenMillis = 5 * 60 * 1000; + + @Override + public void onEnable() { + Bukkit.getScheduler().runTaskTimerAsynchronously( + Main.instance(), + this::checkAfkPlayers, + Ticks.TICKS_PER_SECOND, + Ticks.TICKS_PER_SECOND * updateIntervalSeconds + ); + } + + public void resetTiming(Player player) { + boolean wasAfk = isAfk(player); + this.afkTimings.put(player, System.currentTimeMillis()); + if (wasAfk) updateAfkPrefix(player); + } + + private void checkAfkPlayers() { + this.afkTimings.keySet().forEach((player) -> { + if(!isAfk(player)) return; + updateAfkPrefix(player); + }); + } + + private boolean isAfk(Player player) { + if(player.isSleeping()) return false; + + long lastTimeActive = this.afkTimings.getOrDefault(player, 0L); + long timeSinceLastActive = System.currentTimeMillis() - lastTimeActive; + return timeSinceLastActive >= afkWhenMillis; + } + + private void updateAfkPrefix(Player player) { + Main.instance().getAppliance(DisplayName.class).update(player); + } + + @Override + public @Nullable Component getNamePrefix(Player p) { + if(isAfk(p)) return Component.text("[\uD83D\uDECC]", NamedTextColor.GRAY) + .hoverEvent(HoverEvent.showText(Component.text("Der Spieler ist AFK"))); + + return null; + } + + @Override + protected @NotNull List listeners() { + return List.of(new AfkResetListener()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java index 429cfdd..8271157 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java @@ -4,6 +4,7 @@ import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarkerListener; +import eu.mhsl.craftattack.spawn.appliances.afkTag.AfkTag; import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed; import eu.mhsl.craftattack.spawn.appliances.yearRank.YearRank; import net.kyori.adventure.text.Component; @@ -13,17 +14,23 @@ import net.kyori.adventure.text.format.TextColor; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.function.Supplier; import java.util.logging.Level; public class DisplayName extends Appliance { + public interface DisplayNamed { + @Nullable Component getNamePrefix(Player p); + } + public void update(Player player) { TextColor playerColor = queryAppliance(AdminMarker.class).getPlayerColor(player); List> prefixes = List.of( () -> queryAppliance(Outlawed.class).getNamePrefix(player), - () -> queryAppliance(YearRank.class).getNamePrefix(player) + () -> queryAppliance(YearRank.class).getNamePrefix(player), + () -> queryAppliance(AfkTag.class).getNamePrefix(player) ); ComponentBuilder playerName = Component.text(); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/outlawed/Outlawed.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/outlawed/Outlawed.java index e71ffc0..3fb23fb 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/outlawed/Outlawed.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/outlawed/Outlawed.java @@ -17,7 +17,7 @@ import org.jetbrains.annotations.NotNull; import java.util.*; -public class Outlawed extends Appliance { +public class Outlawed extends Appliance implements DisplayName.DisplayNamed { public final int timeoutInMs = 1000 * 60 * 60 * 6; private final Map timeouts = new HashMap<>(); @@ -110,6 +110,7 @@ public class Outlawed extends Appliance { }; } + @Override public Component getNamePrefix(Player player) { if(isOutlawed(player)) { return Component.text("[☠]", NamedTextColor.RED) diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRank.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRank.java index 75e3acb..0b97f9b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRank.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/yearRank/YearRank.java @@ -3,6 +3,7 @@ package eu.mhsl.craftattack.spawn.appliances.yearRank; 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.displayName.DisplayName; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; @@ -15,7 +16,7 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.*; -public class YearRank extends Appliance { +public class YearRank extends Appliance implements DisplayName.DisplayNamed { record CraftAttackYear(String name) {} private final Map> rankMap = new HashMap<>(); @@ -44,6 +45,7 @@ public class YearRank extends Appliance { }); } + @Override public @Nullable Component getNamePrefix(Player player) { if(!rankMap.containsKey(player.getUniqueId())) return null; int yearCount = rankMap.get(player.getUniqueId()).size();