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.AFKListCommand;
|
||||||
import com.alttd.afkdectector.command.ReloadCommand;
|
import com.alttd.afkdectector.command.ReloadCommand;
|
||||||
import com.alttd.afkdectector.config.Config;
|
import com.alttd.afkdectector.config.Config;
|
||||||
|
import com.alttd.afkdectector.config.Messages;
|
||||||
import com.alttd.afkdectector.config.MessagesConfig;
|
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.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.Bukkit;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
@ -22,8 +28,10 @@ import org.bukkit.scoreboard.Scoreboard;
|
||||||
import org.bukkit.scoreboard.ScoreboardManager;
|
import org.bukkit.scoreboard.ScoreboardManager;
|
||||||
import org.bukkit.scoreboard.Team;
|
import org.bukkit.scoreboard.Team;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class AFKDetector extends JavaPlugin implements Listener{
|
public class AFKDetector extends JavaPlugin implements Listener{
|
||||||
|
|
||||||
|
|
@ -117,11 +125,25 @@ public class AFKDetector extends JavaPlugin implements Listener{
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onJoin(PlayerJoinEvent event) {
|
public void onJoin(PlayerJoinEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
PlayerAfkTime.put(player.getUniqueId(), getPlayerAfktime(player));
|
UUID uuid = player.getUniqueId();
|
||||||
players.put(player.getUniqueId(), new AFKPlayer(player, this));
|
PlayerAfkTime.put(uuid, getPlayerAfktime(player));
|
||||||
|
players.put(uuid, new AFKPlayer(player, this));
|
||||||
if(Bukkit.getOnlinePlayers().size() >= Config.PLAYERLIMIT && !Config.SERVERFULL) {
|
if(Bukkit.getOnlinePlayers().size() >= Config.PLAYERLIMIT && !Config.SERVERFULL) {
|
||||||
fulloverride = true;
|
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
|
@EventHandler
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
package com.alttd.afkdectector;
|
package com.alttd.afkdectector;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import com.alttd.afkdectector.afkplayer.AFKPlayer;
|
import com.alttd.afkdectector.afkplayer.AFKPlayer;
|
||||||
import com.alttd.afkdectector.config.Config;
|
import com.alttd.afkdectector.config.Config;
|
||||||
import com.alttd.afkdectector.config.Messages;
|
import com.alttd.afkdectector.config.Messages;
|
||||||
|
import com.alttd.afkdectector.trackers.AutoJoinTracker;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
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()));
|
//Bukkit.dispatchCommand(Bukkit.getConsoleSender(), plugin.kickCommand.replace("%player%", player.getName()));
|
||||||
plugin.messageTimers.remove(player.getUniqueId());
|
plugin.messageTimers.remove(player.getUniqueId());
|
||||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), return_placeholders(Config.KICKCOMMAND, player));
|
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), return_placeholders(Config.KICKCOMMAND, player));
|
||||||
|
AutoJoinTracker.getInstance().addKick(player.getUniqueId(), new Date().getTime());
|
||||||
TagResolver templates = TagResolver.resolver(
|
TagResolver templates = TagResolver.resolver(
|
||||||
Placeholder.unparsed("player", player.getName()),
|
Placeholder.unparsed("player", player.getName()),
|
||||||
Placeholder.unparsed("afk_time", "" + afkPlayer.getafkTime())
|
Placeholder.unparsed("afk_time", "" + afkPlayer.getafkTime())
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ public class Config extends AbstractConfiguration {
|
||||||
public static int COMMANDCOOLDOWWN = 60;
|
public static int COMMANDCOOLDOWWN = 60;
|
||||||
public static boolean AFKTOGGLEMESSAGES = true;
|
public static boolean AFKTOGGLEMESSAGES = true;
|
||||||
public static boolean NOTIFYSTAFFONAFKKIC = true;
|
public static boolean NOTIFYSTAFFONAFKKIC = true;
|
||||||
|
public static int MAXREJOINFORTRACKING = 30;
|
||||||
private static void playerSettings() {
|
private static void playerSettings() {
|
||||||
SLEEPIGNORE = config.getBoolean("player.sleep", SLEEPIGNORE);
|
SLEEPIGNORE = config.getBoolean("player.sleep", SLEEPIGNORE);
|
||||||
RADIUS = config.getInt("player.radius", RADIUS);
|
RADIUS = config.getInt("player.radius", RADIUS);
|
||||||
|
|
@ -49,6 +50,7 @@ public class Config extends AbstractConfiguration {
|
||||||
COMMANDCOOLDOWWN = config.getInt("player.commandcooldown", COMMANDCOOLDOWWN);
|
COMMANDCOOLDOWWN = config.getInt("player.commandcooldown", COMMANDCOOLDOWWN);
|
||||||
AFKTOGGLEMESSAGES = config.getBoolean("player.afk-toggle-messages", AFKTOGGLEMESSAGES);
|
AFKTOGGLEMESSAGES = config.getBoolean("player.afk-toggle-messages", AFKTOGGLEMESSAGES);
|
||||||
NOTIFYSTAFFONAFKKIC = config.getBoolean("player.notify-staff-on-afk-kick", NOTIFYSTAFFONAFKKIC);
|
NOTIFYSTAFFONAFKKIC = config.getBoolean("player.notify-staff-on-afk-kick", NOTIFYSTAFFONAFKKIC);
|
||||||
|
MAXREJOINFORTRACKING = config.getInt("tracking.max-seconds-for-tracking", MAXREJOINFORTRACKING);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean COUNTDOWNENABLED = false;
|
public static boolean COUNTDOWNENABLED = false;
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,8 @@ public enum Messages {
|
||||||
AFKCHECKTITLE("afkcheck-title", "AFK CHECK"),
|
AFKCHECKTITLE("afkcheck-title", "AFK CHECK"),
|
||||||
AFKCHECKSUBTITLE("afkcheck-subtitle", "Please respond to the dm from staff!"),
|
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."),
|
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 final String key;
|
||||||
public String message;
|
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