Added a way to track how often players relog within 30 seconds of being afk kicked

This commit is contained in:
Stijn 2022-08-31 21:25:49 +02:00
parent 14f45d2d82
commit 4f973fa951
6 changed files with 86 additions and 3 deletions

View File

@ -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

View File

@ -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())

View File

@ -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;

View File

@ -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", "<gold><player> got afk kicked after being marked as afk for <afk_time> minutes.");
AFKICKSTAFFMESSAGE("afkkick-staff-messsge", "<gold><player> got afk kicked after being marked as afk for <afk_time> minutes."),
SUSPICIOUSKICKCOUNT("afkkick-suspicious-message", "<gold><player> has had <count> suspicious AFK kicks since last reboot.");
public final String key;
public String message;

View File

@ -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<UUID, Long> 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);
}
}

View File

@ -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<UUID, Integer> 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);
}
}