diff --git a/lib/build.gradle b/lib/build.gradle index da898eb..e520d3e 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -14,7 +14,6 @@ dependencies { api "org.apache.commons:commons-math3:3.6.1" implementation "com.google.code.gson:gson:2.8.9" implementation "com.google.guava:guava:31.1-jre" - implementation "dev.mintaka:Mintaka:0.1.0" testImplementation "org.junit.jupiter:junit-jupiter:5.9.1" } diff --git a/lib/src/main/java/com/tribufu/TribufuApi.java b/lib/src/main/java/com/tribufu/TribufuApi.java index 745c882..e53b1db 100644 --- a/lib/src/main/java/com/tribufu/TribufuApi.java +++ b/lib/src/main/java/com/tribufu/TribufuApi.java @@ -5,7 +5,7 @@ package com.tribufu; import com.tribufu.types.games.Game; import com.tribufu.types.servers.Server; import com.tribufu.types.users.Profile; -import dev.mintaka.http.HttpClient; +import com.tribufu.http.HttpClient; import java.util.ArrayList; import java.util.concurrent.CompletableFuture; import java.util.HashMap; diff --git a/lib/src/main/java/com/tribufu/http/HttpClient.java b/lib/src/main/java/com/tribufu/http/HttpClient.java new file mode 100644 index 0000000..4338abb --- /dev/null +++ b/lib/src/main/java/com/tribufu/http/HttpClient.java @@ -0,0 +1,225 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.http; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.net.URI; +import java.util.concurrent.CompletableFuture; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * Http Client + * + * Helper class to make HTTP requests. + */ +public class HttpClient { + private static final Gson gson = new GsonBuilder().create(); + + private final java.net.http.HttpClient inner; + protected final HttpClientOptions options; + + /** + * Create a default HttpClient instance. + */ + public HttpClient() { + this(new HttpClientOptions()); + } + + /** + * Create a HttpClient instance with the specified options. + * + * @param baseUrl + * @param headers + * @param logEnabled + * @param logTarget + */ + public HttpClient(String baseUrl, Map headers, boolean logEnabled, String logTarget) { + this(new HttpClientOptions(baseUrl, headers, logEnabled, logTarget)); + } + + /** + * Create a HttpClient instance with the specified options. + * + * @param options + */ + public HttpClient(HttpClientOptions options) { + this.options = options; + this.inner = java.net.http.HttpClient.newBuilder().build(); + } + + /** + * Helper method to send an asynchronous HTTP request. + */ + private CompletableFuture sendRequest(HttpRequest request) { + return this.inner.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body); + } + + /** + * Helper method to send an asynchronous HTTP request. + */ + private CompletableFuture sendRequest(HttpRequest request, Class returnType) { + return this.inner.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(response -> gson.fromJson(response.body(), returnType)); + } + + /** + * Helper method to build form URL-encoded data from a Map + */ + private HttpRequest.BodyPublisher buildFormDataFromMap(Map data) { + return HttpRequest.BodyPublishers.ofString( + data.entrySet().stream() + .map(entry -> entry.getKey() + "=" + entry.getValue()) + .reduce((param1, param2) -> param1 + "&" + param2) + .orElse("")); + } + + /** + * Make a GET request and deserialize the response JSON. + * + * @param path The path of the resource. + * @param headers Optional headers. + * @param returnType The type to deserialize the response into. + * @return A CompletableFuture containing the deserialized response object. + */ + public CompletableFuture get(String path, Map headers, Class returnType) { + var requestBuilder = HttpRequest.newBuilder(); + + for (var entry : headers.entrySet()) { + requestBuilder.header(entry.getKey(), entry.getValue()); + } + + var request = requestBuilder + .uri(URI.create(this.options.baseUrl + path)) + .GET() + .build(); + + return sendRequest(request, returnType); + } + + /** + * Make a GET request and deserialize the response JSON. + * + * @param path The path of the resource. + * @param headers Optional headers. + * @param returnType The type to deserialize the response into. + * @return A CompletableFuture containing the deserialized response object. + */ + public List getArray(String path, Map headers, Class returnType) { + var requestBuilder = HttpRequest.newBuilder(); + + for (var entry : headers.entrySet()) { + requestBuilder.header(entry.getKey(), entry.getValue()); + } + + var request = requestBuilder + .uri(URI.create(this.options.baseUrl + path)) + .GET() + .build(); + + var response = sendRequest(request); + T[] array = new Gson().fromJson(response.join(), returnType); + + return Arrays.asList(array); + } + + /** + * Make a POST request and deserialize the response JSON. + * + * @param path The path of the resource. + * @param body The request body. + * @param headers Optional headers. + * @param returnType The type to deserialize the response into. + * @return A CompletableFuture containing the deserialized response object. + */ + public CompletableFuture post(String path, S body, Map headers, Class returnType) { + var requestBuilder = HttpRequest.newBuilder(); + + for (var entry : headers.entrySet()) { + requestBuilder.header(entry.getKey(), entry.getValue()); + } + + var request = requestBuilder + .uri(URI.create(this.options.baseUrl + path)) + .POST(HttpRequest.BodyPublishers.ofString(gson.toJson(body))) + .build(); + + return sendRequest(request, returnType); + } + + /** + * Make a POST request with form URL-encoded data + * and deserialize the response JSON. + * + * @param path The path of the resource. + * @param formData The form data as a Map. + * @param headers Optional headers. + * @param returnType The type to deserialize the response into. + * @return A CompletableFuture containing the deserialized response object. + */ + public CompletableFuture postFormUrlEncoded(String path, Map formData, + Map headers, Class returnType) { + var requestBuilder = HttpRequest.newBuilder(); + + for (var entry : headers.entrySet()) { + requestBuilder.header(entry.getKey(), entry.getValue()); + } + + var request = requestBuilder + .uri(URI.create(this.options.baseUrl + path)) + .POST(buildFormDataFromMap(formData)) + .build(); + + return sendRequest(request, returnType); + } + + /** + * Make a PUT request and deserialize the response JSON. + * + * @param path The path of the resource. + * @param body The request body. + * @param headers Optional headers. + * @param returnType The type to deserialize the response into. + * @return A CompletableFuture containing the deserialized response object. + */ + public CompletableFuture put(String path, S body, Map headers, Class returnType) { + var requestBuilder = HttpRequest.newBuilder(); + + for (var entry : headers.entrySet()) { + requestBuilder.header(entry.getKey(), entry.getValue()); + } + + var request = requestBuilder + .uri(URI.create(this.options.baseUrl + path)) + .PUT(HttpRequest.BodyPublishers.ofString(gson.toJson(body))) + .build(); + + return sendRequest(request, returnType); + } + + /** + * Make a DELETE request. + * + * @param path The path of the resource. + * @param headers Optional headers. + * @return A CompletableFuture containing the response body as a String. + */ + public CompletableFuture delete(String path, Map headers) { + var requestBuilder = HttpRequest.newBuilder(); + + for (var entry : headers.entrySet()) { + requestBuilder.header(entry.getKey(), entry.getValue()); + } + + var request = requestBuilder + .uri(URI.create(this.options.baseUrl + path)) + .DELETE() + .build(); + + return sendRequest(request); + } +} diff --git a/lib/src/main/java/com/tribufu/http/HttpClientOptions.java b/lib/src/main/java/com/tribufu/http/HttpClientOptions.java new file mode 100644 index 0000000..e1f7b1e --- /dev/null +++ b/lib/src/main/java/com/tribufu/http/HttpClientOptions.java @@ -0,0 +1,33 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.http; + +import java.util.HashMap; +import java.util.Map; + +/** + * Http Client Options + * + * Options for creating a HttpClient instance. + */ +public class HttpClientOptions { + public String baseUrl; + public Map headers; + public boolean logEnabled; + public String logTarget; + + public HttpClientOptions() { + this(null); + } + + public HttpClientOptions(String baseUrl) { + this(baseUrl, new HashMap<>(), false, "HttpClient"); + } + + public HttpClientOptions(String baseUrl, Map headers, boolean logEnabled, String logTarget) { + this.baseUrl = baseUrl; + this.headers = headers; + this.logEnabled = logEnabled; + this.logTarget = logTarget; + } +} diff --git a/lib/src/main/java/com/tribufu/oauth2/OAuth2AuthorizeRequest.java b/lib/src/main/java/com/tribufu/oauth2/OAuth2AuthorizeRequest.java new file mode 100644 index 0000000..26967dd --- /dev/null +++ b/lib/src/main/java/com/tribufu/oauth2/OAuth2AuthorizeRequest.java @@ -0,0 +1,20 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.oauth2; + +public class OAuth2AuthorizeRequest { + public final OAuth2ResponseType responseType; + public final String clientId; + public final String scope; + public final String redirectUri; + public final String state; + + public OAuth2AuthorizeRequest(OAuth2ResponseType responseType, String clientId, String scope, String redirectUri, + String state) { + this.responseType = responseType; + this.clientId = clientId; + this.scope = scope; + this.redirectUri = redirectUri; + this.state = state; + } +} diff --git a/lib/src/main/java/com/tribufu/oauth2/OAuth2CodeResponse.java b/lib/src/main/java/com/tribufu/oauth2/OAuth2CodeResponse.java new file mode 100644 index 0000000..c7a0241 --- /dev/null +++ b/lib/src/main/java/com/tribufu/oauth2/OAuth2CodeResponse.java @@ -0,0 +1,13 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.oauth2; + +public class OAuth2CodeResponse { + public final String code; + public final String state; + + public OAuth2CodeResponse(String code, String state) { + this.code = code; + this.state = state; + } +} diff --git a/lib/src/main/java/com/tribufu/oauth2/OAuth2GrantType.java b/lib/src/main/java/com/tribufu/oauth2/OAuth2GrantType.java new file mode 100644 index 0000000..eb1cb8c --- /dev/null +++ b/lib/src/main/java/com/tribufu/oauth2/OAuth2GrantType.java @@ -0,0 +1,11 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.oauth2; + +public enum OAuth2GrantType { + AuthorizationCode, + RefreshToken, + Password, + ClientCredentials, + DeviceCode, +} diff --git a/lib/src/main/java/com/tribufu/oauth2/OAuth2ResponseType.java b/lib/src/main/java/com/tribufu/oauth2/OAuth2ResponseType.java new file mode 100644 index 0000000..6309cad --- /dev/null +++ b/lib/src/main/java/com/tribufu/oauth2/OAuth2ResponseType.java @@ -0,0 +1,8 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.oauth2; + +public enum OAuth2ResponseType { + Code, + Token, +} diff --git a/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenRequest.java b/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenRequest.java new file mode 100644 index 0000000..045907f --- /dev/null +++ b/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenRequest.java @@ -0,0 +1,26 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.oauth2; + +public class OAuth2TokenRequest { + public final OAuth2GrantType grantType; + public final String code; + public final String refreshToken; + public final String username; + public final String password; + public final String clientId; + public final String clientSecret; + public final String redirectUri; + + public OAuth2TokenRequest(OAuth2GrantType grantType, String code, String refreshToken, String username, + String password, String clientId, String clientSecret, String redirectUri) { + this.grantType = grantType; + this.code = code; + this.refreshToken = refreshToken; + this.username = username; + this.password = password; + this.clientId = clientId; + this.clientSecret = clientSecret; + this.redirectUri = redirectUri; + } +} diff --git a/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenResponse.java b/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenResponse.java new file mode 100644 index 0000000..3e452f2 --- /dev/null +++ b/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenResponse.java @@ -0,0 +1,20 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.oauth2; + +public class OAuth2TokenResponse { + public final OAuth2TokenType tokenType; + public final String accessToken; + public final String refreshToken; + public final String scope; + public final int expiresIn; + + public OAuth2TokenResponse(OAuth2TokenType tokenType, String accessToken, String refreshToken, String scope, + int expiresIn) { + this.tokenType = tokenType; + this.accessToken = accessToken; + this.refreshToken = refreshToken; + this.scope = scope; + this.expiresIn = expiresIn; + } +} diff --git a/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenType.java b/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenType.java new file mode 100644 index 0000000..4a7321c --- /dev/null +++ b/lib/src/main/java/com/tribufu/oauth2/OAuth2TokenType.java @@ -0,0 +1,7 @@ +// Copyright (c) Tribufu. All Rights Reserved. + +package com.tribufu.oauth2; + +public enum OAuth2TokenType { + Bearer, +} diff --git a/vendor/MintakaJvm b/vendor/MintakaJvm deleted file mode 160000 index 9fbb227..0000000 --- a/vendor/MintakaJvm +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9fbb227fec3a0feef978b2bd3ee86f3b3771f2e5