From 4e4657e3afa3db9968afb4fabbabb138028ceb92 Mon Sep 17 00:00:00 2001 From: g-mason0 <19415334+g-mason0@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:13:02 -0500 Subject: [PATCH 1/2] fix(login): wasLoggedIn is now properly tracked in-order to statisfy on login initalization --- .../plugins/microbot/MicrobotPlugin.java | 6 +++--- .../microbot/util/security/LoginManager.java | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotPlugin.java index 2a75a27d809..16f46397145 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/MicrobotPlugin.java @@ -50,7 +50,6 @@ import java.awt.image.BufferedImage; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -304,7 +303,7 @@ public void onGameStateChanged(GameStateChanged gameStateChanged) final Client client = Microbot.getClient(); if (client != null) { int[] currentRegions = client.getTopLevelWorldView().getMapRegions(); - boolean wasLoggedIn = LoginManager.isLoggedIn(); + boolean wasLoggedIn = LoginManager.getLastKnownGameState() == GameState.LOGGED_IN; if (!wasLoggedIn) { LoginManager.markLoggedIn(); Rs2RunePouch.fullUpdate(); @@ -315,7 +314,6 @@ public void onGameStateChanged(GameStateChanged gameStateChanged) if (currentRegions != null) { Microbot.setLastKnownRegions(currentRegions.clone()); } - LoginManager.markLoggedIn(); } } if (gameStateChanged.getGameState() == GameState.HOPPING || gameStateChanged.getGameState() == GameState.LOGIN_SCREEN || gameStateChanged.getGameState() == GameState.CONNECTION_LOST) @@ -329,6 +327,8 @@ public void onGameStateChanged(GameStateChanged gameStateChanged) } Microbot.setLastKnownRegions(null); } + // update last known game state to track login/logout transitions + LoginManager.setLastKnownGameState(gameStateChanged.getGameState()); } @Subscribe diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/security/LoginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/security/LoginManager.java index 865e1247d1c..a3f49a4ad4a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/security/LoginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/security/LoginManager.java @@ -39,21 +39,28 @@ public final class LoginManager { private static final Object LOGIN_LOCK = new Object(); private static final AtomicBoolean LOGIN_ATTEMPT_ACTIVE = new AtomicBoolean(false); private static final AtomicReference LAST_LOGIN_ATTEMPT = new AtomicReference<>(null); + private static final AtomicReference LAST_KNOWN_GAME_STATE = new AtomicReference<>(GameState.UNKNOWN); @Getter - private static Instant lastLoginTimestamp = null; - + private static AtomicReference lastLoginTimestamp = new AtomicReference<>(null); @Setter public static ConfigProfile activeProfile = null; public static ConfigProfile getActiveProfile() { return Microbot.getConfigManager().getProfile(); + } + + public static GameState getLastKnownGameState() { + return LAST_KNOWN_GAME_STATE.get(); + } + public static void setLastKnownGameState(GameState gameState) { + LAST_KNOWN_GAME_STATE.set(gameState); } private LoginManager() { - // Utility class + throw new IllegalStateException("Unable to instantiate utility class"); } /** @@ -86,7 +93,7 @@ public static void markLoggedIn() { // Only set timestamp if client reports logged in. if (isLoggedIn()) { LOGIN_ATTEMPT_ACTIVE.set(false); - lastLoginTimestamp = Instant.now(); + lastLoginTimestamp.set(Instant.now()); } } @@ -101,10 +108,10 @@ public static void markLoggedOut() { * Returns the duration the account has been logged in for. Equivalent to Microbot.getLoginTime(). */ public static Duration getLoginDuration() { - if (lastLoginTimestamp == null || !isLoggedIn()) { + if (lastLoginTimestamp.get() == null || !isLoggedIn()) { return Duration.of(0, ChronoUnit.MILLIS); } - return Duration.between(lastLoginTimestamp, Instant.now()); + return Duration.between(lastLoginTimestamp.get(), Instant.now()); } /** From 9b2528212c36842110a848d9befc5f256ef9a8ca Mon Sep 17 00:00:00 2001 From: g-mason0 <19415334+g-mason0@users.noreply.github.com> Date: Tue, 9 Dec 2025 23:30:59 -0500 Subject: [PATCH 2/2] chore(login): un-wrap atomic reference within concrete getter method, instead of using lombok to generate it. --- .../plugins/microbot/util/security/LoginManager.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/security/LoginManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/security/LoginManager.java index a3f49a4ad4a..9f21ad74a91 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/security/LoginManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/microbot/util/security/LoginManager.java @@ -41,8 +41,7 @@ public final class LoginManager { private static final AtomicReference LAST_LOGIN_ATTEMPT = new AtomicReference<>(null); private static final AtomicReference LAST_KNOWN_GAME_STATE = new AtomicReference<>(GameState.UNKNOWN); - @Getter - private static AtomicReference lastLoginTimestamp = new AtomicReference<>(null); + private static final AtomicReference lastLoginTimestamp = new AtomicReference<>(null); @Setter public static ConfigProfile activeProfile = null; @@ -51,6 +50,10 @@ public static ConfigProfile getActiveProfile() { return Microbot.getConfigManager().getProfile(); } + public static Instant getLastLoginTimestamp() { + return lastLoginTimestamp.get(); + } + public static GameState getLastKnownGameState() { return LAST_KNOWN_GAME_STATE.get(); } @@ -108,10 +111,10 @@ public static void markLoggedOut() { * Returns the duration the account has been logged in for. Equivalent to Microbot.getLoginTime(). */ public static Duration getLoginDuration() { - if (lastLoginTimestamp.get() == null || !isLoggedIn()) { + if (getLastLoginTimestamp() == null || !isLoggedIn()) { return Duration.of(0, ChronoUnit.MILLIS); } - return Duration.between(lastLoginTimestamp.get(), Instant.now()); + return Duration.between(getLastLoginTimestamp(), Instant.now()); } /**