Skip to content

Commit f6f3628

Browse files
committed
Fix choices in SlashCommand parsing
1 parent 9904af9 commit f6f3628

File tree

7 files changed

+135
-10
lines changed

7 files changed

+135
-10
lines changed

annotations/src/main/java/com/javadiscord/jdi/core/annotations/CommandOption.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@
1515

1616
CommandOptionType type();
1717

18+
CommandOptionChoice[] choices() default {};
19+
1820
boolean required() default true;
1921
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.javadiscord.jdi.core.annotations;
2+
3+
import java.lang.annotation.Retention;
4+
import java.lang.annotation.RetentionPolicy;
5+
import java.lang.annotation.Target;
6+
7+
@Retention(RetentionPolicy.RUNTIME)
8+
@Target({})
9+
public @interface CommandOptionChoice {
10+
String name();
11+
12+
String value();
13+
}

api/src/main/java/com/javadiscord/jdi/core/api/builders/command/CommandOption.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ public CommandOption addChoice(String name, String value) {
2929
return this;
3030
}
3131

32+
public CommandOption addChoice(List<CommandOptionChoice> commandOptionChoices) {
33+
choices.addAll(commandOptionChoices);
34+
return this;
35+
}
36+
3237
public CommandOption setRequired(boolean required) {
3338
this.required = required;
3439
return this;

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

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.javadiscord.jdi.core.api.builders.command.CommandBuilder;
2020
import com.javadiscord.jdi.core.api.builders.command.CommandOption;
21+
import com.javadiscord.jdi.core.api.builders.command.CommandOptionChoice;
2122
import com.javadiscord.jdi.core.api.builders.command.CommandOptionType;
2223
import com.javadiscord.jdi.core.interaction.InteractionEventHandler;
2324
import com.javadiscord.jdi.core.models.ready.ReadyEvent;
@@ -164,13 +165,35 @@ private void registerLoadedAnnotationsWithDiscord() {
164165
Method optionRequiredMethod = option.getClass().getMethod("required");
165166
boolean optionRequired = (boolean) optionRequiredMethod.invoke(option);
166167

168+
List<CommandOptionChoice> choices = new ArrayList<>();
169+
170+
Object[] choicesArray =
171+
(Object[]) option.getClass().getMethod("choices").invoke(option);
172+
173+
for (Object choice : choicesArray) {
174+
Annotation annotation1 = (Annotation) choice;
175+
if (
176+
annotation1.annotationType().getName().equals(
177+
"com.javadiscord.jdi.core.annotations.CommandOptionChoice"
178+
)
179+
) {
180+
Method nameMethod1 =
181+
annotation1.annotationType().getMethod("name");
182+
Method valueMethod1 =
183+
annotation1.annotationType().getMethod("value");
184+
String name1 = (String) nameMethod1.invoke(annotation1);
185+
String value1 = (String) valueMethod1.invoke(annotation1);
186+
choices.add(new CommandOptionChoice(value1, name1));
187+
}
188+
}
189+
167190
builder.addOption(
168191
new CommandOption(
169192
optionName,
170193
optionDescription,
171194
CommandOptionType.fromName(optionTypeValue),
172195
optionRequired
173-
)
196+
).addChoice(choices)
174197
);
175198
}
176199

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ public InteractionData interactionData() {
3232
return interaction.data();
3333
}
3434

35-
public Object option(String name) {
35+
public ApplicationCommandOption option(String name) {
3636
InteractionData interactionData = interaction.data();
3737
ApplicationCommandOption[] options = interactionData.options();
3838
for (ApplicationCommandOption option : options) {
3939
if (option.name().equals(name)) {
40-
return option.value();
40+
return option;
4141
}
4242
}
4343
return null;

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

Lines changed: 84 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import com.javadiscord.jdi.core.CommandOptionType;
44
import com.javadiscord.jdi.core.Guild;
55
import com.javadiscord.jdi.core.annotations.CommandOption;
6+
import com.javadiscord.jdi.core.annotations.CommandOptionChoice;
67
import com.javadiscord.jdi.core.annotations.SlashCommand;
8+
import com.javadiscord.jdi.core.api.builders.CreateMessageBuilder;
79
import com.javadiscord.jdi.core.interaction.SlashCommandEvent;
810
import com.javadiscord.jdi.core.models.application.ApplicationCommandOption;
911

@@ -12,23 +14,98 @@ public class ExampleSlashCommand {
1214
@SlashCommand(
1315
name = "quiz", description = "A fun Java quiz", options = {
1416
@CommandOption(
15-
name = "q1", description = "What is an Integer?", type = CommandOptionType.STRING
17+
name = "q1", description = "What is an Integer?", type = CommandOptionType.STRING, choices = {
18+
@CommandOptionChoice(
19+
name = "option1", value = "An object that represents a number"
20+
),
21+
@CommandOptionChoice(name = "option2", value = "A class used to store objects"),
22+
@CommandOptionChoice(name = "option3", value = "A primitive data type")
23+
}
1624
),
1725
@CommandOption(
18-
name = "q2", description = "What package is List in?", type = CommandOptionType.STRING
26+
name = "q2", description = "In which package is the List interface defined?", type = CommandOptionType.STRING, choices = {
27+
@CommandOptionChoice(name = "option1", value = "java.util"),
28+
@CommandOptionChoice(name = "option2", value = "java.lang"),
29+
@CommandOptionChoice(name = "option3", value = "java.io")
30+
}
1931
),
2032
@CommandOption(
21-
name = "q3", description = "What does JVM stand for?", type = CommandOptionType.STRING
33+
name = "q3", description = "What does JVM stand for?", type = CommandOptionType.STRING, choices = {
34+
@CommandOptionChoice(name = "option1", value = "Java Virtual Machine"),
35+
@CommandOptionChoice(name = "option2", value = "Java Verified Module"),
36+
@CommandOptionChoice(name = "option3", value = "Java Variable Method")
37+
}
2238
),
2339
@CommandOption(
24-
name = "q4", description = "Is a String a primitive?", type = CommandOptionType.STRING
40+
name = "q4", description = "Is a String a primitive data type?", type = CommandOptionType.STRING, choices = {
41+
@CommandOptionChoice(name = "option1", value = "Yes"),
42+
@CommandOptionChoice(name = "option2", value = "No")
43+
}
2544
),
45+
@CommandOption(
46+
name = "q5", description = "Which of the following is not a Java keyword?", type = CommandOptionType.STRING, choices = {
47+
@CommandOptionChoice(name = "option1", value = "static"),
48+
@CommandOptionChoice(name = "option2", value = "void"),
49+
@CommandOptionChoice(name = "option3", value = "main"),
50+
@CommandOptionChoice(name = "option4", value = "private")
51+
}
52+
)
2653
}
2754
)
2855
public void handle(SlashCommandEvent event, Guild guild) {
29-
ApplicationCommandOption[] options = event.options();
30-
for (ApplicationCommandOption option : options) {
31-
System.out.println("Received " + option.name() + " value " + option.valueAsString());
56+
ApplicationCommandOption q1 = event.option("q1");
57+
ApplicationCommandOption q2 = event.option("q2");
58+
ApplicationCommandOption q3 = event.option("q3");
59+
ApplicationCommandOption q4 = event.option("q4");
60+
ApplicationCommandOption q5 = event.option("q5");
61+
62+
// Check answers and prepare feedback
63+
StringBuilder feedback = new StringBuilder();
64+
int score = 0;
65+
66+
if (q1.toString().equals("option1")) {
67+
score++;
68+
feedback.append("Q1: Correct!\n");
69+
} else {
70+
feedback.append("Q1: Incorrect\n");
71+
}
72+
73+
if (q2.toString().equals("option1")) {
74+
score++;
75+
feedback.append("Q2: Correct!\n");
76+
} else {
77+
feedback.append("Q1: Incorrect\n");
78+
}
79+
80+
if (q3.toString().equals("option1")) {
81+
score++;
82+
feedback.append("Q3: Correct!\n");
83+
} else {
84+
feedback.append("Q1: Incorrect\n");
3285
}
86+
87+
if (q4.toString().equals("option2")) {
88+
score++;
89+
feedback.append("Q4: Correct!\n");
90+
} else {
91+
feedback.append("Q1: Incorrect\n");
92+
}
93+
94+
if (q5.toString().equals("option3")) {
95+
score++;
96+
feedback.append("Q5: Correct!\n");
97+
} else {
98+
feedback.append("Q1: Incorrect\n");
99+
}
100+
101+
feedback.append("Your score: ").append(score).append("/5");
102+
103+
if (score == 5) {
104+
feedback.append("\nCongratulations! You you all the questions right!\n");
105+
}
106+
107+
guild.channel().createMessage(
108+
new CreateMessageBuilder(event.channel().id()).content(feedback.toString())
109+
);
33110
}
34111
}

models/src/main/java/com/javadiscord/jdi/core/models/application/ApplicationCommandOption.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,9 @@ public double valueAsDouble() {
2929
public boolean valueAsBoolean() {
3030
return (boolean) value;
3131
}
32+
33+
@Override
34+
public String toString() {
35+
return String.valueOf(value == null ? "" : value);
36+
}
3237
}

0 commit comments

Comments
 (0)