rx client session

This commit is contained in:
Lucwousin
2019-10-14 05:09:25 +02:00
parent a38e295716
commit acb4ec0b65
3 changed files with 71 additions and 107 deletions

View File

@@ -24,77 +24,78 @@
*/ */
package net.runelite.client; 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.UUID;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.task.Schedule;
@Singleton @Singleton
@Slf4j @Slf4j
public class ClientSessionManager public class ClientSessionManager
{ {
private final SessionClient sessionClient = new SessionClient(this); private final SessionClient sessionClient;
private final ScheduledExecutorService executorService; private final ClientThread clientThread;
private ScheduledFuture<?> scheduledFuture;
private UUID sessionId; private UUID sessionId;
@Inject @Inject
ClientSessionManager(ScheduledExecutorService executorService) ClientSessionManager(ClientThread clientThread)
{ {
this.executorService = executorService; this.sessionClient = new SessionClient();
this.clientThread = clientThread;
} }
public void start() void start()
{ {
sessionClient.open(); sessionClient.openSession()
.subscribeOn(Schedulers.io())
scheduledFuture = executorService.scheduleWithFixedDelay(this::ping, 1, 10, TimeUnit.MINUTES); .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; if (sessionId == null)
log.debug("Opened session {}", sessionId); {
} start();
return;
}
void error(IOException e) sessionClient.pingSession(sessionId)
{ .subscribeOn(Schedulers.io())
log.warn("Client session error, resetting UUID", e.getCause()); .observeOn(Schedulers.from(clientThread))
sessionId = null; .doOnError(e -> this.error((Throwable) e))
.subscribe();
} }
public void shutdown() public void shutdown()
{ {
if (sessionId != null) if (sessionId != null)
{ {
try sessionClient.delete(sessionId)
{ .subscribeOn(Schedulers.io())
sessionClient.delete(sessionId); .observeOn(Schedulers.from(clientThread))
} .doOnError(e -> this.error((Throwable) e))
catch (IOException ex) .subscribe();
{
log.warn(null, ex);
}
sessionId = null; sessionId = null;
} }
scheduledFuture.cancel(true);
} }
private void ping() private void setUuid(UUID uuid)
{ {
if (sessionId == null) this.sessionId = uuid;
{ log.debug("Opened session {}.", sessionId);
sessionClient.open(); }
return;
}
sessionClient.ping(sessionId); private void error(Throwable error)
{
log.debug("Error in client session.");
log.trace(null, error);
} }
} }

View File

@@ -375,6 +375,7 @@ public class RuneLite
if (this.client != null) if (this.client != null)
{ {
scheduler.registerObject(modelOutlineRenderer.get()); scheduler.registerObject(modelOutlineRenderer.get());
scheduler.registerObject(clientSessionManager);
} }
// Close the splash screen // Close the splash screen

View File

@@ -24,106 +24,68 @@
*/ */
package net.runelite.client; package net.runelite.client;
import com.google.gson.JsonParseException; import io.reactivex.Observable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.UUID; import java.util.UUID;
import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.RuneLiteAPI;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody;
import org.jetbrains.annotations.NotNull;
class SessionClient class SessionClient
{ {
private final ClientSessionManager manager; Observable<UUID> openSession()
SessionClient(ClientSessionManager manager)
{ {
this.manager = manager; final HttpUrl url = RuneLiteAPI.getSessionBase();
}
void open() return Observable.fromCallable(() ->
{
HttpUrl url = RuneLiteAPI.getopenosrsSessionBase().newBuilder()
.build();
Request request = new Request.Builder()
.url(url)
.build();
RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback()
{ {
@Override Request request = new Request.Builder()
public void onFailure(@NotNull Call call, @NotNull IOException e) .url(url)
.build();
try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute())
{ {
manager.error(e); return RuneLiteAPI.GSON.fromJson(response.body().string(), UUID.class);
}
@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));
}
} }
}); });
} }
void ping(UUID uuid) Observable pingSession(UUID uuid)
{ {
HttpUrl url = RuneLiteAPI.getopenosrsSessionBase().newBuilder() final HttpUrl url = RuneLiteAPI.getSessionBase().newBuilder()
.addPathSegment("ping") .addPathSegment("ping")
.addQueryParameter("session", uuid.toString()) .addQueryParameter("session", uuid.toString())
.build(); .build();
Request request = new Request.Builder() return Observable.defer(() ->
.url(url)
.build();
RuneLiteAPI.CLIENT.newCall(request).enqueue(new Callback()
{ {
@Override Request request = new Request.Builder()
public void onFailure(@NotNull Call call, @NotNull IOException e) .url(url)
{ .build();
manager.error(e);
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) try (Response response = RuneLiteAPI.CLIENT.newCall(request).execute())
{ {
if (!response.isSuccessful()) return Observable.empty();
{
manager.error(new IOException("Failed ping"));
}
} }
}); });
} }
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()) .addQueryParameter("session", uuid.toString())
.build(); .build();
Request request = new Request.Builder() return Observable.defer(() ->
.delete() {
.url(url) Request request = new Request.Builder()
.build(); .delete()
.url(url)
.build();
RuneLiteAPI.CLIENT.newCall(request).execute().close(); RuneLiteAPI.CLIENT.newCall(request).execute().close();
return Observable.empty();
});
} }
} }