diff --git a/src/main/java/com/alttd/afkdectector/AFKDetector.java b/src/main/java/com/alttd/afkdectector/AFKDetector.java index 6ede7bf..6551eb1 100755 --- a/src/main/java/com/alttd/afkdectector/AFKDetector.java +++ b/src/main/java/com/alttd/afkdectector/AFKDetector.java @@ -5,8 +5,14 @@ import com.alttd.afkdectector.command.AFKCheckCommand; import com.alttd.afkdectector.command.AFKListCommand; import com.alttd.afkdectector.command.ReloadCommand; import com.alttd.afkdectector.config.Config; +import com.alttd.afkdectector.config.Messages; import com.alttd.afkdectector.config.MessagesConfig; +import com.alttd.afkdectector.trackers.AutoJoinTracker; +import com.alttd.afkdectector.trackers.SuspiciousKickTracker; +import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -22,8 +28,10 @@ import org.bukkit.scoreboard.Scoreboard; import org.bukkit.scoreboard.ScoreboardManager; import org.bukkit.scoreboard.Team; +import java.util.Date; import java.util.HashMap; import java.util.UUID; +import java.util.concurrent.TimeUnit; public class AFKDetector extends JavaPlugin implements Listener{ @@ -117,11 +125,25 @@ public class AFKDetector extends JavaPlugin implements Listener{ @EventHandler public void onJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - PlayerAfkTime.put(player.getUniqueId(), getPlayerAfktime(player)); - players.put(player.getUniqueId(), new AFKPlayer(player, this)); + UUID uuid = player.getUniqueId(); + PlayerAfkTime.put(uuid, getPlayerAfktime(player)); + players.put(uuid, new AFKPlayer(player, this)); if(Bukkit.getOnlinePlayers().size() >= Config.PLAYERLIMIT && !Config.SERVERFULL) { fulloverride = true; } + + long lastKick = AutoJoinTracker.getInstance().getLastKick(uuid); + if (lastKick + TimeUnit.SECONDS.toMicros(Config.MAXREJOINFORTRACKING) > new Date().getTime()) { + SuspiciousKickTracker skt = SuspiciousKickTracker.getInstance(); + skt.addSuspiciousKick(uuid); + int suspiciousKickCount = skt.getSuspiciousKickCount(uuid); + TagResolver placeholders = TagResolver.resolver( + Placeholder.component("player", player.name()), + Placeholder.parsed("count", "" + suspiciousKickCount) + ); + Component component = MiniMessage.miniMessage().deserialize(Messages.SUSPICIOUSKICKCOUNT.getMessage(), placeholders); + Bukkit.broadcast(component, "afkdetector.notify"); + } } @EventHandler diff --git a/src/main/java/com/alttd/afkdectector/MessageTimer.java b/src/main/java/com/alttd/afkdectector/MessageTimer.java index 47ee80b..9c7b837 100755 --- a/src/main/java/com/alttd/afkdectector/MessageTimer.java +++ b/src/main/java/com/alttd/afkdectector/MessageTimer.java @@ -1,10 +1,12 @@ package com.alttd.afkdectector; +import java.util.Date; import java.util.UUID; import com.alttd.afkdectector.afkplayer.AFKPlayer; import com.alttd.afkdectector.config.Config; import com.alttd.afkdectector.config.Messages; +import com.alttd.afkdectector.trackers.AutoJoinTracker; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; @@ -66,6 +68,7 @@ public class MessageTimer extends BukkitRunnable { //Bukkit.dispatchCommand(Bukkit.getConsoleSender(), plugin.kickCommand.replace("%player%", player.getName())); plugin.messageTimers.remove(player.getUniqueId()); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), return_placeholders(Config.KICKCOMMAND, player)); + AutoJoinTracker.getInstance().addKick(player.getUniqueId(), new Date().getTime()); TagResolver templates = TagResolver.resolver( Placeholder.unparsed("player", player.getName()), Placeholder.unparsed("afk_time", "" + afkPlayer.getafkTime()) diff --git a/src/main/java/com/alttd/afkdectector/config/Config.java b/src/main/java/com/alttd/afkdectector/config/Config.java index 93d7495..c6bae4b 100644 --- a/src/main/java/com/alttd/afkdectector/config/Config.java +++ b/src/main/java/com/alttd/afkdectector/config/Config.java @@ -39,6 +39,7 @@ public class Config extends AbstractConfiguration { public static int COMMANDCOOLDOWWN = 60; public static boolean AFKTOGGLEMESSAGES = true; public static boolean NOTIFYSTAFFONAFKKIC = true; + public static int MAXREJOINFORTRACKING = 30; private static void playerSettings() { SLEEPIGNORE = config.getBoolean("player.sleep", SLEEPIGNORE); RADIUS = config.getInt("player.radius", RADIUS); @@ -49,6 +50,7 @@ public class Config extends AbstractConfiguration { COMMANDCOOLDOWWN = config.getInt("player.commandcooldown", COMMANDCOOLDOWWN); AFKTOGGLEMESSAGES = config.getBoolean("player.afk-toggle-messages", AFKTOGGLEMESSAGES); NOTIFYSTAFFONAFKKIC = config.getBoolean("player.notify-staff-on-afk-kick", NOTIFYSTAFFONAFKKIC); + MAXREJOINFORTRACKING = config.getInt("tracking.max-seconds-for-tracking", MAXREJOINFORTRACKING); } public static boolean COUNTDOWNENABLED = false; diff --git a/src/main/java/com/alttd/afkdectector/config/Messages.java b/src/main/java/com/alttd/afkdectector/config/Messages.java index 9779ddd..c582405 100644 --- a/src/main/java/com/alttd/afkdectector/config/Messages.java +++ b/src/main/java/com/alttd/afkdectector/config/Messages.java @@ -19,7 +19,8 @@ public enum Messages { AFKCHECKTITLE("afkcheck-title", "AFK CHECK"), AFKCHECKSUBTITLE("afkcheck-subtitle", "Please respond to the dm from staff!"), AFKCHECKMESSAGE("afkcheck-message", "Hey, since you're near a farm and not moving. I'm making sure you aren't afk. Please respond to me if you're not AFK."), - AFKICKSTAFFMESSAGE("afkkick-staff-messsge", " got afk kicked after being marked as afk for minutes."); + AFKICKSTAFFMESSAGE("afkkick-staff-messsge", " got afk kicked after being marked as afk for minutes."), + SUSPICIOUSKICKCOUNT("afkkick-suspicious-message", " has had suspicious AFK kicks since last reboot."); public final String key; public String message; diff --git a/src/main/java/com/alttd/afkdectector/trackers/AutoJoinTracker.java b/src/main/java/com/alttd/afkdectector/trackers/AutoJoinTracker.java new file mode 100644 index 0000000..daa7f74 --- /dev/null +++ b/src/main/java/com/alttd/afkdectector/trackers/AutoJoinTracker.java @@ -0,0 +1,26 @@ +package com.alttd.afkdectector.trackers; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class AutoJoinTracker { + private static AutoJoinTracker instance = null; + + public static AutoJoinTracker getInstance() { + if (instance == null) + instance = new AutoJoinTracker(); + return instance; + } + + Map lastKickedMap = new HashMap<>(); + + synchronized public void addKick(UUID uuid, long time) { + lastKickedMap.put(uuid, time); + } + + synchronized public long getLastKick(UUID uuid) { + return lastKickedMap.get(uuid); + } + +} diff --git a/src/main/java/com/alttd/afkdectector/trackers/SuspiciousKickTracker.java b/src/main/java/com/alttd/afkdectector/trackers/SuspiciousKickTracker.java new file mode 100644 index 0000000..84da169 --- /dev/null +++ b/src/main/java/com/alttd/afkdectector/trackers/SuspiciousKickTracker.java @@ -0,0 +1,29 @@ +package com.alttd.afkdectector.trackers; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class SuspiciousKickTracker { + + private static SuspiciousKickTracker instance = null; + + public static SuspiciousKickTracker getInstance() { + if (instance == null) + instance = new SuspiciousKickTracker(); + return instance; + } + + Map suspiciousKicksCount = new HashMap<>(); + + public synchronized void addSuspiciousKick(UUID uuid) { + if (suspiciousKicksCount.containsKey(uuid)) + suspiciousKicksCount.put(uuid, suspiciousKicksCount.get(uuid) + 1); + else + suspiciousKicksCount.put(uuid, 1); + } + + public synchronized int getSuspiciousKickCount(UUID uuid) { + return suspiciousKicksCount.getOrDefault(uuid, 0); + } +}