Added a way to track how often players relog within 30 seconds of being afk kicked
This commit is contained in:
parent
14f45d2d82
commit
4f973fa951
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user