diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 00f837d..5c06bfc 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -1,6 +1,6 @@ package eu.mhsl.craftattack.spawn; -import eu.mhsl.craftattack.spawn.api.HttpServer; +import eu.mhsl.craftattack.spawn.api.server.HttpServer; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.config.Configuration; import org.bukkit.Bukkit; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/HttpRepository.java b/src/main/java/eu/mhsl/craftattack/spawn/api/client/HttpRepository.java new file mode 100644 index 0000000..44d6af6 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/api/client/HttpRepository.java @@ -0,0 +1,70 @@ +package eu.mhsl.craftattack.spawn.api.client; + +import com.google.gson.Gson; +import org.apache.http.client.utils.URIBuilder; + +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.HttpResponse; +import java.util.function.Consumer; + +public class HttpRepository extends Repository { + Consumer baseUriBuilder; + public HttpRepository(URI basePath, Consumer baseUriBuilder) { + super(basePath); + this.baseUriBuilder = baseUriBuilder; + } + + public record RequestResponse(int status, TData data) { + } + + protected RequestResponse post(String command, TInput data, Class clazz) { + return this.post(command, uriBuilder -> baseUriBuilder.accept(uriBuilder), data, clazz); + } + protected RequestResponse post(String command, Consumer parameters, TInput data, Class clazz) { + HttpRequest request = this.getRequestBuilder(this.getUri(command)) + .POST(HttpRequest.BodyPublishers.ofString(new Gson().toJson(data))) + .build(); + + RequestResponse rawResponse = this.runRequest(request); + return new RequestResponse<>(rawResponse.status, new Gson().fromJson(rawResponse.data, clazz)); + } + + protected RequestResponse get(String command, Class clazz) { + HttpRequest request = this.getRequestBuilder(this.getUri(command)) + .GET() + .build(); + + RequestResponse rawResponse = this.runRequest(request); + return new RequestResponse<>(rawResponse.status, new Gson().fromJson(rawResponse.data, clazz)); + } + + private URI getUri(String command) { + try { + URIBuilder builder = new URIBuilder(this.basePath + "/" + command); + this.baseUriBuilder.accept(builder); + return builder.build(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + + private HttpRequest.Builder getRequestBuilder(URI endpoint) { + return HttpRequest.newBuilder() + .uri(endpoint) + .header("Content-Type", "application/json"); + } + + private RequestResponse runRequest(HttpRequest request) { + try(HttpClient client = HttpClient.newHttpClient()) { + HttpResponse httpResponse = client.send(request, HttpResponse.BodyHandlers.ofString()); + + return new RequestResponse<>(httpResponse.statusCode(), httpResponse.body()); + } catch(IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/Repository.java b/src/main/java/eu/mhsl/craftattack/spawn/api/client/Repository.java new file mode 100644 index 0000000..316bcb7 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/api/client/Repository.java @@ -0,0 +1,11 @@ +package eu.mhsl.craftattack.spawn.api.client; + +import java.net.URI; + +public class Repository { + protected URI basePath; + + public Repository(URI basePath) { + this.basePath = basePath; + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/ReportRepository.java b/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/ReportRepository.java new file mode 100644 index 0000000..5ff6483 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/api/client/repositories/ReportRepository.java @@ -0,0 +1,21 @@ +package eu.mhsl.craftattack.spawn.api.client.repositories; + +import eu.mhsl.craftattack.spawn.api.client.HttpRepository; +import org.apache.http.client.utils.URIBuilder; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.UUID; + +public class ReportRepository extends HttpRepository { + public ReportRepository() throws URISyntaxException { + super(new URI("asdasdas")); + } + + public record SendReportResponse(UUID user) {} + public record ReportInput(UUID user) {} + + public RequestResponse sendReport(ReportInput input) { + return this.post("reports", (builder) -> builder.addParameter("token", "asd"), input, SendReportResponse.class); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/api/HttpServer.java b/src/main/java/eu/mhsl/craftattack/spawn/api/server/HttpServer.java similarity index 98% rename from src/main/java/eu/mhsl/craftattack/spawn/api/HttpServer.java rename to src/main/java/eu/mhsl/craftattack/spawn/api/server/HttpServer.java index 412d95b..dec1ff9 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/api/HttpServer.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/api/server/HttpServer.java @@ -1,4 +1,4 @@ -package eu.mhsl.craftattack.spawn.api; +package eu.mhsl.craftattack.spawn.api.server; import com.google.gson.Gson; import eu.mhsl.craftattack.spawn.Main; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/Appliance.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/Appliance.java index f6c74f8..602442a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/Appliance.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/Appliance.java @@ -1,7 +1,7 @@ package eu.mhsl.craftattack.spawn.appliance; import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.api.HttpServer; +import eu.mhsl.craftattack.spawn.api.server.HttpServer; import eu.mhsl.craftattack.spawn.config.Configuration; import org.bukkit.Bukkit; import org.bukkit.command.PluginCommand; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java index a25e690..93bfc38 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java @@ -2,7 +2,7 @@ package eu.mhsl.craftattack.spawn.appliances.event; import com.google.gson.Gson; import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.api.HttpServer; +import eu.mhsl.craftattack.spawn.api.server.HttpServer; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; import eu.mhsl.craftattack.spawn.appliances.customAdvancements.Advancements; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java index c559d04..c10dcf1 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java @@ -4,7 +4,7 @@ import com.google.gson.Gson; import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.util.server.ApiUtil; +import eu.mhsl.craftattack.spawn.util.api.ApiUtil; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentBuilder; import net.kyori.adventure.text.TextComponent; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java index cbdb0d6..ecb928d 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java @@ -2,10 +2,10 @@ package eu.mhsl.craftattack.spawn.appliances.whitelist; import com.google.gson.Gson; import eu.mhsl.craftattack.spawn.Main; -import eu.mhsl.craftattack.spawn.api.HttpServer; +import eu.mhsl.craftattack.spawn.api.server.HttpServer; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed; -import eu.mhsl.craftattack.spawn.util.server.ApiUtil; +import eu.mhsl.craftattack.spawn.util.api.ApiUtil; import eu.mhsl.craftattack.spawn.util.server.Floodgate; import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; import org.apache.http.client.utils.URIBuilder; @@ -98,7 +98,7 @@ public class Whitelist extends Appliance { } private UserData fetchUserData(UUID uuid) throws DisconnectInfo.Throwable { - URIBuilder uriBuilder = new URIBuilder(apiEndpoint); + URIBuilder uriBuilder = new URIBuilder(this.apiEndpoint); uriBuilder.addParameter("secret", this.apiSecret); uriBuilder.addParameter("uuid", uuid.toString()); diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/api/ApiUtil.java b/src/main/java/eu/mhsl/craftattack/spawn/util/api/ApiUtil.java new file mode 100644 index 0000000..bd3956e --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/util/api/ApiUtil.java @@ -0,0 +1,83 @@ +package eu.mhsl.craftattack.spawn.util.api; + +import com.google.gson.Gson; +import eu.mhsl.craftattack.spawn.appliances.whitelist.Whitelist; +import eu.mhsl.craftattack.spawn.config.Configuration; +import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; +import org.apache.http.client.utils.URIBuilder; + +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.HttpResponse; +import java.util.Objects; + +public class ApiUtil { + private static URI whitelistEndpoint; + private static URI reportEndpoint; + private static String baseUrl; + private static String apiSecret; + + public static String getApiSecret() { + if(apiSecret == null) { + apiSecret = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")).getString("secret"); + } + return apiSecret; + } + + public static String getBaseUrl() { + if(baseUrl == null) { + baseUrl = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")).getString("baseurl"); + } + return baseUrl; + } + + public static URI getWhitelistEndpoint() { + if(whitelistEndpoint == null) { + String configValue = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")).getString("whitelist"); + whitelistEndpoint = URI.create(getBaseUrl() + Objects.requireNonNull(configValue)); + } + return whitelistEndpoint; + } + + public static URI getReportEndpoint() { + if(reportEndpoint == null) { + String configValue = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")).getString("report"); + reportEndpoint = URI.create(getBaseUrl() + Objects.requireNonNull(configValue)); + } + return reportEndpoint; + } + + + + public static HttpResponse getHttpResponse(URI endpoint, ) { + URIBuilder uriBuilder = new URIBuilder(endpoint); + uriBuilder.addParameter("secret", apiSecret); + uriBuilder.addParameter("uuid", uuid.toString()); + + try(HttpClient client = HttpClient.newHttpClient()) { + HttpRequest httpRequest = HttpRequest.newBuilder() + .uri(uriBuilder.build()) + .header("Content-Type", "application/json") + .GET() + .build(); + + HttpResponse httpResponse = client.send(httpRequest, HttpResponse.BodyHandlers.ofString()); + + if(httpResponse.statusCode() == 404) + throw new DisconnectInfo.Throwable( + "Nicht angemeldet", + "Du bist derzeit nicht als Teilnehmer des CraftAttack-Projektes registriert!", + "Melde Dich bei einem Admin für eine nachträgliche Anmeldung.", + uuid + ); + + return new Gson().fromJson(httpResponse.body(), Whitelist.UserData.class); + + } catch(IOException | InterruptedException | URISyntaxException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/server/ApiUtil.java b/src/main/java/eu/mhsl/craftattack/spawn/util/server/ApiUtil.java deleted file mode 100644 index bc3f697..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/server/ApiUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -package eu.mhsl.craftattack.spawn.util.server; - -import eu.mhsl.craftattack.spawn.config.Configuration; - -import java.net.URI; -import java.util.Objects; - -public class ApiUtil { - private static URI whitelistEndpoint; - private static URI reportEndpoint; - private static String baseUrl; - private static String apiSecret; - - public static String getApiSecret() { - if(apiSecret == null) { - apiSecret = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")).getString("secret"); - } - return apiSecret; - } - - public static String getBaseUrl() { - if(baseUrl == null) { - baseUrl = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")).getString("baseurl"); - } - return baseUrl; - } - - public static URI getWhitelistEndpoint() { - if(whitelistEndpoint == null) { - String configValue = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")).getString("whitelist"); - whitelistEndpoint = URI.create(getBaseUrl() + Objects.requireNonNull(configValue)); - } - return whitelistEndpoint; - } - - public static URI getReportEndpoint() { - if(reportEndpoint == null) { - String configValue = Objects.requireNonNull(Configuration.cfg.getConfigurationSection("api")).getString("report"); - reportEndpoint = URI.create(getBaseUrl() + Objects.requireNonNull(configValue)); - } - return reportEndpoint; - } -}