diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java index 8691cae1d3..f6e758043c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsPlugin.java @@ -28,6 +28,7 @@ package net.runelite.client.plugins.grounditems; import com.google.common.cache.CacheBuilder; import com.google.common.cache.LoadingCache; import com.google.common.collect.EvictingQueue; +import com.google.common.collect.ImmutableMap; import com.google.inject.Provides; import java.awt.Color; import java.awt.Rectangle; @@ -41,6 +42,7 @@ import java.util.List; import java.util.Map; import java.util.Queue; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import lombok.AccessLevel; @@ -161,9 +163,12 @@ public class GroundItemsPlugin extends Plugin @Inject private Notifier notifier; + @Inject + private ScheduledExecutorService executor; + @Getter private final Map collectedGroundItems = new LinkedHashMap<>(); - private final Map priceChecks = new LinkedHashMap<>(); + private Map priceChecks = ImmutableMap.of(); private LoadingCache highlightedItems; private LoadingCache hiddenItems; private final Queue droppedItemQueue = EvictingQueue.create(16); // recently dropped items @@ -178,9 +183,9 @@ public class GroundItemsPlugin extends Plugin protected void startUp() { overlayManager.add(overlay); - reset(); mouseManager.registerMouseListener(inputListener); keyManager.registerKeyListener(inputListener); + executor.execute(this::reset); } @Override @@ -203,7 +208,7 @@ public class GroundItemsPlugin extends Plugin { if (event.getGroup().equals("grounditems")) { - reset(); + executor.execute(this::reset); } } @@ -429,32 +434,33 @@ public class GroundItemsPlugin extends Plugin .build(new WildcardMatchLoader(hiddenItemList)); // Cache colors - priceChecks.clear(); - + ImmutableMap.Builder priceCheckBuilder = ImmutableMap.builder(); if (config.getHighlightOverValue() > 0) { - priceChecks.put(config.getHighlightOverValue(), config.highlightedColor()); + priceCheckBuilder.put(config.getHighlightOverValue(), config.highlightedColor()); } if (config.insaneValuePrice() > 0) { - priceChecks.put(config.insaneValuePrice(), config.insaneValueColor()); + priceCheckBuilder.put(config.insaneValuePrice(), config.insaneValueColor()); } if (config.highValuePrice() > 0) { - priceChecks.put(config.highValuePrice(), config.highValueColor()); + priceCheckBuilder.put(config.highValuePrice(), config.highValueColor()); } if (config.mediumValuePrice() > 0) { - priceChecks.put(config.mediumValuePrice(), config.mediumValueColor()); + priceCheckBuilder.put(config.mediumValuePrice(), config.mediumValueColor()); } if (config.lowValuePrice() > 0) { - priceChecks.put(config.lowValuePrice(), config.lowValueColor()); + priceCheckBuilder.put(config.lowValuePrice(), config.lowValueColor()); } + + priceChecks = priceCheckBuilder.build(); } @Subscribe diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/ItemThreshold.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/ItemThreshold.java index b92522bc1f..d19473d47d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/ItemThreshold.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/ItemThreshold.java @@ -25,8 +25,6 @@ package net.runelite.client.plugins.grounditems; import com.google.common.base.Strings; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import lombok.Value; @Value @@ -38,8 +36,6 @@ class ItemThreshold MORE_THAN } - private static final Pattern QUANTITY_THRESHOLD_PATTERN = Pattern.compile("(.+)(<|>)\\s*(\\d+)"); - private final String itemName; private final int quantity; private final Inequality inequality; @@ -51,19 +47,40 @@ class ItemThreshold return null; } - Matcher matcher = QUANTITY_THRESHOLD_PATTERN.matcher(entry); + Inequality operator = Inequality.MORE_THAN; + int qty = 0; - if (matcher.find()) + for (int i = entry.length() - 1; i >= 0; i--) { - String name = matcher.group(1).trim(); - String sign = matcher.group(2); - int quantity = Integer.parseInt(matcher.group(3)); - Inequality inequality = sign.equals("<") ? Inequality.LESS_THAN : Inequality.MORE_THAN; - - return new ItemThreshold(name, quantity, inequality); + char c = entry.charAt(i); + if (c >= '0' && c <= '9' || Character.isWhitespace(c)) + { + continue; + } + switch (c) + { + case '<': + operator = Inequality.LESS_THAN; + // fallthrough + case '>': + if (i + 1 < entry.length()) + { + try + { + qty = Integer.parseInt(entry.substring(i + 1).trim()); + } + catch (NumberFormatException e) + { + qty = 0; + operator = Inequality.MORE_THAN; + } + entry = entry.substring(0, i); + } + } + break; } - return new ItemThreshold(entry, 0, Inequality.MORE_THAN); + return new ItemThreshold(entry.trim(), qty, operator); } boolean quantityHolds(int itemCount) diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/ItemThresholdTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/ItemThresholdTest.java new file mode 100644 index 0000000000..3456eed65d --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/ItemThresholdTest.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2020 Abex + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.grounditems; + +import joptsimple.internal.Strings; +import org.junit.Assert; +import static net.runelite.client.plugins.grounditems.ItemThreshold.Inequality.*; +import org.junit.Test; + +public class ItemThresholdTest +{ + @Test + public void test() + { + Assert.assertEquals(ItemThreshold.fromConfigEntry("Dharok's platebody 100"), new ItemThreshold("Dharok's platebody 100", 0, MORE_THAN)); + Assert.assertEquals(ItemThreshold.fromConfigEntry("Dharok's platebody 100<100"), new ItemThreshold("Dharok's platebody 100", 100, LESS_THAN)); + Assert.assertEquals(ItemThreshold.fromConfigEntry("Dharok's platebody > 100"), new ItemThreshold("Dharok's platebody", 100, MORE_THAN)); + Assert.assertEquals(ItemThreshold.fromConfigEntry("Dharok's platebody < 10 0"), new ItemThreshold("Dharok's platebody", 0, MORE_THAN)); + } + + @Test(timeout = 100) + public void testExplosive() + { + String name = "archer" + Strings.repeat('e', 50000) + "s ring"; + Assert.assertEquals(ItemThreshold.fromConfigEntry(name + " < 387"), new ItemThreshold(name, 387, LESS_THAN)); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/WildcardMatchLoaderTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/WildcardMatchLoaderTest.java index a7ade4c7d5..6f994946c9 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/WildcardMatchLoaderTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/grounditems/WildcardMatchLoaderTest.java @@ -25,6 +25,7 @@ package net.runelite.client.plugins.grounditems; import java.util.Arrays; +import joptsimple.internal.Strings; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -53,4 +54,13 @@ public class WildcardMatchLoaderTest assertFalse(loader.load(new NamedQuantity("Abyssal dagger", 1))); assertTrue(loader.load(new NamedQuantity("Rune Longsword", 2))); } + + @Test(timeout = 1000) + public void testExplosive() + { + String name = "archer" + Strings.repeat('e', 50000) + "s ring"; + WildcardMatchLoader loader = new WildcardMatchLoader(Arrays.asList(name + "* < 100")); + assertTrue(loader.load(new NamedQuantity(name, 50))); + assertFalse(loader.load(new NamedQuantity(name, 150))); + } }