rx client session
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user