Skip to content

Integration tests for ChannelRequest #127

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 6 additions & 12 deletions api/src/main/java/com/javadiscord/jdi/core/api/ChannelRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import com.javadiscord.jdi.core.api.builders.*;
import com.javadiscord.jdi.core.models.channel.Channel;
import com.javadiscord.jdi.core.models.channel.ThreadMember;
import com.javadiscord.jdi.core.models.emoji.Emoji;
import com.javadiscord.jdi.core.models.invite.Invite;
import com.javadiscord.jdi.core.models.message.Message;
import com.javadiscord.jdi.core.models.message.MessageReaction;
import com.javadiscord.jdi.core.models.user.User;
import com.javadiscord.jdi.internal.api.channel.*;

Expand Down Expand Up @@ -49,13 +49,13 @@ public AsyncResponse<Message> createMessage(CreateMessageBuilder builder) {
return responseParser.callAndParse(Message.class, builder.build());
}

public AsyncResponse<MessageReaction> createReaction(
public AsyncResponse<Void> createReaction(
long channelId,
long messageId,
String emoji
Emoji emoji
) {
return responseParser.callAndParse(
MessageReaction.class, new CreateReactionRequest(channelId, messageId, emoji)
Void.class, new CreateReactionRequest(channelId, messageId, emoji)
);
}

Expand Down Expand Up @@ -211,14 +211,8 @@ public AsyncResponse<List<ThreadMember>> listThreadMembers(ListThreadMembersBuil
return responseParser.callAndParseList(ThreadMember.class, builder.build());
}

public AsyncResponse<Channel> modifyChannel(
long channelId,
String name,
String base64EncodedIcon
) {
return responseParser.callAndParse(
Channel.class, new ModifyChannelRequest(channelId, name, base64EncodedIcon)
);
public AsyncResponse<Channel> modifyChannel(ModifyChannelBuilder builder) {
return responseParser.callAndParse(Channel.class, builder.build());
}

public AsyncResponse<Void> pinMessage(long channelId, long messageId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ public AsyncResponse<Emoji> getEmoji(long emojiId) {
return responseParser.callAndParse(Emoji.class, new GetEmojiRequest(guildId, emojiId));
}

public AsyncResponse<Emoji> getEmojis() {
return responseParser.callAndParse(Emoji.class, new GetEmojisRequest(guildId));
public AsyncResponse<List<Emoji>> getEmojis() {
return responseParser.callAndParseList(Emoji.class, new GetEmojisRequest(guildId));
}

public AsyncResponse<Emoji> modifyEmoji(ModifyEmojiBuilder builder) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.javadiscord.jdi.core.api.builders;

import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

Expand All @@ -22,8 +21,7 @@ public class CreateMessageBuilder {
private Optional<List<Integer>> components;
private Optional<List<Long>> stickerIds;
private Optional<List<Path>> files;
private Optional<String> payloadJson;
private List<MessageAttachment> attachments;
private Optional<List<MessageAttachment>> attachments;
private Optional<Integer> flags;
private Optional<Boolean> enforceNonce;

Expand All @@ -38,8 +36,7 @@ public CreateMessageBuilder(long channelId) {
this.components = Optional.empty();
this.stickerIds = Optional.empty();
this.files = Optional.empty();
this.payloadJson = Optional.empty();
this.attachments = new ArrayList<>();
this.attachments = Optional.empty();
this.flags = Optional.empty();
this.enforceNonce = Optional.empty();
}
Expand Down Expand Up @@ -89,13 +86,8 @@ public CreateMessageBuilder files(List<Path> files) {
return this;
}

public CreateMessageBuilder payloadJson(String payloadJson) {
this.payloadJson = Optional.of(payloadJson);
return this;
}

public CreateMessageBuilder attachments(List<MessageAttachment> attachments) {
this.attachments = attachments;
this.attachments = Optional.of(attachments);
return this;
}

Expand All @@ -121,7 +113,6 @@ public CreateMessageRequest build() {
components,
stickerIds,
files,
payloadJson,
attachments,
flags,
enforceNonce
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.javadiscord.jdi.core.api.builders;

import java.util.Optional;

import com.javadiscord.jdi.internal.api.channel.ModifyChannelRequest;

public class ModifyChannelBuilder {
private final long channelId;
private Optional<String> name;
private Optional<String> base64EncodedIcon;

public ModifyChannelBuilder(long channelId) {
this.channelId = channelId;
this.name = Optional.empty();
this.base64EncodedIcon = Optional.empty();
}

public ModifyChannelBuilder name(String name) {
this.name = Optional.of(name);
return this;
}

public ModifyChannelBuilder base64EncodedIcon(String base64EncodedIcon) {
this.base64EncodedIcon = Optional.of(base64EncodedIcon);
return this;
}

public ModifyChannelRequest build() {
return new ModifyChannelRequest(channelId, name, base64EncodedIcon);
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
package com.javadiscord.jdi.internal.api.channel;

import java.io.FileNotFoundException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import com.javadiscord.jdi.core.api.utils.DiscordImageUtil;
import com.javadiscord.jdi.core.models.channel.ChannelMention;
import com.javadiscord.jdi.core.models.message.MessageAttachment;
import com.javadiscord.jdi.core.models.message.MessageReference;
import com.javadiscord.jdi.core.models.message.embed.Embed;
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 CreateMessageRequest(
Expand All @@ -26,18 +29,18 @@ public record CreateMessageRequest(
Optional<List<Integer>> components,
Optional<List<Long>> stickerIds,
Optional<List<Path>> files,
Optional<String> payloadJson,
List<MessageAttachment> attachments,
Optional<List<MessageAttachment>> attachments,
Optional<Integer> flags,
Optional<Boolean> enforceNonce
) implements DiscordRequest {

/** TODO: Add functionality for the enforceNonce flag */
@Override
public DiscordRequestBuilder create() {
MultipartBodyPublisher.Builder bodyBuilder = MultipartBodyPublisher.newBuilder();
MultipartBodyPublisher.Builder multiPartBody = MultipartBodyPublisher.newBuilder();

Map<String, Object> body = new HashMap<>();

content.ifPresent(val -> body.put("content", val));
nonce.ifPresent(val -> body.put("nonce", val));
tts.ifPresent(val -> body.put("tts", val));
Expand All @@ -47,16 +50,39 @@ public DiscordRequestBuilder create() {
components.ifPresent(val -> body.put("components", val));
stickerIds.ifPresent(val -> body.put("sticker_ids", val));
flags.ifPresent(val -> body.put("flags", val));

attachments.ifPresent(val -> body.put("attachments", val));

enforceNonce.ifPresent(val -> body.put("enforce_nonce", val));

if (payloadJson.isPresent()) {
if (files.isPresent()) {
List<Path> f = files.get();
for (int i = 0; i < f.size(); i++) {
try {
Path path = f.get(i);
String name = "files[" + i + "]";

String extension = DiscordImageUtil.getExtension(path);

switch (extension) {
case "png" -> multiPartBody.filePart(name, path, MediaType.IMAGE_PNG);
case "jpg", "jpeg" ->
multiPartBody.filePart(name, path, MediaType.IMAGE_JPEG);
case "gif" -> multiPartBody.filePart(name, path, MediaType.IMAGE_GIF);
default -> multiPartBody.filePart(name, path, MediaType.ANY);
}

} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}

bodyBuilder.textPart("payload_json", body);
body.forEach(multiPartBody::textPart);

return new DiscordRequestBuilder()
.post()
.path("/channels/%s/messages".formatted(channelId))
.multipartBody(bodyBuilder.build());
.multipartBody(multiPartBody.build());
}

return new DiscordRequestBuilder()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
package com.javadiscord.jdi.internal.api.channel;

import com.javadiscord.jdi.core.models.emoji.Emoji;
import com.javadiscord.jdi.internal.api.DiscordRequest;
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;

public record CreateReactionRequest(
long channelId,
long messageId,
String emoji
Emoji emoji
) implements DiscordRequest {
@Override
public DiscordRequestBuilder create() {
return new DiscordRequestBuilder()
.put()
.path(
"/channels/%s/messages/%s/reactions/%s/@me"
.formatted(channelId, messageId, emoji)
.formatted(channelId, messageId, ":%s:%d".formatted(emoji.name(), emoji.id()))
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public DiscordRequestBuilder create() {
after.ifPresent(val -> requestBuilder.queryParam("after", val));

requestBuilder.queryParam("limit", limit);
requestBuilder.path("/channels/%s".formatted(channelId));
requestBuilder.path("/channels/%s/messages".formatted(channelId));
return requestBuilder;
}
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
package com.javadiscord.jdi.internal.api.channel;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import com.javadiscord.jdi.internal.api.DiscordRequest;
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;

public record ModifyChannelRequest(
long channelId,
String name,
String base64EncodedIcon
Optional<String> name,
Optional<String> base64EncodedIcon
) implements DiscordRequest {

@Override
public DiscordRequestBuilder create() {
Map<String, Object> body = new HashMap<>();

name.ifPresent(val -> body.put("name", val));
base64EncodedIcon.ifPresent(val -> body.put("icon", val));

return new DiscordRequestBuilder()
.patch()
.path("/channels/%s".formatted(channelId))
.body(
Map.of(
"name", name,
"icon", base64EncodedIcon
)
);
.body(body);
}
}
Loading
Loading