From 0bc95fa61eaaeb8783d48f4fb2643830bb135641 Mon Sep 17 00:00:00 2001
From: Adam <Adam@sigterm.info>
Date: Thu, 4 Jun 2020 12:12:55 -0400
Subject: [PATCH] ge plugin: ignore offers being cleared on logout

---
 .../grandexchange/GrandExchangePlugin.java    |  7 +++++++
 .../GrandExchangePluginTest.java              | 19 +++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java
index 8e5e0793ce4..9de2574fc77 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangePlugin.java
@@ -377,6 +377,13 @@ public void onGrandExchangeOfferChanged(GrandExchangeOfferChanged offerEvent)
 		final int slot = offerEvent.getSlot();
 		final GrandExchangeOffer offer = offerEvent.getOffer();
 
+		if (offer.getState() == GrandExchangeOfferState.EMPTY && client.getGameState() != GameState.LOGGED_IN)
+		{
+			// Trades are cleared by the client during LOGIN_SCREEN/HOPPING/LOGGING_IN, ignore those so we don't
+			// zero and re-submit the trade on login as an update
+			return;
+		}
+
 		log.debug("GE offer updated: state: {}, slot: {}, item: {}, qty: {}, login: {}",
 			offer.getState(), slot, offer.getItemId(), offer.getQuantitySold(), loginBurstGeUpdates);
 
diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java
index 4b513f4fa22..1f7e4d19931 100644
--- a/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java
+++ b/runelite-client/src/test/java/net/runelite/client/plugins/grandexchange/GrandExchangePluginTest.java
@@ -33,10 +33,12 @@
 import java.util.concurrent.ScheduledExecutorService;
 import javax.inject.Inject;
 import net.runelite.api.Client;
+import net.runelite.api.GameState;
 import net.runelite.api.GrandExchangeOffer;
 import net.runelite.api.GrandExchangeOfferState;
 import net.runelite.api.ItemID;
 import net.runelite.api.WorldType;
+import net.runelite.api.events.GrandExchangeOfferChanged;
 import net.runelite.client.Notifier;
 import net.runelite.client.account.SessionManager;
 import net.runelite.client.config.ConfigManager;
@@ -55,6 +57,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.ArgumentCaptor;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
 import org.mockito.Mock;
 import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
@@ -218,4 +221,20 @@ public void testCancelTrade()
 		assertEquals(10, trade.getTotal());
 		assertEquals(25, trade.getSpent());
 	}
+
+	@Test
+	public void testHop()
+	{
+		when(client.getGameState()).thenReturn(GameState.HOPPING);
+
+		GrandExchangeOffer grandExchangeOffer = mock(GrandExchangeOffer.class);
+		when(grandExchangeOffer.getState()).thenReturn(GrandExchangeOfferState.EMPTY);
+
+		GrandExchangeOfferChanged grandExchangeOfferChanged = new GrandExchangeOfferChanged();
+		grandExchangeOfferChanged.setOffer(grandExchangeOffer);
+
+		grandExchangePlugin.onGrandExchangeOfferChanged(grandExchangeOfferChanged);
+
+		verify(configManager, never()).unsetConfiguration(anyString(), anyString());
+	}
 }
\ No newline at end of file