Skip to content

Commit

Permalink
Merge pull request #8 from RappyLabyAddons/feat/syncRequests
Browse files Browse the repository at this point in the history
Implement Async requests to reduce lag
  • Loading branch information
RappyTV authored Nov 23, 2023
2 parents 3f54c54 + 7e446b6 commit 961a05b
Show file tree
Hide file tree
Showing 11 changed files with 198 additions and 98 deletions.
5 changes: 3 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ labyMod {
author = "RappyTV"
description = "Get yourself a custom Globaltag that's publicly visible to anyone using this addon."
minecraftVersion = "*"
version = System.getenv().getOrDefault("VERSION", "1.0.5")
version = System.getenv().getOrDefault("VERSION", "1.0.6")
}

minecraft {
Expand All @@ -30,7 +30,8 @@ labyMod {
"1.19.2",
"1.19.3",
"1.19.4",
"1.20.1"
"1.20.1",
"1.20.2"
) { version, provider ->
configureRun(provider, version)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ protected void enable() {
);
registerListener(new ServerNavigationListener());
labyAPI().interactionMenuRegistry().register(new ReportContext(this));
registerCommand(new GlobalTagCommand(this));
registerCommand(new GlobalTagCommand());

// Clear cache every 5 minutes
new Timer().scheduleAtFixedRate(new TimerTask() {
Expand Down
45 changes: 16 additions & 29 deletions core/src/main/java/com/rappytv/globaltags/api/ApiHandler.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.rappytv.globaltags.api;

import com.rappytv.globaltags.util.PlayerInfo;
import com.rappytv.globaltags.api.requests.PositionSetRequest;
import com.rappytv.globaltags.api.requests.TagSetRequest;
import com.rappytv.globaltags.util.Util;
import net.labymod.api.Laby;
import net.labymod.api.client.entity.player.tag.PositionType;
Expand All @@ -11,30 +12,8 @@
@Singleton
public class ApiHandler {

public String getApiVersion() {
ApiRequest request = new ApiRequest(
"GET",
"/",
""
);

return request.getVersion();
}

public PlayerInfo getInfo(UUID uuid) {
ApiRequest request = new ApiRequest(
"GET",
"/players/" + uuid,
Util.getSessionToken()
);

return new PlayerInfo(request.getTag(), request.getPosition());
}

public void setTag(String tag) {
ApiRequest request = new ApiRequest(
"POST",
"/players/" + Laby.labyAPI().getUniqueId(),
TagSetRequest request = new TagSetRequest(
Util.getSessionToken(),
tag
);
Expand All @@ -47,9 +26,7 @@ public void setTag(String tag) {
}

public void setPosition(PositionType position) {
ApiRequest request = new ApiRequest(
"POST",
"/players/" + Laby.labyAPI().getUniqueId() + "/position",
PositionSetRequest request = new PositionSetRequest(
Util.getSessionToken(),
position
);
Expand All @@ -66,7 +43,12 @@ public void resetTag() {
"DELETE",
"/players/" + Laby.labyAPI().getUniqueId(),
Util.getSessionToken()
);
) {
@Override
public RequestBody getBody() {
return null;
}
};

if(!request.isSuccessful()) {
Util.notify(I18n.translate("globaltags.notifications.error"), request.getError(), true);
Expand All @@ -80,7 +62,12 @@ public void reportPlayer(UUID uuid) {
"POST",
"/players/" + uuid + "/report",
Util.getSessionToken()
);
) {
@Override
public RequestBody getBody() {
return null;
}
};

if(!request.isSuccessful()) {
Util.notify(I18n.translate("globaltags.notifications.error"), request.getError(), true);
Expand Down
76 changes: 34 additions & 42 deletions core/src/main/java/com/rappytv/globaltags/api/ApiRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,72 +2,68 @@

import com.google.gson.Gson;
import com.rappytv.globaltags.GlobalTagAddon;
import net.labymod.api.client.entity.player.tag.PositionType;
import net.labymod.api.util.I18n;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublisher;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.util.concurrent.CompletableFuture;

public class ApiRequest {
public abstract class ApiRequest {

private final Gson gson = new Gson();
private boolean successful;
private String message;
private String tag;
private String position;
private String error;
private String version;
protected ResponseBody responseBody;

private final String method;
private final String path;
private final String key;

public ApiRequest(String method, String path, String key) {
this(method, path, key, BodyPublishers.noBody());
}
public ApiRequest(String method, String path, String key, String tag) {
this(method, path, key, BodyPublishers.ofString(new Gson().toJson(new RequestBody(tag))));
}
public ApiRequest(String method, String path, String key, PositionType type) {
this(method, path, key, BodyPublishers.ofString(new Gson().toJson(new RequestBody(type))));
this.method = method;
this.path = path;
this.key = key;
}

private ApiRequest(String method, String path, String key, BodyPublisher bodyPublisher) {
public CompletableFuture<Void> sendAsyncRequest() {
CompletableFuture<Void> future = new CompletableFuture<>();

try {
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://gt.rappytv.com" + path))
.header("Content-Type", "application/json")
.header("Authorization", key != null ? key : "")
.header("X-Addon-Version", GlobalTagAddon.version)
.method(method, bodyPublisher)
.method(method, getBodyPublisher())
.build();

HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
client.sendAsync(request, BodyHandlers.ofString()).thenAccept(response -> {
responseBody = gson.fromJson(response.body(), ResponseBody.class);

ResponseBody responseBody = new Gson().fromJson(response.body(), ResponseBody.class);
if(responseBody.error != null) {
error = responseBody.error;
successful = false;
future.complete(null);
return;
}

if(responseBody.error != null) {
error = responseBody.error;
successful = false;
return;
}
if(responseBody.version != null) {
version = responseBody.version;
if(responseBody.message != null) this.message = responseBody.message;
successful = true;
return;
}

this.message = responseBody.message;
this.tag = responseBody.tag;
this.position = responseBody.position;
successful = true;
} catch (IOException | InterruptedException | URISyntaxException | NullPointerException e) {
future.complete(null);
});
} catch (Exception e) {
e.printStackTrace();
future.complete(null);
error = I18n.translate("globaltags.notifications.unknownError");
successful = false;
}

return future;
}

public boolean isSuccessful() {
Expand All @@ -76,16 +72,12 @@ public boolean isSuccessful() {
public String getMessage() {
return message;
}
public String getTag() {
return tag;
}
public String getPosition() {
return position;
}
public String getError() {
return error;
}
public String getVersion() {
return version;
private BodyPublisher getBodyPublisher() {
if(getBody() == null) return BodyPublishers.noBody();
return BodyPublishers.ofString(gson.toJson(getBody()));
}
public abstract RequestBody getBody();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.rappytv.globaltags.api.requests;

import com.rappytv.globaltags.api.ApiRequest;
import com.rappytv.globaltags.api.RequestBody;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;

public class InfoGetRequest extends ApiRequest {

private String tag;
private String position;

public InfoGetRequest(UUID uuid, String key) {
super("GET", "/players/" + uuid, key);
}

@Override
public CompletableFuture<Void> sendAsyncRequest() {
return super.sendAsyncRequest().thenRun(() -> {
if(isSuccessful()) {
this.tag = responseBody.tag;
this.position = responseBody.position;
}
});
}

@Override
public RequestBody getBody() {
return null;
}

public String getTag() {
return tag;
}
public String getPosition() {
return position;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.rappytv.globaltags.api.requests;

import com.rappytv.globaltags.api.ApiRequest;
import com.rappytv.globaltags.api.RequestBody;
import net.labymod.api.Laby;
import net.labymod.api.client.entity.player.tag.PositionType;

public class PositionSetRequest extends ApiRequest {

private final PositionType position;

public PositionSetRequest(String key, PositionType type) {
super("POST", "/players/" + Laby.labyAPI().getUniqueId() + "/position", key);
this.position = type;
}

@Override
public RequestBody getBody() {
return new RequestBody(position);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.rappytv.globaltags.api.requests;

import com.rappytv.globaltags.api.ApiRequest;
import com.rappytv.globaltags.api.RequestBody;
import net.labymod.api.Laby;

public class TagSetRequest extends ApiRequest {

private final String key;

public TagSetRequest(String token, String key) {
super("POST", "/players/" + Laby.labyAPI().getUniqueId(), token);
this.key = key;
}

@Override
public RequestBody getBody() {
return new RequestBody(key);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.rappytv.globaltags.api.requests;

import com.rappytv.globaltags.api.ApiRequest;
import com.rappytv.globaltags.api.RequestBody;
import java.util.concurrent.CompletableFuture;

public class VersionGetRequest extends ApiRequest {

private String version;

public VersionGetRequest() {
super("GET", "/", null);
}

@Override
public CompletableFuture<Void> sendAsyncRequest() {
return super.sendAsyncRequest().thenRun(() -> {
if(isSuccessful()) version = responseBody.version;
});
}

@Override
public RequestBody getBody() {
return null;
}

public String getVersion() {
return version;
}
}
Loading

0 comments on commit 961a05b

Please sign in to comment.