http-api: Use observables for ItemClient

This commit is contained in:
Owain van Brakel
2019-07-19 04:51:40 +02:00
parent d2e99e23eb
commit 241fbd136c
2 changed files with 107 additions and 93 deletions

View File

@@ -26,6 +26,7 @@ package net.runelite.http.api.item;
import com.google.gson.JsonParseException; import com.google.gson.JsonParseException;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import io.reactivex.Observable;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -112,7 +113,7 @@ public class ItemClient
} }
} }
public BufferedImage getIcon(int itemId) throws IOException public Observable<BufferedImage> getIcon(int itemId)
{ {
HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() HttpUrl url = RuneLiteAPI.getApiBase().newBuilder()
.addPathSegment("item") .addPathSegment("item")
@@ -126,23 +127,26 @@ public class ItemClient
.url(url) .url(url)
.build(); .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); if (!response.isSuccessful())
return null; {
} logger.debug("Error grabbing icon {}: {}", itemId, response);
return null;
}
InputStream in = response.body().byteStream(); InputStream in = response.body().byteStream();
synchronized (ImageIO.class) synchronized (ImageIO.class)
{ {
return ImageIO.read(in); return Observable.just(ImageIO.read(in));
}
} }
} });
} }
public SearchResult search(String itemName) throws IOException public Observable<SearchResult> search(String itemName)
{ {
HttpUrl url = RuneLiteAPI.getApiBase().newBuilder() HttpUrl url = RuneLiteAPI.getApiBase().newBuilder()
.addPathSegment("item") .addPathSegment("item")
@@ -152,28 +156,31 @@ public class ItemClient
logger.debug("Built URI: {}", url); logger.debug("Built URI: {}", url);
Request request = new Request.Builder() return Observable.defer(() ->
.url(url)
.build();
try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute())
{ {
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); if (!response.isSuccessful())
return null; {
} logger.debug("Error looking up item {}: {}", itemName, response);
return null;
}
InputStream in = response.body().byteStream(); InputStream in = response.body().byteStream();
return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class); return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), SearchResult.class));
} }
catch (JsonParseException ex) catch (JsonParseException ex)
{ {
throw new IOException(ex); return Observable.error(ex);
} }
});
} }
public ItemPrice[] getPrices() throws IOException public Observable<ItemPrice[]> getPrices()
{ {
HttpUrl.Builder urlBuilder = RuneLiteAPI.getApiBase().newBuilder() HttpUrl.Builder urlBuilder = RuneLiteAPI.getApiBase().newBuilder()
.addPathSegment("item") .addPathSegment("item")
@@ -183,28 +190,32 @@ public class ItemClient
logger.debug("Built URI: {}", url); 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); if (!response.isSuccessful())
return null; {
} logger.warn("Error looking up prices: {}", response);
return null;
}
InputStream in = response.body().byteStream(); InputStream in = response.body().byteStream();
return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice[].class); return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), ItemPrice[].class));
} }
catch (JsonParseException ex) catch (JsonParseException ex)
{ {
throw new IOException(ex); return Observable.error(ex);
} }
});
} }
public Map<Integer, ItemStats> getStats() throws IOException public Observable<Map<Integer, ItemStats>> getStats()
{ {
HttpUrl.Builder urlBuilder = RuneLiteAPI.getStaticBase().newBuilder() HttpUrl.Builder urlBuilder = RuneLiteAPI.getStaticBase().newBuilder()
.addPathSegment("item") .addPathSegment("item")
@@ -215,27 +226,31 @@ public class ItemClient
logger.debug("Built URI: {}", url); 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); if (!response.isSuccessful())
return null; {
logger.warn("Error looking up item stats: {}", response);
return null;
}
InputStream in = response.body().byteStream();
final Type typeToken = new TypeToken<Map<Integer, ItemStats>>()
{
}.getType();
return Observable.just(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), typeToken));
} }
catch (JsonParseException ex)
InputStream in = response.body().byteStream();
final Type typeToken = new TypeToken<Map<Integer, ItemStats>>()
{ {
}.getType(); return Observable.error(ex);
return RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), typeToken); }
} });
catch (JsonParseException ex)
{
throw new IOException(ex);
}
} }
} }

View File

@@ -30,9 +30,9 @@ import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import io.reactivex.schedulers.Schedulers;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.lang.reflect.Type; import java.lang.reflect.Type;
@@ -209,43 +209,42 @@ public class ItemManager
private void loadPrices() private void loadPrices()
{ {
try itemClient.getPrices()
{ .subscribeOn(Schedulers.io())
ItemPrice[] prices = itemClient.getPrices(); .subscribe(
if (prices != null) (prices) ->
{
ImmutableMap.Builder<Integer, ItemPrice> map = ImmutableMap.builderWithExpectedSize(prices.length);
for (ItemPrice price : prices)
{ {
map.put(price.getId(), price); if (prices != null)
} {
itemPrices = map.build(); ImmutableMap.Builder<Integer, ItemPrice> map = ImmutableMap.builderWithExpectedSize(prices.length);
} for (ItemPrice price : prices)
{
map.put(price.getId(), price);
}
itemPrices = map.build();
}
log.debug("Loaded {} prices", itemPrices.size()); log.debug("Loaded {} prices", itemPrices.size());
} },
catch (IOException e) (e) -> log.warn("error loading prices!", e)
{ );
log.warn("error loading prices!", e);
}
} }
private void loadStats() private void loadStats()
{ {
try itemClient.getStats()
{ .subscribeOn(Schedulers.io())
final Map<Integer, ItemStats> stats = itemClient.getStats(); .subscribe(
if (stats != null) (stats) -> {
{ if (stats != null)
itemStats = ImmutableMap.copyOf(stats); {
} itemStats = ImmutableMap.copyOf(stats);
}
log.debug("Loaded {} stats", itemStats.size()); log.debug("Loaded {} stats", itemStats.size());
} },
catch (IOException e) (e) -> log.warn("error loading stats!", e)
{ );
log.warn("error loading stats!", e);
}
} }
private void onGameStateChanged(final GameStateChanged event) private void onGameStateChanged(final GameStateChanged event)