ge plugin: better handle trades updating on login

After login there are two sets of offer updates, I suspect the first is
from the server and the second is from the ge server - this also flags
ge server trade updates as on login. To do this we assume it always
happens in the first few ticks after the login burst.
This commit is contained in:
Adam
2020-12-25 14:57:56 -05:00
parent 85a953e76b
commit ffebb9cf0c
2 changed files with 112 additions and 20 deletions

View File

@@ -29,15 +29,19 @@ import com.google.inject.testing.fieldbinder.Bind;
import com.google.inject.testing.fieldbinder.BoundFieldModule;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.ItemComposition;
import net.runelite.api.ItemID;
import net.runelite.api.WorldType;
import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GrandExchangeOfferChanged;
import net.runelite.client.Notifier;
import net.runelite.client.account.SessionManager;
@@ -52,14 +56,18 @@ import net.runelite.http.api.ge.GrandExchangeClient;
import net.runelite.http.api.ge.GrandExchangeTrade;
import net.runelite.http.api.osbuddy.OSBGrandExchangeClient;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import org.mockito.Mock;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -243,4 +251,82 @@ public class GrandExchangePluginTest
verify(configManager, never()).unsetRSProfileConfiguration(anyString(), anyString());
}
@Test
public void testLogin()
{
GrandExchangePanel panel = mock(GrandExchangePanel.class);
when(panel.getOffersPanel()).thenReturn(mock(GrandExchangeOffersPanel.class));
grandExchangePlugin.setPanel(panel);
when(itemManager.getItemComposition(anyInt())).thenReturn(mock(ItemComposition.class));
// provide config support so getOffer and setOffer work
final Map<String, Object> config = new HashMap<>();
doAnswer(a ->
{
Object[] arguments = a.getArguments();
config.put((String) arguments[1], arguments[2]);
return null;
}).when(configManager).setRSProfileConfiguration(eq("geoffer"), anyString(), anyString());
when(configManager.getRSProfileConfiguration(eq("geoffer"), anyString())).thenAnswer(a ->
{
Object[] arguments = a.getArguments();
return config.get((String) arguments[1]);
});
// set loginBurstGeUpdates
GameStateChanged gameStateChanged = new GameStateChanged();
gameStateChanged.setGameState(GameState.LOGIN_SCREEN);
grandExchangePlugin.onGameStateChanged(gameStateChanged);
// 8x buy 10 whip @ 1k ea, bought 1 sofar.
for (int i = 0; i < GrandExchangePlugin.GE_SLOTS; ++i)
{
GrandExchangeOffer grandExchangeOffer = mock(GrandExchangeOffer.class);
when(grandExchangeOffer.getQuantitySold()).thenReturn(1);
when(grandExchangeOffer.getItemId()).thenReturn(ItemID.ABYSSAL_WHIP);
when(grandExchangeOffer.getTotalQuantity()).thenReturn(10);
when(grandExchangeOffer.getPrice()).thenReturn(1000);
when(grandExchangeOffer.getSpent()).thenReturn(1000);
when(grandExchangeOffer.getState()).thenReturn(GrandExchangeOfferState.SELLING);
GrandExchangeOfferChanged grandExchangeOfferChanged = new GrandExchangeOfferChanged();
grandExchangeOfferChanged.setSlot(i);
grandExchangeOfferChanged.setOffer(grandExchangeOffer);
grandExchangePlugin.onGrandExchangeOfferChanged(grandExchangeOfferChanged);
}
// Now send update for one of the slots
GrandExchangeOffer grandExchangeOffer = mock(GrandExchangeOffer.class);
when(grandExchangeOffer.getQuantitySold()).thenReturn(2);
when(grandExchangeOffer.getItemId()).thenReturn(ItemID.ABYSSAL_WHIP);
when(grandExchangeOffer.getTotalQuantity()).thenReturn(10);
when(grandExchangeOffer.getPrice()).thenReturn(1000);
when(grandExchangeOffer.getSpent()).thenReturn(2000);
when(grandExchangeOffer.getState()).thenReturn(GrandExchangeOfferState.SELLING);
GrandExchangeOfferChanged grandExchangeOfferChanged = new GrandExchangeOfferChanged();
grandExchangeOfferChanged.setSlot(2);
grandExchangeOfferChanged.setOffer(grandExchangeOffer);
grandExchangePlugin.onGrandExchangeOfferChanged(grandExchangeOfferChanged);
// verify trade update
ArgumentCaptor<GrandExchangeTrade> captor = ArgumentCaptor.forClass(GrandExchangeTrade.class);
verify(grandExchangeClient).submit(captor.capture());
GrandExchangeTrade trade = captor.getValue();
assertFalse(trade.isBuy());
assertEquals(ItemID.ABYSSAL_WHIP, trade.getItemId());
assertEquals(2, trade.getQty());
assertEquals(1, trade.getDqty());
assertEquals(10, trade.getTotal());
assertEquals(1000, trade.getDspent());
assertEquals(2000, trade.getSpent());
assertEquals(1000, trade.getOffer());
assertEquals(2, trade.getSlot());
assertTrue(trade.isLogin());
}
}