From 2d1a8da113a627982ac1565c63f8b58920f77ac5 Mon Sep 17 00:00:00 2001 From: Suraj Kumar Date: Thu, 23 May 2024 21:08:03 +0100 Subject: [PATCH 1/4] Fix Sticker Request --- .../jdi/core/api/StickerRequest.java | 1 - .../jdi/core/api/utils/DiscordImageUtil.java | 2 +- .../internal/api/DiscordRequestBuilder.java | 2 +- .../sticker/CreateGuildStickerRequest.java | 29 ++++++++++++------- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java b/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java index 8d488058..26526463 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java @@ -18,7 +18,6 @@ public StickerRequest(DiscordResponseParser responseParser, long guildId) { } public AsyncResponse createGuildSticker( - long guildId, String name, String description, String tags, diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/utils/DiscordImageUtil.java b/api/src/main/java/com/javadiscord/jdi/core/api/utils/DiscordImageUtil.java index de1a9cd8..971052ef 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/utils/DiscordImageUtil.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/utils/DiscordImageUtil.java @@ -26,7 +26,7 @@ public static boolean isNotImage(Path path) { return !IMAGE_EXTENSIONS.contains(getExtension(path)); } - private static String getExtension(Path path) { + public static String getExtension(Path path) { String fileName = path.getFileName().toString().toLowerCase(); return fileName.substring(fileName.lastIndexOf('.') + 1); } diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java index b17f82cd..ab3359e2 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java @@ -57,7 +57,7 @@ public DiscordRequestBuilder body(HttpRequest.BodyPublisher body) { public DiscordRequestBuilder multipartBody(MultipartBodyPublisher body) { this.body = body; - this.headers.put("Content-Type", "multipart/form-data"); + this.headers.put("Content-Type", "multipart/form-data; boundary=" + body.boundary()); return this; } diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/sticker/CreateGuildStickerRequest.java b/api/src/main/java/com/javadiscord/jdi/internal/api/sticker/CreateGuildStickerRequest.java index 15b4e33e..cd9cd8a3 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/sticker/CreateGuildStickerRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/sticker/CreateGuildStickerRequest.java @@ -1,12 +1,13 @@ package com.javadiscord.jdi.internal.api.sticker; import java.io.FileNotFoundException; -import java.net.http.HttpRequest; import java.nio.file.Path; +import com.javadiscord.jdi.core.api.utils.DiscordImageUtil; import com.javadiscord.jdi.internal.api.DiscordRequest; import com.javadiscord.jdi.internal.api.DiscordRequestBuilder; +import com.github.mizosoft.methanol.MediaType; import com.github.mizosoft.methanol.MultipartBodyPublisher; public record CreateGuildStickerRequest( @@ -19,21 +20,29 @@ public record CreateGuildStickerRequest( @Override public DiscordRequestBuilder create() { - HttpRequest.BodyPublisher body; + try { - body = + MultipartBodyPublisher.Builder body = MultipartBodyPublisher.newBuilder() .textPart("name", name) .textPart("description", description) - .textPart("tags", tags) - .filePart("file", filePath) - .build(); + .textPart("tags", tags); + + String extension = DiscordImageUtil.getExtension(filePath); + + switch (extension) { + case "png" -> body.filePart("file", filePath, MediaType.IMAGE_PNG); + case "jpg", "jpeg" -> body.filePart("file", filePath, MediaType.IMAGE_JPEG); + case "gif" -> body.filePart("file", filePath, MediaType.IMAGE_GIF); + } + + return new DiscordRequestBuilder() + .post() + .path("/guilds/%s/stickers".formatted(guildId)) + .multipartBody(body.build()); + } catch (FileNotFoundException e) { throw new RuntimeException(e); } - return new DiscordRequestBuilder() - .post() - .path("/guilds/%s/stickers".formatted(guildId)) - .body(body); } } From bd8163e214e43f734af060c97417fbea8137cd3b Mon Sep 17 00:00:00 2001 From: Suraj Kumar Date: Thu, 23 May 2024 21:08:35 +0100 Subject: [PATCH 2/4] Add StickerRequestTest --- .../jdi/core/api/StickerRequestTest.java | 135 ++++++++++++++++++ api/src/test/resources/test-sticker-2.png | Bin 0 -> 2902 bytes api/src/test/resources/test-sticker.png | Bin 0 -> 25837 bytes 3 files changed, 135 insertions(+) create mode 100644 api/src/test/integration/com/javadiscord/jdi/core/api/StickerRequestTest.java create mode 100644 api/src/test/resources/test-sticker-2.png create mode 100644 api/src/test/resources/test-sticker.png diff --git a/api/src/test/integration/com/javadiscord/jdi/core/api/StickerRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/core/api/StickerRequestTest.java new file mode 100644 index 00000000..7f90c697 --- /dev/null +++ b/api/src/test/integration/com/javadiscord/jdi/core/api/StickerRequestTest.java @@ -0,0 +1,135 @@ +package com.javadiscord.jdi.core.api; + +import com.javadiscord.jdi.core.Guild; +import com.javadiscord.jdi.core.api.builders.ModifyGuildStickerBuilder; +import com.javadiscord.jdi.core.models.message.Sticker; +import com.javadiscord.jdi.core.models.message.StickerFormatType; +import com.javadiscord.jdi.core.models.message.StickerType; +import helpers.LiveDiscordHelper; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Paths; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import static org.junit.jupiter.api.Assertions.*; + +class StickerRequestTest { + private static Guild guild; + + @BeforeAll + public static void setup() throws InterruptedException { + guild = new LiveDiscordHelper().getGuild(); + } + + @Test + void testCreateGuildStickerThenGetAndDelete() throws InterruptedException, URISyntaxException { + CountDownLatch latch = new CountDownLatch(1); + + String stickerName = "sticker-" + ThreadLocalRandom.current().nextInt(1,10); + String description = "d-" + ThreadLocalRandom.current().nextInt(1,10); + String tags = "tag-" + ThreadLocalRandom.current().nextInt(1,10); + + URL url = StickerRequestTest.class.getResource("/test-sticker.png"); + + if (url == null) { + fail("/test-sticker.png not found"); + return; + } + + AsyncResponse asyncResponse = guild + .sticker() + .createGuildSticker(stickerName, description, tags, Paths.get(url.toURI())); + + AtomicReference stickerId = new AtomicReference<>(); + + asyncResponse.onSuccess(res -> { + assertEquals(stickerName, res.name()); + assertEquals(description, res.description()); + assertEquals(tags, res.tags()); + assertEquals(StickerType.GUILD, res.type()); + assertEquals(StickerFormatType.PNG, res.formatType()); + stickerId.set(res.id()); + latch.countDown(); + }); + + asyncResponse.onError(Assertions::fail); + + assertTrue(latch.await(30, TimeUnit.SECONDS)); + + if(stickerId.get() != null) { + guild.sticker().deleteGuildSticker(stickerId.get()) + .onError(Assertions::fail) + .onSuccess(res -> { + assertEquals(stickerName, res.name()); + assertEquals(description, res.description()); + assertEquals(tags, res.tags()); + assertEquals(stickerId.get(), res.id()); + }); + } else { + fail(); + } + } + + @Test + @Disabled + void testModifySticker() throws InterruptedException, URISyntaxException { + CountDownLatch createLatch = new CountDownLatch(1); + + URL testSticker = StickerRequestTest.class.getResource("/test-sticker.png"); + URL testSticker2 = StickerRequestTest.class.getResource("/test-sticker-2.png"); + + if (testSticker == null) { + fail("/test-sticker.png not found"); + return; + } + if (testSticker2 == null) { + fail("/test-sticker-2.png not found"); + return; + } + + AtomicReference stickerId = new AtomicReference<>(); + + guild.sticker() + .createGuildSticker("test-sticker", "description", "tags", Paths.get(testSticker.toURI())) + .onSuccess(res -> { + stickerId.set(res.id()); + createLatch.countDown(); + }) + .onError(Assertions::fail); + + assertTrue(createLatch.await(30, TimeUnit.SECONDS)); + + Thread.sleep(10000); + + CountDownLatch modifyLatch = new CountDownLatch(1); + + guild.sticker() + .modifyGuildSticker(new ModifyGuildStickerBuilder(stickerId.get()) + .description("new description") + .name("new name") + .tags("new tags")) + .onSuccess(res -> { + assertEquals("new name", res.name()); + assertEquals("new description", res.description()); + assertEquals("new tags", res.tags()); + modifyLatch.countDown(); + }) + .onError(Assertions::fail); + + assertTrue(modifyLatch.await(30, TimeUnit.SECONDS)); + + Thread.sleep(10000); + + guild.sticker() + .deleteGuildSticker(stickerId.get()) + .onError(Assertions::fail); + } +} diff --git a/api/src/test/resources/test-sticker-2.png b/api/src/test/resources/test-sticker-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3e8e1ecaf1eb028476f459c2e538caaaab6dbf1d GIT binary patch literal 2902 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 Ce9wUZ literal 0 HcmV?d00001 diff --git a/api/src/test/resources/test-sticker.png b/api/src/test/resources/test-sticker.png new file mode 100644 index 0000000000000000000000000000000000000000..4685213b5ec7fe3b6b89efae90cf64446457e958 GIT binary patch literal 25837 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%0DPJnWV;ujm1wdC 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 R7m@$~002ovPDHLkV1nqz0?PmZ literal 0 HcmV?d00001 From 840ff55ec6e09654aafd0c640ca03ab0b19b2d62 Mon Sep 17 00:00:00 2001 From: Suraj Kumar Date: Fri, 24 May 2024 13:41:44 +0100 Subject: [PATCH 3/4] Fix tests --- .../jdi/core/api/DiscordResponseParser.java | 79 ++++++++++--------- .../jdi/core/api/StickerRequest.java | 4 +- .../jdi/core/api/StickerRequestTest.java | 28 +++---- 3 files changed, 55 insertions(+), 56 deletions(-) diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java b/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java index b727fa38..a88a8c40 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java @@ -23,18 +23,18 @@ public AsyncResponse> callAndParseList(Class clazz, DiscordReques AsyncResponse> asyncResponse = new AsyncResponse<>(); DiscordResponseFuture future = dispatcher.queue(request); future.onSuccess( - response -> { - if (isSuccessfulResponse(response)) { - try { - List resultList = parseResponseFromList(clazz, response.body()); - asyncResponse.setResult(resultList); - } catch (Exception e) { - asyncResponse.setException(e); + response -> { + if (isSuccessfulResponse(response)) { + try { + List resultList = parseResponseFromList(clazz, response.body()); + asyncResponse.setResult(resultList); + } catch (Exception e) { + asyncResponse.setException(e); + } + } else { + asyncResponse.setException(errorResponseException(response)); } - } else { - asyncResponse.setException(errorResponseException(response)); } - } ); future.onError(asyncResponse::setException); return asyncResponse; @@ -44,44 +44,44 @@ public AsyncResponse> callAndParseMap(String key, DiscordRequest req AsyncResponse> asyncResponse = new AsyncResponse<>(); DiscordResponseFuture future = dispatcher.queue(request); future.onSuccess( - response -> { - if (isSuccessfulResponse(response)) { - try { - List resultList = parseResponseFromMap(key, response.body()); - asyncResponse.setResult(resultList); - } catch (Exception e) { - asyncResponse.setException(e); + response -> { + if (isSuccessfulResponse(response)) { + try { + List resultList = parseResponseFromMap(key, response.body()); + asyncResponse.setResult(resultList); + } catch (Exception e) { + asyncResponse.setException(e); + } + } else { + asyncResponse.setException(errorResponseException(response)); } - } else { - asyncResponse.setException(errorResponseException(response)); } - } ); future.onError(asyncResponse::setException); return asyncResponse; } private List parseResponseFromList( - Class elementType, - String response + Class elementType, + String response ) throws JsonProcessingException { return OBJECT_MAPPER.readValue( - response, - OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, elementType) + response, + OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, elementType) ); } private List parseResponseFromMap( - String key, - String response + String key, + String response ) throws JsonProcessingException { Map> res = - OBJECT_MAPPER.readValue( - response, - OBJECT_MAPPER - .getTypeFactory() - .constructMapType(Map.class, String.class, List.class) - ); + OBJECT_MAPPER.readValue( + response, + OBJECT_MAPPER + .getTypeFactory() + .constructMapType(Map.class, String.class, List.class) + ); return res.get(key); } @@ -94,13 +94,16 @@ public AsyncResponse callAndParse(Class clazz, DiscordRequest request) } private void success( - Class type, - DiscordResponse response, - AsyncResponse asyncResponse + Class type, + DiscordResponse response, + AsyncResponse asyncResponse ) { if (isSuccessfulResponse(response)) { try { - T result = OBJECT_MAPPER.readValue(response.body(), type); + T result = null; + if (!response.body().isEmpty()) { + result = OBJECT_MAPPER.readValue(response.body(), type); + } asyncResponse.setResult(result); } catch (JsonProcessingException e) { asyncResponse.setException(e); @@ -116,7 +119,7 @@ private boolean isSuccessfulResponse(DiscordResponse response) { private Throwable errorResponseException(DiscordResponse response) { return new Exception( - "Received HTTP status code " + response.status() + " " + response.body() + "Received HTTP status code " + response.status() + " " + response.body() ); } -} +} \ No newline at end of file diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java b/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java index 26526463..02426334 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java @@ -29,9 +29,9 @@ public AsyncResponse createGuildSticker( ); } - public AsyncResponse deleteGuildSticker(long stickerId) { + public AsyncResponse deleteGuildSticker(long stickerId) { return responseParser.callAndParse( - Sticker.class, new DeleteGuildStickerRequest(guildId, stickerId) + Void.class, new DeleteGuildStickerRequest(guildId, stickerId) ); } diff --git a/api/src/test/integration/com/javadiscord/jdi/core/api/StickerRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/core/api/StickerRequestTest.java index 7f90c697..2f86d8dd 100644 --- a/api/src/test/integration/com/javadiscord/jdi/core/api/StickerRequestTest.java +++ b/api/src/test/integration/com/javadiscord/jdi/core/api/StickerRequestTest.java @@ -8,7 +8,6 @@ import helpers.LiveDiscordHelper; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.net.URISyntaxException; @@ -66,20 +65,13 @@ void testCreateGuildStickerThenGetAndDelete() throws InterruptedException, URISy if(stickerId.get() != null) { guild.sticker().deleteGuildSticker(stickerId.get()) - .onError(Assertions::fail) - .onSuccess(res -> { - assertEquals(stickerName, res.name()); - assertEquals(description, res.description()); - assertEquals(tags, res.tags()); - assertEquals(stickerId.get(), res.id()); - }); + .onError(Assertions::fail); } else { fail(); } } @Test - @Disabled void testModifySticker() throws InterruptedException, URISyntaxException { CountDownLatch createLatch = new CountDownLatch(1); @@ -107,8 +99,6 @@ void testModifySticker() throws InterruptedException, URISyntaxException { assertTrue(createLatch.await(30, TimeUnit.SECONDS)); - Thread.sleep(10000); - CountDownLatch modifyLatch = new CountDownLatch(1); guild.sticker() @@ -122,14 +112,20 @@ void testModifySticker() throws InterruptedException, URISyntaxException { assertEquals("new tags", res.tags()); modifyLatch.countDown(); }) - .onError(Assertions::fail); + .onError(err -> { + System.err.println("error: " + err.getMessage()); + }); assertTrue(modifyLatch.await(30, TimeUnit.SECONDS)); - Thread.sleep(10000); + CountDownLatch deleteLatch = new CountDownLatch(1); - guild.sticker() - .deleteGuildSticker(stickerId.get()) - .onError(Assertions::fail); + AsyncResponse delete = guild.sticker() + .deleteGuildSticker(stickerId.get()); + + delete.onSuccess(res -> deleteLatch.countDown()); + delete.onError(Assertions::fail); + + assertTrue(deleteLatch.await(30, TimeUnit.SECONDS)); } } From eee9bf8fb7bdb98bfd312fcdd50cb4cca626af6b Mon Sep 17 00:00:00 2001 From: Suraj Kumar Date: Fri, 24 May 2024 13:43:01 +0100 Subject: [PATCH 4/4] Spotless --- .../jdi/core/api/DiscordResponseParser.java | 74 +++++++++---------- .../jdi/core/api/StickerRequest.java | 2 +- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java b/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java index a88a8c40..7f188669 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/DiscordResponseParser.java @@ -23,18 +23,18 @@ public AsyncResponse> callAndParseList(Class clazz, DiscordReques AsyncResponse> asyncResponse = new AsyncResponse<>(); DiscordResponseFuture future = dispatcher.queue(request); future.onSuccess( - response -> { - if (isSuccessfulResponse(response)) { - try { - List resultList = parseResponseFromList(clazz, response.body()); - asyncResponse.setResult(resultList); - } catch (Exception e) { - asyncResponse.setException(e); - } - } else { - asyncResponse.setException(errorResponseException(response)); + response -> { + if (isSuccessfulResponse(response)) { + try { + List resultList = parseResponseFromList(clazz, response.body()); + asyncResponse.setResult(resultList); + } catch (Exception e) { + asyncResponse.setException(e); } + } else { + asyncResponse.setException(errorResponseException(response)); } + } ); future.onError(asyncResponse::setException); return asyncResponse; @@ -44,44 +44,44 @@ public AsyncResponse> callAndParseMap(String key, DiscordRequest req AsyncResponse> asyncResponse = new AsyncResponse<>(); DiscordResponseFuture future = dispatcher.queue(request); future.onSuccess( - response -> { - if (isSuccessfulResponse(response)) { - try { - List resultList = parseResponseFromMap(key, response.body()); - asyncResponse.setResult(resultList); - } catch (Exception e) { - asyncResponse.setException(e); - } - } else { - asyncResponse.setException(errorResponseException(response)); + response -> { + if (isSuccessfulResponse(response)) { + try { + List resultList = parseResponseFromMap(key, response.body()); + asyncResponse.setResult(resultList); + } catch (Exception e) { + asyncResponse.setException(e); } + } else { + asyncResponse.setException(errorResponseException(response)); } + } ); future.onError(asyncResponse::setException); return asyncResponse; } private List parseResponseFromList( - Class elementType, - String response + Class elementType, + String response ) throws JsonProcessingException { return OBJECT_MAPPER.readValue( - response, - OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, elementType) + response, + OBJECT_MAPPER.getTypeFactory().constructCollectionType(List.class, elementType) ); } private List parseResponseFromMap( - String key, - String response + String key, + String response ) throws JsonProcessingException { Map> res = - OBJECT_MAPPER.readValue( - response, - OBJECT_MAPPER - .getTypeFactory() - .constructMapType(Map.class, String.class, List.class) - ); + OBJECT_MAPPER.readValue( + response, + OBJECT_MAPPER + .getTypeFactory() + .constructMapType(Map.class, String.class, List.class) + ); return res.get(key); } @@ -94,9 +94,9 @@ public AsyncResponse callAndParse(Class clazz, DiscordRequest request) } private void success( - Class type, - DiscordResponse response, - AsyncResponse asyncResponse + Class type, + DiscordResponse response, + AsyncResponse asyncResponse ) { if (isSuccessfulResponse(response)) { try { @@ -119,7 +119,7 @@ private boolean isSuccessfulResponse(DiscordResponse response) { private Throwable errorResponseException(DiscordResponse response) { return new Exception( - "Received HTTP status code " + response.status() + " " + response.body() + "Received HTTP status code " + response.status() + " " + response.body() ); } -} \ No newline at end of file +} diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java b/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java index 02426334..e1220c98 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/StickerRequest.java @@ -31,7 +31,7 @@ public AsyncResponse createGuildSticker( public AsyncResponse deleteGuildSticker(long stickerId) { return responseParser.callAndParse( - Void.class, new DeleteGuildStickerRequest(guildId, stickerId) + Void.class, new DeleteGuildStickerRequest(guildId, stickerId) ); }