From acb4ec0b6545a49b57e43cd748a3587d6d4faef6 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Mon, 14 Oct 2019 05:09:25 +0200 Subject: [PATCH] rx client session --- .../runelite/client/ClientSessionManager.java | 79 +++++++-------- .../java/net/runelite/client/RuneLite.java | 1 + .../net/runelite/client/SessionClient.java | 98 ++++++------------- 3 files changed, 71 insertions(+), 107 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java index 09356754b9..2ec1b0e6e5 100644 --- a/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ClientSessionManager.java @@ -24,77 +24,78 @@ */ package net.runelite.client; -import java.io.IOException; +import io.reactivex.schedulers.Schedulers; +import java.time.temporal.ChronoUnit; import java.util.UUID; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; +import net.runelite.client.callback.ClientThread; +import net.runelite.client.task.Schedule; @Singleton @Slf4j public class ClientSessionManager { - private final SessionClient sessionClient = new SessionClient(this); - private final ScheduledExecutorService executorService; - - private ScheduledFuture scheduledFuture; + private final SessionClient sessionClient; + private final ClientThread clientThread; private UUID sessionId; @Inject - ClientSessionManager(ScheduledExecutorService executorService) + ClientSessionManager(ClientThread clientThread) { - this.executorService = executorService; + this.sessionClient = new SessionClient(); + this.clientThread = clientThread; } - public void start() + void start() { - sessionClient.open(); - - scheduledFuture = executorService.scheduleWithFixedDelay(this::ping, 1, 10, TimeUnit.MINUTES); + sessionClient.openSession() + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.from(clientThread)) + .subscribe(this::setUuid, this::error); } - void setUuid(UUID uuid) + @Schedule(period = 10, unit = ChronoUnit.MINUTES, asynchronous = true) + private void ping() { - this.sessionId = uuid; - log.debug("Opened session {}", sessionId); - } + if (sessionId == null) + { + start(); + return; + } - void error(IOException e) - { - log.warn("Client session error, resetting UUID", e.getCause()); - sessionId = null; + sessionClient.pingSession(sessionId) + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.from(clientThread)) + .doOnError(e -> this.error((Throwable) e)) + .subscribe(); } public void shutdown() { if (sessionId != null) { - try - { - sessionClient.delete(sessionId); - } - catch (IOException ex) - { - log.warn(null, ex); - } + sessionClient.delete(sessionId) + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.from(clientThread)) + .doOnError(e -> this.error((Throwable) e)) + .subscribe(); + sessionId = null; } - - scheduledFuture.cancel(true); } - private void ping() + private void setUuid(UUID uuid) { - if (sessionId == null) - { - sessionClient.open(); - return; - } + this.sessionId = uuid; + log.debug("Opened session {}.", sessionId); + } - sessionClient.ping(sessionId); + private void error(Throwable error) + { + log.debug("Error in client session."); + log.trace(null, error); } } diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 9ca5348f2a..91e6a2de93 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -375,6 +375,7 @@ public class RuneLite if (this.client != null) { scheduler.registerObject(modelOutlineRenderer.get()); + scheduler.registerObject(clientSessionManager); } // Close the splash screen diff --git a/runelite-client/src/main/java/net/runelite/client/SessionClient.java b/runelite-client/src/main/java/net/runelite/client/SessionClient.java index fb2408f250..ce1b3575aa 100644 --- a/runelite-client/src/main/java/net/runelite/client/SessionClient.java +++ b/runelite-client/src/main/java/net/runelite/client/SessionClient.java @@ -24,106 +24,68 @@ */ package net.runelite.client; -import com.google.gson.JsonParseException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import io.reactivex.Observable; import java.util.UUID; import net.runelite.http.api.RuneLiteAPI; -import okhttp3.Call; -import okhttp3.Callback; import okhttp3.HttpUrl; import okhttp3.Request; import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; class SessionClient { - private final ClientSessionManager manager; - - SessionClient(ClientSessionManager manager) + Observable openSession() { - this.manager = manager; - } + final HttpUrl url = RuneLiteAPI.getSessionBase(); - void open() - { - HttpUrl url = RuneLiteAPI.getopenosrsSessionBase().newBuilder() - .build(); - - Request request = new Request.Builder() - .url(url) - .build(); - - RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() + return Observable.fromCallable(() -> { - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - manager.error(e); - } - - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) - { - try - { - ResponseBody body = response.body(); - - InputStream in = body.byteStream(); - - manager.setUuid(RuneLiteAPI.GSON.fromJson(new InputStreamReader(in), UUID.class)); - } - catch (JsonParseException | IllegalArgumentException ex) // UUID.fromString can throw IllegalArgumentException - { - manager.error(new IOException(ex)); - } + return RuneLiteAPI.GSON.fromJson(response.body().string(), UUID.class); } }); } - void ping(UUID uuid) + Observable pingSession(UUID uuid) { - HttpUrl url = RuneLiteAPI.getopenosrsSessionBase().newBuilder() + final HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder() .addPathSegment("ping") .addQueryParameter("session", uuid.toString()) .build(); - Request request = new Request.Builder() - .url(url) - .build(); - - RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback() + return Observable.defer(() -> { - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) - { - manager.error(e); - } + Request request = new Request.Builder() + .url(url) + .build(); - @Override - public void onResponse(@NotNull Call call, @NotNull Response response) + + try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute()) { - if (!response.isSuccessful()) - { - manager.error(new IOException("Failed ping")); - } + return Observable.empty(); } }); } - void delete(UUID uuid) throws IOException + Observable delete(UUID uuid) { - HttpUrl url = RuneLiteAPI.getopenosrsSessionBase().newBuilder() + final HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder() .addQueryParameter("session", uuid.toString()) .build(); - Request request = new Request.Builder() - .delete() - .url(url) - .build(); + return Observable.defer(() -> + { + Request request = new Request.Builder() + .delete() + .url(url) + .build(); - RuneLiteAPI.CLIENT.newCall(request).execute().close(); + RuneLiteAPI.CLIENT.newCall(request).execute().close(); + return Observable.empty(); + }); } }