diff --git a/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginClient.java b/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginClient.java index 0df12bf1ed..e6bda75032 100644 --- a/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginClient.java +++ b/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginClient.java @@ -25,9 +25,11 @@ package net.runelite.client.externalplugins; import com.google.common.reflect.TypeToken; +import com.google.gson.JsonSyntaxException; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; @@ -37,6 +39,7 @@ import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.util.List; +import java.util.Map; import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; @@ -172,4 +175,27 @@ public class ExternalPluginClient } }); } + + public Map getPluginCounts() throws IOException + { + HttpUrl url = RuneLiteAPI.getApiBase() + .newBuilder() + .addPathSegments("pluginhub") + .build(); + try (Response res = okHttpClient.newCall(new Request.Builder().url(url).build()).execute()) + { + if (res.code() != 200) + { + throw new IOException("Non-OK response code: " + res.code()); + } + + // CHECKSTYLE:OFF + return RuneLiteAPI.GSON.fromJson(new InputStreamReader(res.body().byteStream()), new TypeToken>(){}.getType()); + // CHECKSTYLE:ON + } + catch (JsonSyntaxException ex) + { + throw new IOException(ex); + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java index 562a8517e2..7f9bbceb05 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java @@ -125,10 +125,13 @@ class PluginHubPanel extends PluginPanel @Getter private final List keywords = new ArrayList<>(); + @Getter + private final int userCount; + @Getter private final boolean installed; - PluginItem(ExternalPluginManifest newManifest, Collection loadedPlugins, boolean installed) + PluginItem(ExternalPluginManifest newManifest, Collection loadedPlugins, int userCount, boolean installed) { ExternalPluginManifest loaded = null; if (!loadedPlugins.isEmpty()) @@ -137,6 +140,7 @@ class PluginHubPanel extends PluginPanel } manifest = newManifest == null ? loaded : newManifest; + this.userCount = userCount; this.installed = installed; if (manifest != null) @@ -194,10 +198,7 @@ class PluginHubPanel extends PluginPanel { BufferedImage img = externalPluginClient.downloadIcon(manifest); - SwingUtilities.invokeLater(() -> - { - icon.setIcon(new ImageIcon(img)); - }); + SwingUtilities.invokeLater(() -> icon.setIcon(new ImageIcon(img))); } catch (IOException e) { @@ -521,11 +522,21 @@ class PluginHubPanel extends PluginPanel return; } - reloadPluginList(manifest); + Map pluginCounts = Collections.emptyMap(); + try + { + pluginCounts = externalPluginClient.getPluginCounts(); + } + catch (IOException e) + { + log.warn("unable to download plugin counts", e); + } + + reloadPluginList(manifest, pluginCounts); }); } - private void reloadPluginList(List manifest) + private void reloadPluginList(List manifest, Map pluginCounts) { Map manifests = manifest.stream() .collect(ImmutableMap.toImmutableMap(ExternalPluginManifest::getInternalName, Function.identity())); @@ -547,7 +558,8 @@ class PluginHubPanel extends PluginPanel { plugins = Sets.union(manifests.keySet(), loadedPlugins.keySet()) .stream() - .map(id -> new PluginItem(manifests.get(id), loadedPlugins.get(id), installed.contains(id))) + .map(id -> new PluginItem(manifests.get(id), loadedPlugins.get(id), + pluginCounts.getOrDefault(id, -1), installed.contains(id))) .collect(Collectors.toList()); refreshing.setVisible(false); @@ -575,7 +587,11 @@ class PluginHubPanel extends PluginPanel else { stream - .sorted(Comparator.comparing(PluginItem::isInstalled).thenComparing(p -> p.manifest.getDisplayName())) + .sorted(Comparator.comparing(PluginItem::isInstalled) + .thenComparingInt(PluginItem::getUserCount) + .reversed() + .thenComparing(p -> p.manifest.getDisplayName()) + ) .forEach(mainPanel::add); } @@ -594,6 +610,13 @@ class PluginHubPanel extends PluginPanel @Subscribe private void onExternalPluginsChanged(ExternalPluginsChanged ev) { - SwingUtilities.invokeLater(() -> reloadPluginList(ev.getLoadedManifest())); + Map pluginCounts = Collections.emptyMap(); + if (plugins != null) + { + pluginCounts = plugins.stream() + .collect(Collectors.toMap(pi -> pi.manifest.getInternalName(), PluginItem::getUserCount)); + } + + reloadPluginList(ev.getLoadedManifest(), pluginCounts); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java index 382282b92e..286b534877 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginListPanel.java @@ -32,7 +32,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.concurrent.ScheduledExecutorService; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.inject.Inject; @@ -108,7 +107,6 @@ class PluginListPanel extends PluginPanel ConfigManager configManager, PluginManager pluginManager, ExternalPluginManager externalPluginManager, - ScheduledExecutorService executorService, EventBus eventBus, Provider configPanelProvider, Provider pluginHubPanelProvider) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java index a75aa8c2eb..cfed06e255 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingPlugin.java @@ -124,9 +124,9 @@ public class CookingPlugin extends Plugin } Duration statTimeout = Duration.ofMinutes(config.statTimeout()); - Duration sinceCut = Duration.between(session.getLastCookingAction(), Instant.now()); + Duration sinceCooked = Duration.between(session.getLastCookingAction(), Instant.now()); - if (sinceCut.compareTo(statTimeout) >= 0) + if (sinceCooked.compareTo(statTimeout) >= 0) { session = null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java index dbd1db7ddd..e2a69bec33 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/GroundItemsOverlay.java @@ -58,7 +58,6 @@ import net.runelite.client.ui.overlay.components.BackgroundComponent; import net.runelite.client.ui.overlay.components.ProgressPieComponent; import net.runelite.client.ui.overlay.components.TextComponent; import net.runelite.client.util.QuantityFormatter; -import org.apache.commons.lang3.ArrayUtils; public class GroundItemsOverlay extends Overlay { @@ -78,6 +77,10 @@ public class GroundItemsOverlay extends Overlay private static final Duration DESPAWN_TIME_DROP = Duration.ofMinutes(3); private static final int KRAKEN_REGION = 9116; private static final int KBD_NMZ_REGION = 9033; + private static final int ZILYANA_REGION = 11602; + private static final int GRAARDOR_REGION = 11347; + private static final int KRIL_TSUTSAROTH_REGION = 11603; + private static final int KREEARRA_REGION = 11346; private final Client client; private final GroundItemsPlugin plugin; @@ -410,35 +413,31 @@ public class GroundItemsOverlay extends Overlay return null; } - Instant despawnTime; + final Instant despawnTime; Instant now = Instant.now(); if (client.isInInstancedRegion()) { - // Items in the Kraken instance appear to never despawn? - if (isInKraken()) + final int playerRegionID = WorldPoint.fromLocalInstance(client, client.getLocalPlayer().getLocalLocation()).getRegionID(); + if (playerRegionID == KRAKEN_REGION) { + // Items in the Kraken instance never despawn return null; } - else if (isInKBDorNMZ()) + else if (playerRegionID == KBD_NMZ_REGION) { // NMZ and the KBD lair uses the same region ID but NMZ uses planes 1-3 and KBD uses plane 0 if (client.getLocalPlayer().getWorldLocation().getPlane() == 0) { // Items in the KBD instance use the standard despawn timer - if (groundItem.getLootType() == LootType.DROPPED) - { - despawnTime = spawnTime.plus(DESPAWN_TIME_DROP); - } - else - { - despawnTime = spawnTime.plus(DESPAWN_TIME_LOOT); - } + despawnTime = spawnTime.plus(groundItem.getLootType() == LootType.DROPPED + ? DESPAWN_TIME_DROP + : DESPAWN_TIME_LOOT); } else { - // Dropped items in the NMZ instance appear to never despawn? if (groundItem.getLootType() == LootType.DROPPED) { + // Dropped items in the NMZ instance never despawn return null; } else @@ -447,6 +446,14 @@ public class GroundItemsOverlay extends Overlay } } } + else if (playerRegionID == ZILYANA_REGION || playerRegionID == GRAARDOR_REGION || + playerRegionID == KRIL_TSUTSAROTH_REGION || playerRegionID == KREEARRA_REGION) + { + // GWD instances use the normal despawn timers + despawnTime = spawnTime.plus(groundItem.getLootType() == LootType.DROPPED + ? DESPAWN_TIME_DROP + : DESPAWN_TIME_LOOT); + } else { despawnTime = spawnTime.plus(DESPAWN_TIME_INSTANCE); @@ -454,14 +461,9 @@ public class GroundItemsOverlay extends Overlay } else { - if (groundItem.getLootType() == LootType.DROPPED) - { - despawnTime = spawnTime.plus(DESPAWN_TIME_DROP); - } - else - { - despawnTime = spawnTime.plus(DESPAWN_TIME_LOOT); - } + despawnTime = spawnTime.plus(groundItem.getLootType() == LootType.DROPPED + ? DESPAWN_TIME_DROP + : DESPAWN_TIME_LOOT); } if (now.isBefore(spawnTime) || now.isAfter(despawnTime)) @@ -561,14 +563,4 @@ public class GroundItemsOverlay extends Overlay } } - - private boolean isInKraken() - { - return ArrayUtils.contains(client.getMapRegions(), KRAKEN_REGION); - } - - private boolean isInKBDorNMZ() - { - return ArrayUtils.contains(client.getMapRegions(), KBD_NMZ_REGION); - } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java index 5d6c86a445..2efd088235 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java @@ -71,9 +71,9 @@ public class MotherlodeGemOverlay extends OverlayPanel } Duration statTimeout = Duration.ofMinutes(config.statTimeout()); - Duration sinceCut = Duration.between(session.getLastGemFound(), Instant.now()); + Duration sinceLastGem = Duration.between(session.getLastGemFound(), Instant.now()); - if (sinceCut.compareTo(statTimeout) >= 0) + if (sinceLastGem.compareTo(statTimeout) >= 0) { return null; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java index 62e399369e..4a6e040f26 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java @@ -86,9 +86,9 @@ class MotherlodeOverlay extends OverlayPanel } Duration statTimeout = Duration.ofMinutes(config.statTimeout()); - Duration sinceCut = Duration.between(session.getLastPayDirtMined(), Instant.now()); + Duration sinceLastPayDirt = Duration.between(session.getLastPayDirtMined(), Instant.now()); - if (sinceCut.compareTo(statTimeout) >= 0) + if (sinceLastPayDirt.compareTo(statTimeout) >= 0) { return null; }