Skip to content

Commit 842e934

Browse files
committed
Added slash command request classes to :api module
1 parent f9f633d commit 842e934

File tree

10 files changed

+300
-0
lines changed

10 files changed

+300
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.javadiscord.jdi.core.api;
2+
3+
import com.javadiscord.jdi.core.api.builders.command.CommandBuilder;
4+
import com.javadiscord.jdi.core.api.builders.command.CommandOption;
5+
6+
public class InteractionRequest {
7+
private final DiscordResponseParser responseParser;
8+
private final long guildId;
9+
private final long applicationId;
10+
11+
public InteractionRequest(
12+
DiscordResponseParser responseParser, long guildId, long applicationId
13+
) {
14+
this.responseParser = responseParser;
15+
this.guildId = guildId;
16+
this.applicationId = applicationId;
17+
}
18+
19+
public AsyncResponse<Void> createInteraction(CommandBuilder builder) {
20+
return responseParser
21+
.callAndParse(Void.class, builder.applicationId(applicationId).build());
22+
}
23+
24+
public AsyncResponse<Void> createSlashCommand(
25+
String name,
26+
String description,
27+
CommandOption... options
28+
) {
29+
CommandBuilder builder =
30+
new CommandBuilder(
31+
name,
32+
description
33+
);
34+
for (CommandOption option : options) {
35+
builder.addOption(option);
36+
}
37+
builder.applicationId(applicationId);
38+
return createInteraction(builder);
39+
}
40+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.javadiscord.jdi.core.api.builders.command;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Optional;
6+
7+
import com.javadiscord.jdi.internal.api.application_commands.CreateCommandRequest;
8+
9+
public class CommandBuilder {
10+
private final String name;
11+
private final CommandOptionType type;
12+
private final String description;
13+
private final List<CommandOption> options;
14+
15+
private Optional<Boolean> global;
16+
17+
private long applicationId;
18+
private long guildId;
19+
20+
public CommandBuilder(
21+
String name, String description
22+
) {
23+
this.name = name;
24+
this.type = CommandOptionType.SUB_COMMAND;
25+
this.description = description;
26+
this.options = new ArrayList<>();
27+
this.global = Optional.empty();
28+
}
29+
30+
public CommandBuilder addOption(CommandOption option) {
31+
options.add(option);
32+
return this;
33+
}
34+
35+
public CommandBuilder global(boolean global) {
36+
this.global = Optional.of(global);
37+
return this;
38+
}
39+
40+
public CommandBuilder guildId(long guildId) {
41+
this.guildId = guildId;
42+
return this;
43+
}
44+
45+
public CommandBuilder applicationId(long applicationId) {
46+
this.applicationId = applicationId;
47+
return this;
48+
}
49+
50+
public CreateCommandRequest build() {
51+
return new CreateCommandRequest(
52+
name,
53+
type,
54+
description,
55+
options,
56+
global,
57+
guildId,
58+
applicationId
59+
);
60+
}
61+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.javadiscord.jdi.core.api.builders.command;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class CommandOption {
7+
private final String name;
8+
private final String description;
9+
private final CommandOptionType type;
10+
private boolean required;
11+
private final List<CommandOptionChoice> choices;
12+
13+
public CommandOption(String name, String description, CommandOptionType type) {
14+
this(name, description, type, true);
15+
}
16+
17+
public CommandOption(
18+
String name, String description, CommandOptionType type, boolean required
19+
) {
20+
this.name = name;
21+
this.description = description;
22+
this.type = type;
23+
this.required = required;
24+
this.choices = new ArrayList<>();
25+
}
26+
27+
public CommandOption addChoice(String name, String value) {
28+
choices.add(new CommandOptionChoice(name, value));
29+
return this;
30+
}
31+
32+
public CommandOption setRequired(boolean required) {
33+
this.required = required;
34+
return this;
35+
}
36+
37+
public String getName() {
38+
return name;
39+
}
40+
41+
public String getDescription() {
42+
return description;
43+
}
44+
45+
public CommandOptionType getType() {
46+
return type;
47+
}
48+
49+
public boolean isRequired() {
50+
return required;
51+
}
52+
53+
public List<CommandOptionChoice> getChoices() {
54+
return choices;
55+
}
56+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.javadiscord.jdi.core.api.builders.command;
2+
3+
public record CommandOptionChoice(String name, String value) {}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.javadiscord.jdi.core.api.builders.command;
2+
3+
import com.fasterxml.jackson.annotation.JsonValue;
4+
5+
public enum CommandOptionType {
6+
SUB_COMMAND(1),
7+
SUB_COMMAND_GROUP(2),
8+
STRING(3),
9+
INTEGER(4),
10+
BOOLEAN(5),
11+
USER(6),
12+
CHANNEL(7),
13+
ROLE(8),
14+
MENTIONABLE(9),
15+
NUMBER(10),
16+
ATTACHMENT(11),
17+
;
18+
19+
private final int value;
20+
21+
CommandOptionType(int value) {
22+
this.value = value;
23+
}
24+
25+
@JsonValue
26+
public int getValue() {
27+
return value;
28+
}
29+
30+
public static CommandOptionType fromName(String name) {
31+
for (CommandOptionType type : CommandOptionType.values()) {
32+
if (type.name().equalsIgnoreCase(name)) {
33+
return type;
34+
}
35+
}
36+
throw new IllegalArgumentException("Unknown command option type: " + name);
37+
}
38+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.javadiscord.jdi.internal.api.application_commands;
2+
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.Optional;
7+
8+
import com.javadiscord.jdi.core.api.builders.command.CommandOption;
9+
import com.javadiscord.jdi.core.api.builders.command.CommandOptionType;
10+
import com.javadiscord.jdi.internal.api.DiscordRequest;
11+
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;
12+
13+
public record CreateCommandRequest(
14+
String name,
15+
CommandOptionType type,
16+
String description,
17+
List<CommandOption> options,
18+
Optional<Boolean> global,
19+
long guildId,
20+
long applicationId
21+
) implements DiscordRequest {
22+
23+
@Override
24+
public DiscordRequestBuilder create() {
25+
26+
String path = "/applications/%s/commands".formatted(applicationId);
27+
28+
if (global.isPresent() && global.get()) {
29+
path = "/applications/%s/guilds/%s/commands".formatted(applicationId, guildId);
30+
}
31+
32+
Map<String, Object> body = new HashMap<>();
33+
body.put("name", name);
34+
body.put("type", type);
35+
body.put("description", description);
36+
37+
if (!options.isEmpty()) {
38+
body.put("options", options);
39+
}
40+
41+
return new DiscordRequestBuilder()
42+
.post()
43+
.body(body)
44+
.path(path);
45+
}
46+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.javadiscord.jdi.internal.api.application_commands;
2+
3+
import java.util.Optional;
4+
5+
import com.javadiscord.jdi.internal.api.DiscordRequest;
6+
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;
7+
8+
public record DeleteCommandRequest(
9+
long applicationId,
10+
Optional<Long> guildId,
11+
long commandId
12+
) implements DiscordRequest {
13+
14+
@Override
15+
public DiscordRequestBuilder create() {
16+
// TODO: Implement
17+
// https://discord.com/developers/docs/interactions/application-commands#updating-and-deleting-a-command
18+
return null;
19+
}
20+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.javadiscord.jdi.internal.api.application_commands;
2+
3+
import com.javadiscord.jdi.internal.api.DiscordRequest;
4+
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;
5+
6+
public record EditCommandRequest() implements DiscordRequest {
7+
8+
@Override
9+
public DiscordRequestBuilder create() {
10+
return null;
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.javadiscord.jdi.internal.api.application_commands;
2+
3+
import com.javadiscord.jdi.internal.api.DiscordRequest;
4+
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;
5+
6+
public record FetchCommandRequest() implements DiscordRequest {
7+
8+
@Override
9+
public DiscordRequestBuilder create() {
10+
return null;
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.javadiscord.jdi.internal.api.application_commands;
2+
3+
import com.javadiscord.jdi.internal.api.DiscordRequest;
4+
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;
5+
6+
public record FetchCommandsRequest() implements DiscordRequest {
7+
8+
@Override
9+
public DiscordRequestBuilder create() {
10+
return null;
11+
}
12+
}

0 commit comments

Comments
 (0)