From 786e2bb7295b1924313d4bbecd90cf62155513ea Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 04:16:48 +0200 Subject: [PATCH 1/8] http-api: Run http calls on the IO thread --- .../client/plugins/chatcommands/ChatCommandsPlugin.java | 2 +- .../java/net/runelite/client/plugins/examine/ExaminePlugin.java | 2 +- .../client/plugins/grandexchange/GrandExchangePlugin.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index 4c411000a4..489a9e21db 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -827,7 +827,7 @@ public class ChatCommandsPlugin extends Plugin { ItemPrice item = retrieveFromList(results, search); CLIENT.lookupItem(item.getId()) - .subscribeOn(Schedulers.single()) + .subscribeOn(Schedulers.io()) .subscribe( (osbresult) -> clientThread.invoke(() -> diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java index 3cdf71dff4..63a2429419 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java @@ -370,7 +370,7 @@ public class ExaminePlugin extends Plugin { int finalQuantity = quantity; CLIENT.lookupItem(id) - .subscribeOn(Schedulers.single()) + .subscribeOn(Schedulers.io()) .subscribe( (osbresult) -> clientThread.invoke(() -> 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 9fc24c8bab..eb0605d440 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 @@ -551,7 +551,7 @@ public class GrandExchangePlugin extends Plugin } CLIENT.lookupItem(itemId) - .subscribeOn(Schedulers.single()) + .subscribeOn(Schedulers.io()) .subscribe( (osbresult) -> clientThread.invoke(() -> From baa338e5333ac31b279db5fe15e3c61d01161b14 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 04:17:11 +0200 Subject: [PATCH 2/8] client: ClientThread implements executor --- .../net/runelite/client/callback/ClientThread.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java index 805b7a5620..8935c8118e 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/ClientThread.java @@ -27,14 +27,16 @@ package net.runelite.client.callback; import com.google.inject.Inject; import java.util.Iterator; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.Executor; import java.util.function.BooleanSupplier; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import org.jetbrains.annotations.NotNull; @Singleton @Slf4j -public class ClientThread +public class ClientThread implements Executor { private final ConcurrentLinkedQueue invokes = new ConcurrentLinkedQueue<>(); @@ -112,4 +114,14 @@ public class ClientThread } } } + + @Override + public void execute(@NotNull Runnable r) + { + invoke(() -> + { + r.run(); + return true; + }); + } } From d2e99e23eb22ab506f196be24292aa84ce15f9be Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 04:18:28 +0200 Subject: [PATCH 3/8] http-api: Use observeOn to run code on the ClientThread --- .../chatcommands/ChatCommandsPlugin.java | 66 +++++++++---------- .../client/plugins/examine/ExaminePlugin.java | 46 ++++++------- .../grandexchange/GrandExchangePlugin.java | 10 +-- 3 files changed, 61 insertions(+), 61 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index 489a9e21db..4d363e21ac 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -828,44 +828,44 @@ public class ChatCommandsPlugin extends Plugin ItemPrice item = retrieveFromList(results, search); CLIENT.lookupItem(item.getId()) .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.from(clientThread)) .subscribe( (osbresult) -> - clientThread.invoke(() -> + { + int itemId = item.getId(); + int itemPrice = itemManager.getItemPrice(itemId); + + final ChatMessageBuilder builder = new ChatMessageBuilder(); + builder.append(ChatColorType.NORMAL); + builder.append(ChatColorType.HIGHLIGHT); + builder.append(item.getName()); + builder.append(ChatColorType.NORMAL); + builder.append(": GE "); + builder.append(ChatColorType.HIGHLIGHT); + builder.append(StackFormatter.formatNumber(itemPrice)); + builder.append(ChatColorType.NORMAL); + builder.append(": OSB "); + builder.append(ChatColorType.HIGHLIGHT); + builder.append(StackFormatter.formatNumber(osbresult.getOverall_average())); + + ItemDefinition itemComposition = itemManager.getItemDefinition(itemId); + if (itemComposition != null) { - int itemId = item.getId(); - int itemPrice = itemManager.getItemPrice(itemId); + int alchPrice = itemManager.getAlchValue(itemId); + builder + .append(ChatColorType.NORMAL) + .append(" HA value ") + .append(ChatColorType.HIGHLIGHT) + .append(StackFormatter.formatNumber(alchPrice)); + } - final ChatMessageBuilder builder = new ChatMessageBuilder(); - builder.append(ChatColorType.NORMAL); - builder.append(ChatColorType.HIGHLIGHT); - builder.append(item.getName()); - builder.append(ChatColorType.NORMAL); - builder.append(": GE "); - builder.append(ChatColorType.HIGHLIGHT); - builder.append(StackFormatter.formatNumber(itemPrice)); - builder.append(ChatColorType.NORMAL); - builder.append(": OSB "); - builder.append(ChatColorType.HIGHLIGHT); - builder.append(StackFormatter.formatNumber(osbresult.getOverall_average())); + String response = builder.build(); - ItemDefinition itemComposition = itemManager.getItemDefinition(itemId); - if (itemComposition != null) - { - int alchPrice = itemManager.getAlchValue(itemId); - builder - .append(ChatColorType.NORMAL) - .append(" HA value ") - .append(ChatColorType.HIGHLIGHT) - .append(StackFormatter.formatNumber(alchPrice)); - } - - String response = builder.build(); - - log.debug("Setting response {}", response); - messageNode.setRuneLiteFormatMessage(response); - chatMessageManager.update(messageNode); - client.refreshChat(); - }) + log.debug("Setting response {}", response); + messageNode.setRuneLiteFormatMessage(response); + chatMessageManager.update(messageNode); + client.refreshChat(); + } ); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java index 63a2429419..32ad61add6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java @@ -371,36 +371,36 @@ public class ExaminePlugin extends Plugin int finalQuantity = quantity; CLIENT.lookupItem(id) .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.from(clientThread)) .subscribe( (osbresult) -> - clientThread.invoke(() -> + { + message + .append(ChatColorType.NORMAL) + .append(" GE ") + .append(ChatColorType.HIGHLIGHT) + .append(StackFormatter.formatNumber(gePrice * finalQuantity)); + + if (osbresult != null) { message .append(ChatColorType.NORMAL) - .append(" GE ") + .append(" OSB ") .append(ChatColorType.HIGHLIGHT) - .append(StackFormatter.formatNumber(gePrice * finalQuantity)); + .append(StackFormatter.formatNumber(osbresult.getOverall_average() * finalQuantity)); + } - if (osbresult != null) - { - message - .append(ChatColorType.NORMAL) - .append(" OSB ") - .append(ChatColorType.HIGHLIGHT) - .append(StackFormatter.formatNumber(osbresult.getOverall_average() * finalQuantity)); - } - - if (finalQuantity > 1) - { - message - .append(ChatColorType.NORMAL) - .append(" (") - .append(ChatColorType.HIGHLIGHT) - .append(StackFormatter.formatNumber(gePrice)) - .append(ChatColorType.NORMAL) - .append("ea)"); - } - }), + if (finalQuantity > 1) + { + message + .append(ChatColorType.NORMAL) + .append(" (") + .append(ChatColorType.HIGHLIGHT) + .append(StackFormatter.formatNumber(gePrice)) + .append(ChatColorType.NORMAL) + .append("ea)"); + } + }, (e) -> log.error(e.toString()) ); } 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 eb0605d440..b8ffc3c9b1 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 @@ -552,13 +552,13 @@ public class GrandExchangePlugin extends Plugin CLIENT.lookupItem(itemId) .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.from(clientThread)) .subscribe( (osbresult) -> - clientThread.invoke(() -> - { - final String text = geText.getText() + OSB_GE_TEXT + StackFormatter.formatNumber(osbresult.getOverall_average()); - geText.setText(text); - }), + { + final String text = geText.getText() + OSB_GE_TEXT + StackFormatter.formatNumber(osbresult.getOverall_average()); + geText.setText(text); + }, (e) -> log.debug("Error getting price of item {}", itemId, e) ); }); From 241fbd136ca2c8cfa0e84387da315895e9bf22aa Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 04:51:40 +0200 Subject: [PATCH 4/8] http-api: Use observables for ItemClient --- .../runelite/http/api/item/ItemClient.java | 139 ++++++++++-------- .../net/runelite/client/game/ItemManager.java | 61 ++++---- 2 files changed, 107 insertions(+), 93 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java index 17784dd67b..2566a9c603 100644 --- a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java @@ -26,6 +26,7 @@ package net.runelite.http.api.item; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; +import io.reactivex.Observable; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; @@ -112,7 +113,7 @@ public class ItemClient } } - public BufferedImage getIcon(int itemId) throws IOException + public Observable getIcon(int itemId) { HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("item") @@ -126,23 +127,26 @@ public class ItemClient .url(url) .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.debug("Error grabbing icon {}: {}", itemId, response); - return null; - } + if (!response.isSuccessful()) + { + logger.debug("Error grabbing icon {}: {}", itemId, response); + return null; + } - InputStream in = response.body().byteStream(); - synchronized (ImageIO.class) - { - return ImageIO.read(in); + InputStream in = response.body().byteStream(); + synchronized (ImageIO.class) + { + return Observable.just(ImageIO.read(in)); + } } - } + }); } - public SearchResult search(String itemName) throws IOException + public Observable search(String itemName) { HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("item") @@ -152,28 +156,31 @@ public class ItemClient logger.debug("Built URI: {}", url); - Request request = new Request.Builder() - .url(url) - .build(); - - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.debug("Error looking up item {}: {}", itemName, response); - return null; - } + if (!response.isSuccessful()) + { + logger.debug("Error looking up item {}: {}", itemName, response); + return null; + } - InputStream in = response.body().byteStream(); - return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class); - } - catch (JsonParseException ex) - { - throw new IOException(ex); - } + InputStream in = response.body().byteStream(); + return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class)); + } + catch (JsonParseException ex) + { + return Observable.error(ex); + } + }); } - public ItemPrice[] getPrices() throws IOException + public Observable getPrices() { HttpUrl.Builder urlBuilder = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("item") @@ -183,28 +190,32 @@ public class ItemClient logger.debug("Built URI: {}", url); - Request request = new Request.Builder() - .url(url) - .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.warn("Error looking up prices: {}", response); - return null; - } + if (!response.isSuccessful()) + { + logger.warn("Error looking up prices: {}", response); + return null; + } - InputStream in = response.body().byteStream(); - return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice[].class); - } - catch (JsonParseException ex) - { - throw new IOException(ex); - } + InputStream in = response.body().byteStream(); + return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice[].class)); + } + catch (JsonParseException ex) + { + return Observable.error(ex); + } + }); } - public Map getStats() throws IOException + public Observable> getStats() { HttpUrl.Builder urlBuilder = RuneLiteAPI.getStaticBase().newBuilder() .addPathSegment("item") @@ -215,27 +226,31 @@ public class ItemClient logger.debug("Built URI: {}", url); - Request request = new Request.Builder() - .url(url) - .build(); - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.warn("Error looking up item stats: {}", response); - return null; + if (!response.isSuccessful()) + { + logger.warn("Error looking up item stats: {}", response); + return null; + } + + InputStream in = response.body().byteStream(); + final Type typeToken = new TypeToken>() + { + }.getType(); + return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), typeToken)); } - - InputStream in = response.body().byteStream(); - final Type typeToken = new TypeToken>() + catch (JsonParseException ex) { - }.getType(); - return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), typeToken); - } - catch (JsonParseException ex) - { - throw new IOException(ex); - } + return Observable.error(ex); + } + }); } } diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index 34a95e613a..fc6a5f6d90 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -30,9 +30,9 @@ import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableMap; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import io.reactivex.schedulers.Schedulers; import java.awt.Color; import java.awt.image.BufferedImage; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Type; @@ -209,43 +209,42 @@ public class ItemManager private void loadPrices() { - try - { - ItemPrice[] prices = itemClient.getPrices(); - if (prices != null) - { - ImmutableMap.Builder map = ImmutableMap.builderWithExpectedSize(prices.length); - for (ItemPrice price : prices) + itemClient.getPrices() + .subscribeOn(Schedulers.io()) + .subscribe( + (prices) -> { - map.put(price.getId(), price); - } - itemPrices = map.build(); - } + if (prices != null) + { + ImmutableMap.Builder map = ImmutableMap.builderWithExpectedSize(prices.length); + for (ItemPrice price : prices) + { + map.put(price.getId(), price); + } + itemPrices = map.build(); + } - log.debug("Loaded {} prices", itemPrices.size()); - } - catch (IOException e) - { - log.warn("error loading prices!", e); - } + log.debug("Loaded {} prices", itemPrices.size()); + }, + (e) -> log.warn("error loading prices!", e) + ); } private void loadStats() { - try - { - final Map stats = itemClient.getStats(); - if (stats != null) - { - itemStats = ImmutableMap.copyOf(stats); - } + itemClient.getStats() + .subscribeOn(Schedulers.io()) + .subscribe( + (stats) -> { + if (stats != null) + { + itemStats = ImmutableMap.copyOf(stats); + } - log.debug("Loaded {} stats", itemStats.size()); - } - catch (IOException e) - { - log.warn("error loading stats!", e); - } + log.debug("Loaded {} stats", itemStats.size()); + }, + (e) -> log.warn("error loading stats!", e) + ); } private void onGameStateChanged(final GameStateChanged event) From 60d734549ff153170c7ea718276dd83f783f55fd Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 04:56:54 +0200 Subject: [PATCH 5/8] http-api: Return null obervables when failing --- .../runelite/http/api/item/ItemClient.java | 9 +++-- .../api/osbuddy/OSBGrandExchangeClient.java | 2 +- .../runelite/http/api/worlds/WorldClient.java | 38 ++++++++++--------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java index 2566a9c603..9305a7c695 100644 --- a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java @@ -34,6 +34,7 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.util.Arrays; import java.util.Map; +import java.util.Observer; import javax.imageio.ImageIO; import net.runelite.http.api.RuneLiteAPI; import okhttp3.HttpUrl; @@ -134,7 +135,7 @@ public class ItemClient if (!response.isSuccessful()) { logger.debug("Error grabbing icon {}: {}", itemId, response); - return null; + return Observable.just(null); } InputStream in = response.body().byteStream(); @@ -167,7 +168,7 @@ public class ItemClient if (!response.isSuccessful()) { logger.debug("Error looking up item {}: {}", itemName, response); - return null; + return Observable.just(null); } InputStream in = response.body().byteStream(); @@ -202,7 +203,7 @@ public class ItemClient if (!response.isSuccessful()) { logger.warn("Error looking up prices: {}", response); - return null; + return Observable.just(null); } InputStream in = response.body().byteStream(); @@ -238,7 +239,7 @@ public class ItemClient if (!response.isSuccessful()) { logger.warn("Error looking up item stats: {}", response); - return null; + return Observable.just(null); } InputStream in = response.body().byteStream(); diff --git a/http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeClient.java b/http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeClient.java index 3c187552fc..1739125f8c 100644 --- a/http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeClient.java +++ b/http-api/src/main/java/net/runelite/http/api/osbuddy/OSBGrandExchangeClient.java @@ -58,7 +58,7 @@ public class OSBGrandExchangeClient { if (!response.isSuccessful()) { - throw new IOException("Error looking up item id: " + response); + return Observable.error(new IOException("Error looking up item id: " + response)); } final InputStream in = response.body().byteStream(); diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java b/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java index 668e088404..fbdbca9ad8 100644 --- a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java +++ b/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java @@ -26,6 +26,7 @@ package net.runelite.http.api.worlds; import com.google.gson.JsonParseException; +import io.reactivex.Observable; import net.runelite.http.api.RuneLiteAPI; import okhttp3.HttpUrl; import okhttp3.Request; @@ -41,7 +42,7 @@ public class WorldClient { private static final Logger logger = LoggerFactory.getLogger(WorldClient.class); - public WorldResult lookupWorlds() throws IOException + public Observable lookupWorlds() { HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() .addPathSegment("worlds.js") @@ -49,24 +50,27 @@ public class WorldClient logger.debug("Built URI: {}", url); - Request request = new Request.Builder() - .url(url) - .build(); - - try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) + return Observable.defer(() -> { - if (!response.isSuccessful()) + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - logger.debug("Error looking up worlds: {}", response); - return null; - } + if (!response.isSuccessful()) + { + logger.debug("Error looking up worlds: {}", response); + return null; + } - InputStream in = response.body().byteStream(); - return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), WorldResult.class); - } - catch (JsonParseException ex) - { - throw new IOException(ex); - } + InputStream in = response.body().byteStream(); + return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), WorldResult.class)); + } + catch (JsonParseException ex) + { + throw new IOException(ex); + } + }); } } From 1cddf12a2ce079e5b5968c014d8f1f092d6ebf84 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 05:00:39 +0200 Subject: [PATCH 6/8] http-api: Use observables for world api --- .../runelite/http/api/worlds/WorldClient.java | 4 +- .../defaultworld/DefaultWorldPlugin.java | 65 ++++++++++--------- .../worldhopper/WorldHopperPlugin.java | 32 ++++----- 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java b/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java index fbdbca9ad8..f213abcfa3 100644 --- a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java +++ b/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java @@ -61,7 +61,7 @@ public class WorldClient if (!response.isSuccessful()) { logger.debug("Error looking up worlds: {}", response); - return null; + return Observable.just(null); } InputStream in = response.body().byteStream(); @@ -69,7 +69,7 @@ public class WorldClient } catch (JsonParseException ex) { - throw new IOException(ex); + return Observable.error(ex); } }); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java index 0999eda3c1..d8aed33f04 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java @@ -25,6 +25,7 @@ package net.runelite.client.plugins.defaultworld; import com.google.inject.Provides; +import io.reactivex.schedulers.Schedulers; import java.io.IOException; import javax.inject.Inject; import javax.inject.Singleton; @@ -32,6 +33,7 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.events.GameStateChanged; +import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.events.SessionOpen; @@ -60,6 +62,9 @@ public class DefaultWorldPlugin extends Plugin @Inject private EventBus eventBus; + @Inject + private ClientThread clientThread; + private final WorldClient worldClient = new WorldClient(); private int worldCache; private boolean worldChangeRequired; @@ -122,39 +127,39 @@ public class DefaultWorldPlugin extends Plugin return; } - try - { - final WorldResult worldResult = worldClient.lookupWorlds(); + worldClient.lookupWorlds() + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.from(clientThread)) + .subscribe( + (worldResult) -> + { + if (worldResult == null) + { + return; + } - if (worldResult == null) - { - return; - } + final World world = worldResult.findWorld(correctedWorld); - final World world = worldResult.findWorld(correctedWorld); + if (world != null) + { + final net.runelite.api.World rsWorld = client.createWorld(); + rsWorld.setActivity(world.getActivity()); + rsWorld.setAddress(world.getAddress()); + rsWorld.setId(world.getId()); + rsWorld.setPlayerCount(world.getPlayers()); + rsWorld.setLocation(world.getLocation()); + rsWorld.setTypes(WorldUtil.toWorldTypes(world.getTypes())); - if (world != null) - { - final net.runelite.api.World rsWorld = client.createWorld(); - rsWorld.setActivity(world.getActivity()); - rsWorld.setAddress(world.getAddress()); - rsWorld.setId(world.getId()); - rsWorld.setPlayerCount(world.getPlayers()); - rsWorld.setLocation(world.getLocation()); - rsWorld.setTypes(WorldUtil.toWorldTypes(world.getTypes())); - - client.changeWorld(rsWorld); - log.debug("Applied new world {}", correctedWorld); - } - else - { - log.warn("World {} not found.", correctedWorld); - } - } - catch (IOException e) - { - log.warn("Error looking up world {}. Error: {}", correctedWorld, e); - } + client.changeWorld(rsWorld); + log.debug("Applied new world {}", correctedWorld); + } + else + { + log.warn("World {} not found.", correctedWorld); + } + }, + (e) -> log.warn("Error looking up world {}. Error: {}", correctedWorld, e) + ); } private void applyWorld() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index 7613e456ce..89838a6cff 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -29,6 +29,7 @@ import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableList; import com.google.common.collect.ObjectArrays; import com.google.inject.Provides; +import io.reactivex.schedulers.Schedulers; import java.awt.image.BufferedImage; import java.io.IOException; import java.time.Duration; @@ -502,22 +503,21 @@ public class WorldHopperPlugin extends Plugin { log.debug("Fetching worlds"); - try - { - WorldResult worldResult = new WorldClient().lookupWorlds(); - - if (worldResult != null) - { - worldResult.getWorlds().sort(Comparator.comparingInt(World::getId)); - this.worldResult = worldResult; - this.lastFetch = Instant.now(); - updateList(); - } - } - catch (IOException ex) - { - log.warn("Error looking up worlds", ex); - } + new WorldClient().lookupWorlds() + .subscribeOn(Schedulers.io()) + .subscribe( + (worldResult) -> + { + if (worldResult != null) + { + worldResult.getWorlds().sort(Comparator.comparingInt(World::getId)); + this.worldResult = worldResult; + this.lastFetch = Instant.now(); + updateList(); + } + }, + (ex) -> log.warn("Error looking up worlds", ex) + ); } /** From 10fdb3da4cc99d5a3a610f3c48cce252c7112b56 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 05:04:15 +0200 Subject: [PATCH 7/8] http-api: checkstyle --- .../main/java/net/runelite/http/api/item/ItemClient.java | 1 - .../main/java/net/runelite/http/api/worlds/WorldClient.java | 6 ++---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java index 9305a7c695..0e34a05742 100644 --- a/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java +++ b/http-api/src/main/java/net/runelite/http/api/item/ItemClient.java @@ -34,7 +34,6 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.util.Arrays; import java.util.Map; -import java.util.Observer; import javax.imageio.ImageIO; import net.runelite.http.api.RuneLiteAPI; import okhttp3.HttpUrl; diff --git a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java b/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java index f213abcfa3..13559bdd3b 100644 --- a/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java +++ b/http-api/src/main/java/net/runelite/http/api/worlds/WorldClient.java @@ -27,6 +27,8 @@ package net.runelite.http.api.worlds; import com.google.gson.JsonParseException; import io.reactivex.Observable; +import java.io.InputStream; +import java.io.InputStreamReader; import net.runelite.http.api.RuneLiteAPI; import okhttp3.HttpUrl; import okhttp3.Request; @@ -34,10 +36,6 @@ import okhttp3.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - public class WorldClient { private static final Logger logger = LoggerFactory.getLogger(WorldClient.class); From 7a863c207cfbedeb1c06879872581eb3a39df163 Mon Sep 17 00:00:00 2001 From: Owain van Brakel Date: Fri, 19 Jul 2019 05:13:23 +0200 Subject: [PATCH 8/8] client: checkstyle --- .../src/main/java/net/runelite/client/game/ItemManager.java | 6 ++++-- .../client/plugins/defaultworld/DefaultWorldPlugin.java | 2 -- .../client/plugins/worldhopper/WorldHopperPlugin.java | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index fc6a5f6d90..9a60cf848f 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -142,6 +142,7 @@ public class ItemManager private final LoadingCache itemOutlines; private Map itemPrices = Collections.emptyMap(); private Map itemStats = Collections.emptyMap(); + @Inject public ItemManager( Client client, @@ -235,7 +236,8 @@ public class ItemManager itemClient.getStats() .subscribeOn(Schedulers.io()) .subscribe( - (stats) -> { + (stats) -> + { if (stats != null) { itemStats = ImmutableMap.copyOf(stats); @@ -284,7 +286,7 @@ public class ItemManager /** * Look up an item's price * - * @param itemID item id + * @param itemID item id * @param ignoreUntradeableMap should the price returned ignore the {@link UntradeableItemMapping} * @return item price */ diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java index d8aed33f04..39614234bd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/defaultworld/DefaultWorldPlugin.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.defaultworld; import com.google.inject.Provides; import io.reactivex.schedulers.Schedulers; -import java.io.IOException; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; @@ -42,7 +41,6 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.util.WorldUtil; import net.runelite.http.api.worlds.World; import net.runelite.http.api.worlds.WorldClient; -import net.runelite.http.api.worlds.WorldResult; @PluginDescriptor( name = "Default World", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index 89838a6cff..1b99c8549c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -31,7 +31,6 @@ import com.google.common.collect.ObjectArrays; import com.google.inject.Provides; import io.reactivex.schedulers.Schedulers; import java.awt.image.BufferedImage; -import java.io.IOException; import java.time.Duration; import java.time.Instant; import java.util.Comparator;