Skip to content

Commit 4d32ce6

Browse files
committed
* Added defer/reply for slash command
* Fix performance with dynamic loading * General cleanup
1 parent f6f3628 commit 4d32ce6

File tree

10 files changed

+430
-63
lines changed

10 files changed

+430
-63
lines changed

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

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,37 @@
1212
import javassist.bytecode.ClassFile;
1313

1414
public class ClassFileUtil {
15+
private static final List<File> classesInPath = new ArrayList<>();
1516

1617
private ClassFileUtil() {}
1718

1819
public static List<File> getClassesInClassPath() {
19-
List<File> classes = new ArrayList<>();
20+
if (!classesInPath.isEmpty()) {
21+
return classesInPath;
22+
}
2023
String classpath = System.getProperty("java.class.path");
2124
String[] classpathEntries = classpath.split(File.pathSeparator);
25+
2226
for (String entry : classpathEntries) {
27+
if (
28+
entry.contains("io.netty")
29+
|| entry.contains("org.apache")
30+
|| entry.contains("io.vertx")
31+
|| entry.contains("com.fasterxml")
32+
|| entry.contains("org.javassist")
33+
|| entry.contains("com.github.mizosoft.methanol")
34+
) {
35+
continue;
36+
}
37+
2338
File file = new File(entry);
2439
try {
25-
classes.addAll(getClasses(file));
40+
classesInPath.addAll(getClasses(file));
2641
} catch (IOException ignore) {
2742
/* Ignore */
2843
}
2944
}
30-
return classes;
45+
return classesInPath;
3146
}
3247

3348
public static String getClassName(File file) throws IOException {

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

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,7 @@ private void loadInteractionListeners() {
2525
List<File> classes = ClassFileUtil.getClassesInClassPath();
2626
for (File classFile : classes) {
2727
try {
28-
29-
String name = ClassFileUtil.getClassName(classFile);
30-
if (
31-
name.contains("io.netty")
32-
|| name.contains("org.apache")
33-
|| name.contains("io.vertx")
34-
|| name.contains("com.fasterxml")
35-
) {
36-
continue;
37-
}
38-
39-
Class<?> clazz = Class.forName(name);
28+
Class<?> clazz = Class.forName(ClassFileUtil.getClassName(classFile));
4029

4130
Method[] methods = clazz.getMethods();
4231
for (Method method : methods) {
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package com.javadiscord.jdi.core.api.builders.command;
2+
3+
import java.util.List;
4+
5+
import com.javadiscord.jdi.core.models.channel.AllowedMentions;
6+
import com.javadiscord.jdi.core.models.channel.Attachment;
7+
import com.javadiscord.jdi.core.models.message.Component;
8+
import com.javadiscord.jdi.core.models.message.embed.Embed;
9+
import com.javadiscord.jdi.core.models.poll.Poll;
10+
11+
import com.fasterxml.jackson.annotation.JsonProperty;
12+
13+
public class CallbackMessage {
14+
@JsonProperty("tts")
15+
private boolean tts;
16+
17+
@JsonProperty("content")
18+
private String content;
19+
20+
@JsonProperty("embeds")
21+
private List<Embed> embeds;
22+
23+
@JsonProperty("allowed_mentions")
24+
private AllowedMentions allowedMentions;
25+
26+
@JsonProperty("flags")
27+
private int flags;
28+
29+
@JsonProperty("components")
30+
private List<Component> components;
31+
32+
@JsonProperty("attachments")
33+
private List<Attachment> attachments;
34+
35+
@JsonProperty("poll")
36+
private Poll poll;
37+
38+
public CallbackMessage() {}
39+
40+
public boolean isTts() {
41+
return tts;
42+
}
43+
44+
public void setTts(boolean tts) {
45+
this.tts = tts;
46+
}
47+
48+
public String getContent() {
49+
return content;
50+
}
51+
52+
public CallbackMessage setContent(String content) {
53+
this.content = content;
54+
return this;
55+
}
56+
57+
public List<Embed> getEmbeds() {
58+
return embeds;
59+
}
60+
61+
public CallbackMessage setEmbeds(List<Embed> embeds) {
62+
this.embeds = embeds;
63+
return this;
64+
}
65+
66+
public AllowedMentions getAllowedMentions() {
67+
return allowedMentions;
68+
}
69+
70+
public CallbackMessage setAllowedMentions(AllowedMentions allowedMentions) {
71+
this.allowedMentions = allowedMentions;
72+
return this;
73+
}
74+
75+
public int getFlags() {
76+
return flags;
77+
}
78+
79+
public CallbackMessage setFlags(int flags) {
80+
this.flags = flags;
81+
return this;
82+
}
83+
84+
public List<Component> getComponents() {
85+
return components;
86+
}
87+
88+
public CallbackMessage setComponents(List<Component> components) {
89+
this.components = components;
90+
return this;
91+
}
92+
93+
public List<Attachment> getAttachments() {
94+
return attachments;
95+
}
96+
97+
public CallbackMessage setAttachments(List<Attachment> attachments) {
98+
this.attachments = attachments;
99+
return this;
100+
}
101+
102+
public Poll getPoll() {
103+
return poll;
104+
}
105+
106+
public CallbackMessage setPoll(Poll poll) {
107+
this.poll = poll;
108+
return this;
109+
}
110+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.javadiscord.jdi.core.api.builders.command;
2+
3+
import java.util.Optional;
4+
5+
import com.javadiscord.jdi.internal.api.application_commands.EditCommandRequest;
6+
import com.javadiscord.jdi.internal.api.application_commands.RespondCommandRequest;
7+
8+
public class CallbackMessageBuilder {
9+
private final CallbackResponseType type;
10+
private final long interactionId;
11+
private final String interactionToken;
12+
private Optional<CallbackMessage> message;
13+
private long applicationId;
14+
15+
public CallbackMessageBuilder(
16+
CallbackResponseType type, long interactionId, String interactionToken
17+
) {
18+
this.type = type;
19+
this.interactionId = interactionId;
20+
this.interactionToken = interactionToken;
21+
this.message = Optional.empty();
22+
}
23+
24+
public CallbackMessageBuilder message(CallbackMessage message) {
25+
this.message = Optional.of(message);
26+
return this;
27+
}
28+
29+
public CallbackMessageBuilder applicationId(long applicationId) {
30+
this.applicationId = applicationId;
31+
return this;
32+
}
33+
34+
public RespondCommandRequest build() {
35+
return new RespondCommandRequest(type, message, interactionId, interactionToken);
36+
}
37+
38+
public EditCommandRequest buildEdit() {
39+
return new EditCommandRequest(type, message, applicationId, interactionToken);
40+
}
41+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.javadiscord.jdi.core.api.builders.command;
2+
3+
public enum CallbackResponseType {
4+
PONG(1),
5+
CHANNEL_MESSAGE_WITH_SOURCE(4),
6+
DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE(5),
7+
DEFERRED_UPDATE_MESSAGE(6),
8+
UPDATE_MESSAGE(7),
9+
APPLICATION_COMMAND_AUTOCOMPLETE_RESULT(8),
10+
MODAL(9),
11+
PREMIUM_REQUIRED(10);
12+
13+
private final int value;
14+
15+
CallbackResponseType(int value) {
16+
this.value = value;
17+
}
18+
19+
public int getValue() {
20+
return value;
21+
}
22+
}
Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,56 @@
11
package com.javadiscord.jdi.internal.api.application_commands;
22

3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Optional;
6+
7+
import com.javadiscord.jdi.core.api.builders.command.CallbackMessage;
8+
import com.javadiscord.jdi.core.api.builders.command.CallbackResponseType;
39
import com.javadiscord.jdi.internal.api.DiscordRequest;
410
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;
511

6-
public record EditCommandRequest() implements DiscordRequest {
12+
public record EditCommandRequest(
13+
CallbackResponseType type,
14+
Optional<CallbackMessage> message,
15+
long applicationId,
16+
String interactionToken
17+
) implements DiscordRequest {
718

819
@Override
920
public DiscordRequestBuilder create() {
10-
return null;
21+
Map<String, Object> body = new HashMap<>();
22+
body.put("type", type.getValue());
23+
24+
message.ifPresent(m -> {
25+
body.put("tts", m.isTts());
26+
body.put("content", m.getContent());
27+
28+
if (m.getEmbeds() != null) {
29+
body.put("embeds", m.getEmbeds());
30+
}
31+
32+
if (m.getAllowedMentions() != null) {
33+
body.put("allowed_mentions", m.getAllowedMentions());
34+
}
35+
36+
body.put("flags", m.getFlags());
37+
38+
if (m.getComponents() != null) {
39+
body.put("components", m.getComponents());
40+
}
41+
42+
if (m.getAttachments() != null) {
43+
body.put("attachments", m.getAttachments());
44+
}
45+
46+
if (m.getPoll() != null) {
47+
body.put("poll", m.getPoll());
48+
}
49+
});
50+
51+
return new DiscordRequestBuilder()
52+
.patch()
53+
.body(body)
54+
.path("/webhooks/%s/%s/messages/@original".formatted(applicationId, interactionToken));
1155
}
1256
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.javadiscord.jdi.internal.api.application_commands;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Optional;
6+
7+
import com.javadiscord.jdi.core.api.builders.command.CallbackMessage;
8+
import com.javadiscord.jdi.core.api.builders.command.CallbackResponseType;
9+
import com.javadiscord.jdi.internal.api.DiscordRequest;
10+
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;
11+
12+
public record RespondCommandRequest(
13+
CallbackResponseType type,
14+
Optional<CallbackMessage> message,
15+
long interactionId,
16+
String interactionToken
17+
) implements DiscordRequest {
18+
19+
@Override
20+
public DiscordRequestBuilder create() {
21+
22+
Map<String, Object> body = new HashMap<>();
23+
body.put("type", type.getValue());
24+
25+
message.ifPresent(m -> body.put("data", m));
26+
27+
return new DiscordRequestBuilder()
28+
.post()
29+
.body(body)
30+
.path("/interactions/%s/%s/callback".formatted(interactionId, interactionToken));
31+
}
32+
}

0 commit comments

Comments
 (0)