diff --git a/Plan/src/main/java/com/djrapitops/plan/system/afk/AFKTracker.java b/Plan/src/main/java/com/djrapitops/plan/system/afk/AFKTracker.java index 4b83be613..3ddc56a5e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/afk/AFKTracker.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/afk/AFKTracker.java @@ -5,10 +5,7 @@ import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plugin.api.TimeAmount; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; +import java.util.*; /** * Keeps track how long player has been afk during a session @@ -17,35 +14,49 @@ import java.util.UUID; */ public class AFKTracker { + private final Set usedAFKCommand; private final Map lastMovement; private final long afkThresholdMs; public AFKTracker() { + usedAFKCommand = new HashSet<>(); lastMovement = new HashMap<>(); afkThresholdMs = Settings.AFK_THRESHOLD_MINUTES.getNumber() * TimeAmount.MINUTE.ms(); } + public void usedAfkCommand(UUID uuid, long time) { + usedAFKCommand.add(uuid); + lastMovement.put(uuid, time - afkThresholdMs); + } + public void performedAction(UUID uuid, long time) { Long lastMoved = lastMovement.getOrDefault(uuid, time); lastMovement.put(uuid, time); - if (time - lastMoved < afkThresholdMs) { - // Threshold not crossed, no action required. - return; - } + try { + if (time - lastMoved < afkThresholdMs) { + // Threshold not crossed, no action required. + return; + } - long timeAFK = time - lastMoved; + long removeAfkCommandEffect = usedAFKCommand.contains(uuid) ? afkThresholdMs : 0; + long timeAFK = time - lastMoved - removeAfkCommandEffect; - Optional cachedSession = SessionCache.getCachedSession(uuid); - if (!cachedSession.isPresent()) { - return; + + Optional cachedSession = SessionCache.getCachedSession(uuid); + if (!cachedSession.isPresent()) { + return; + } + Session session = cachedSession.get(); + session.addAFKTime(timeAFK); + } finally { + usedAFKCommand.remove(uuid); } - Session session = cachedSession.get(); - session.addAFKTime(timeAFK); } public void loggedOut(UUID uuid, long time) { performedAction(uuid, time); lastMovement.remove(uuid); + usedAFKCommand.remove(uuid); } } \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/listeners/bukkit/AFKListener.java b/Plan/src/main/java/com/djrapitops/plan/system/listeners/bukkit/AFKListener.java index 56c888caa..345e6e0c2 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/listeners/bukkit/AFKListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/listeners/bukkit/AFKListener.java @@ -49,6 +49,11 @@ public class AFKListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onPlayerCommand(PlayerCommandPreprocessEvent event) { event(event); + boolean isAfkCommand = event.getMessage().substring(1).toLowerCase().startsWith("afk"); + if (isAfkCommand) { + UUID uuid = event.getPlayer().getUniqueId(); + AFK_TRACKER.usedAfkCommand(uuid, System.currentTimeMillis()); + } } } \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeAFKListener.java b/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeAFKListener.java index e0de43a50..7aca42349 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeAFKListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeAFKListener.java @@ -57,6 +57,10 @@ public class SpongeAFKListener { UUID uuid = player.getUniqueId(); long time = System.currentTimeMillis(); AFK_TRACKER.performedAction(uuid, time); + boolean isAfkCommand = event.getCommand().toLowerCase().startsWith("afk"); + if (isAfkCommand) { + AFK_TRACKER.usedAfkCommand(uuid, System.currentTimeMillis()); + } } @Listener(order = Order.POST)