Skip to content

Commit 04dbec3

Browse files
committed
Added SlashCommandEvent object for slash commands
1 parent dd10bfd commit 04dbec3

File tree

7 files changed

+99
-13
lines changed

7 files changed

+99
-13
lines changed

annotations/src/main/java/com/javadiscord/jdi/core/processor/SlashCommandValidator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ public class SlashCommandValidator {
2121
new String[] {
2222
"com.javadiscord.jdi.core.models.guild.Interaction",
2323
"com.javadiscord.jdi.core.Discord",
24-
"com.javadiscord.jdi.core.Guild"
24+
"com.javadiscord.jdi.core.Guild",
25+
"com.javadiscord.jdi.core.interaction.SlashCommandEvent"
2526
}
2627
);
2728
}

core/src/main/java/com/javadiscord/jdi/core/Discord.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,8 @@ private void loadSlashCommands() {
220220
if (parameters.getType().equals(Map.class)) {
221221
eventListeners.add(
222222
new InteractionEventHandler(
223-
constructor.newInstance(loadedSlashCommands)
223+
constructor.newInstance(loadedSlashCommands),
224+
this
224225
)
225226
);
226227
return;
@@ -235,7 +236,7 @@ private void loadSlashCommands() {
235236

236237
public void start() {
237238
started = true;
238-
239+
239240
webSocketManager =
240241
new WebSocketManager(
241242
new GatewaySetting().setApiVersion(10).setEncoding(GatewayEncoding.JSON),
@@ -260,7 +261,7 @@ public void stop() {
260261
if (this.webSocketManager != null) {
261262
this.webSocketManager.stop();
262263
}
263-
264+
264265
LOGGER.info("Shutdown initiated");
265266

266267
if (webSocketManager != null) {

core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public GatewayEventListener(Discord discord) {
3737
this.discord = discord;
3838
}
3939

40-
static Guild getGuild(Discord discord, Object event) {
40+
public static Guild getGuild(Discord discord, Object event) {
4141
if (event instanceof com.javadiscord.jdi.core.models.guild.Guild) {
4242
return new Guild(
4343
(com.javadiscord.jdi.core.models.guild.Guild) event,

core/src/main/java/com/javadiscord/jdi/core/interaction/InteractionEventHandler.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package com.javadiscord.jdi.core.interaction;
22

33
import java.lang.reflect.Method;
4+
import java.lang.reflect.Parameter;
5+
import java.util.ArrayList;
6+
import java.util.List;
47

8+
import com.javadiscord.jdi.core.Discord;
59
import com.javadiscord.jdi.core.EventListener;
10+
import com.javadiscord.jdi.core.GatewayEventListener;
611
import com.javadiscord.jdi.core.Guild;
712
import com.javadiscord.jdi.core.models.guild.Interaction;
813

@@ -12,9 +17,11 @@
1217
public class InteractionEventHandler implements EventListener {
1318
private static final Logger LOGGER = LogManager.getLogger(InteractionEventHandler.class);
1419
private final Object slashCommandLoader;
20+
private final Discord discord;
1521

16-
public InteractionEventHandler(Object slashCommandLoader) {
22+
public InteractionEventHandler(Object slashCommandLoader, Discord discord) {
1723
this.slashCommandLoader = slashCommandLoader;
24+
this.discord = discord;
1825
}
1926

2027
@Override
@@ -39,9 +46,32 @@ public void onInteractionCreate(Interaction interaction, Guild guild) {
3946
(Class<?>) commandClassMethodInstance.getClass().getMethod("clazz")
4047
.invoke(commandClassMethodInstance);
4148

42-
Method method =
43-
(Method) commandClassMethodInstance.getClass().getMethod("method")
44-
.invoke(commandClassMethodInstance);
49+
Method method = commandClassMethodInstance.getClass().getMethod("method");
50+
51+
List<Object> paramOrder = new ArrayList<>();
52+
Parameter[] parameters = method.getParameters();
53+
for (Parameter parameter : parameters) {
54+
if (parameter.getParameterizedType() == interaction.getClass()) {
55+
paramOrder.add(interaction);
56+
} else if (parameter.getParameterizedType() == Discord.class) {
57+
paramOrder.add(discord);
58+
} else if (parameter.getParameterizedType() == Guild.class) {
59+
paramOrder.add(GatewayEventListener.getGuild(discord, interaction.guild()));
60+
} else if (parameter.getParameterizedType() == SlashCommandEvent.class) {
61+
paramOrder.add(new SlashCommandEvent(interaction, discord));
62+
}
63+
}
64+
65+
if (paramOrder.size() != method.getParameterCount()) {
66+
throw new RuntimeException(
67+
"Bound "
68+
+ paramOrder.size()
69+
+ " parameters but expected "
70+
+ method.getParameterCount()
71+
);
72+
}
73+
74+
method.invoke(commandClassMethodInstance, paramOrder.toArray());
4575

4676
Object handlerInstance = handler.getDeclaredConstructor().newInstance();
4777
method.invoke(handlerInstance);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.javadiscord.jdi.core.interaction;
2+
3+
import com.javadiscord.jdi.core.Discord;
4+
import com.javadiscord.jdi.core.GatewayEventListener;
5+
import com.javadiscord.jdi.core.Guild;
6+
import com.javadiscord.jdi.core.models.application.ApplicationCommandOption;
7+
import com.javadiscord.jdi.core.models.channel.Channel;
8+
import com.javadiscord.jdi.core.models.guild.Interaction;
9+
import com.javadiscord.jdi.core.models.guild.InteractionData;
10+
import com.javadiscord.jdi.core.models.guild.InteractionType;
11+
import com.javadiscord.jdi.core.models.user.User;
12+
13+
public record SlashCommandEvent(Interaction interaction, Discord discord) {
14+
15+
public Channel channel() {
16+
return interaction.channel();
17+
}
18+
19+
public Guild guild() {
20+
return GatewayEventListener.getGuild(discord, interaction.guild());
21+
}
22+
23+
public User user() {
24+
return interaction.user();
25+
}
26+
27+
public InteractionType interactionType() {
28+
return interaction.type();
29+
}
30+
31+
public InteractionData interactionData() {
32+
return interaction.data();
33+
}
34+
35+
public Object option(String name) {
36+
InteractionData interactionData = interaction.data();
37+
ApplicationCommandOption[] options = interactionData.options();
38+
for (ApplicationCommandOption option : options) {
39+
if (option.name().equals(name)) {
40+
return option.value();
41+
}
42+
}
43+
return null;
44+
}
45+
46+
public ApplicationCommandOption[] options() {
47+
return interaction.data().options();
48+
}
49+
}

example/echo-bot/src/main/java/com/javadiscord/jdi/example/ExampleSlashCommand.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.javadiscord.jdi.core.CommandOptionType;
44
import com.javadiscord.jdi.core.annotations.CommandOption;
55
import com.javadiscord.jdi.core.annotations.SlashCommand;
6+
import com.javadiscord.jdi.core.interaction.SlashCommandEvent;
7+
import com.javadiscord.jdi.core.models.application.ApplicationCommandOption;
68

79
public class ExampleSlashCommand {
810

@@ -22,7 +24,10 @@ public class ExampleSlashCommand {
2224
),
2325
}
2426
)
25-
public void handle() {
26-
// TODO: Logic to handle the slash command
27+
public void handle(SlashCommandEvent event) {
28+
ApplicationCommandOption[] options = event.options();
29+
for (ApplicationCommandOption option : options) {
30+
System.out.println("Received " + option.name() + " value " + option.value());
31+
}
2732
}
2833
}

models/src/main/java/com/javadiscord/jdi/core/models/guild/InteractionData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ public record InteractionData(
1212
@JsonProperty("type") int type,
1313
@JsonProperty("resolved") ResolvedData resolved,
1414
@JsonProperty("options") ApplicationCommandOption[] options,
15-
@JsonProperty("guild_id") Long guildId,
16-
@JsonProperty("target_id") Long targetId
15+
@JsonProperty("guild_id") long guildId,
16+
@JsonProperty("target_id") long targetId
1717
) {}

0 commit comments

Comments
 (0)