Skip to content

Commit 1f6b863

Browse files
committed
Multiple CommandFramework-Instances are now possible :yay:
1 parent a4d63e7 commit 1f6b863

File tree

6 files changed

+104
-123
lines changed

6 files changed

+104
-123
lines changed

.editorconfig

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ root = true
22

33
[*]
44
charset = utf-8
5-
end_of_line = crlf
5+
end_of_line = lf
66
indent_size = 4
77
indent_style = space
88
insert_final_newline = false

src/main/java/io/github/jdiscordbots/command_framework/CommandFramework.java

+7-19
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
public class CommandFramework {
2727
private static final Logger LOG = LoggerFactory.getLogger(CommandFramework.class);
2828

29-
private static CommandFramework instance;
30-
3129
private Consumer<TextChannel> onUnknownCommandHandler;
3230
private String prefix = "!";
3331
private String[] owners = {};
@@ -41,8 +39,6 @@ public class CommandFramework {
4139
* @see CommandFramework#CommandFramework()
4240
*/
4341
public CommandFramework(String commandsPackagePath) {
44-
instance = this;
45-
4642
final Reflections reflections = new Reflections(commandsPackagePath);
4743

4844
addCommands(reflections);
@@ -109,17 +105,6 @@ private static void addAction(Reflections reflections, BiConsumer<Annotation, Ob
109105
}
110106
}
111107

112-
/**
113-
* Get current instance of CommandFramework
114-
* <p>
115-
* NOTE: Currently singleton-system (only one instance possible)
116-
*
117-
* @return {@link io.github.jdiscordbots.command_framework.CommandFramework CommandFramework}
118-
*/
119-
public static CommandFramework getInstance() {
120-
return instance;
121-
}
122-
123108
/**
124109
* Set privileged user ids
125110
*
@@ -249,7 +234,7 @@ public CommandFramework setMentionPrefix(boolean mentionPrefix) {
249234
/**
250235
* Get all registered commands of the {@link io.github.jdiscordbots.command_framework.CommandFramework CommandFramework} instance
251236
*
252-
* @return all registerd commands
237+
* @return all registered commands
253238
* @see io.github.jdiscordbots.command_framework.CommandFramework#addCommands(Reflections)
254239
* @see io.github.jdiscordbots.command_framework.CommandFramework#addAction(Reflections, BiConsumer)
255240
*/
@@ -274,6 +259,7 @@ public ListenerAdapter build() {
274259
* CommandListener
275260
*/
276261
private static final class CommandListener extends ListenerAdapter {
262+
private final CommandFramework framework;
277263
private final String prefix;
278264
private final boolean mentionPrefix;
279265

@@ -283,6 +269,7 @@ private static final class CommandListener extends ListenerAdapter {
283269
* @param framework {@link io.github.jdiscordbots.command_framework.CommandFramework CommandFramework}
284270
*/
285271
public CommandListener(CommandFramework framework) {
272+
this.framework = framework;
286273
this.prefix = framework.getPrefix();
287274
this.mentionPrefix = framework.isMentionPrefix();
288275
}
@@ -294,6 +281,7 @@ public CommandListener(CommandFramework framework) {
294281
*/
295282
@Override
296283
public void onGuildMessageReceived(@Nonnull GuildMessageReceivedEvent event) {
284+
final CommandParser parser = new CommandParser(this.framework);
297285
final Message message = event.getMessage();
298286
final String contentRaw = message.getContentRaw().trim();
299287
final String selfUserId = message.getJDA().getSelfUser().getId();
@@ -304,13 +292,13 @@ public void onGuildMessageReceived(@Nonnull GuildMessageReceivedEvent event) {
304292
return;
305293

306294
if (this.mentionPrefix && containsMention) {
307-
CommandHandler.handle(CommandHandler.CommandParser
308-
.parse(event, CommandHandler.CommandParser.SPACE_PATTERN.split(contentRaw)[0] + " "));
295+
CommandHandler.handle(parser
296+
.parse(event, CommandParser.SPACE_PATTERN.split(contentRaw)[0] + " "));
309297
return;
310298
}
311299

312300
if (message.getContentDisplay().startsWith(this.prefix))
313-
CommandHandler.handle(CommandHandler.CommandParser.parse(event, prefix));
301+
CommandHandler.handle(parser.parse(event, prefix));
314302
}
315303
}
316304
}
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,23 @@
11
package io.github.jdiscordbots.command_framework;
22

3-
import io.github.jdiscordbots.command_framework.command.CommandEvent;
43
import io.github.jdiscordbots.command_framework.command.ICommand;
54
import io.github.jdiscordbots.command_framework.utils.PermissionUtils;
65
import net.dv8tion.jda.api.EmbedBuilder;
7-
import net.dv8tion.jda.api.Permission;
8-
import net.dv8tion.jda.api.entities.Member;
96
import net.dv8tion.jda.api.entities.TextChannel;
10-
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
117
import org.slf4j.Logger;
128
import org.slf4j.LoggerFactory;
139

1410
import java.awt.*;
15-
import java.util.List;
16-
import java.util.*;
17-
import java.util.regex.Pattern;
11+
import java.util.Collections;
12+
import java.util.HashMap;
13+
import java.util.Map;
1814

1915
/**
2016
* CommandHandler of Command system
2117
*/
2218
final class CommandHandler {
23-
private static final Map<String, ICommand> commands = new HashMap<>();
2419
private static final Logger LOG = LoggerFactory.getLogger(CommandHandler.class);
20+
private static final Map<String, ICommand> commands = new HashMap<>();
2521

2622
/**
2723
* Private constructor for utility class
@@ -52,9 +48,9 @@ static void addCommand(String name, ICommand command) {
5248
/**
5349
* handle commands
5450
*
55-
* @param commandContainer {@link io.github.jdiscordbots.command_framework.CommandHandler.CommandParser CommandContainer}
51+
* @param commandContainer {@link io.github.jdiscordbots.command_framework.CommandParser.CommandContainer CommandContainer}
5652
*/
57-
public static void handle(final CommandContainer commandContainer) {
53+
public static void handle(final CommandParser.CommandContainer commandContainer) {
5854
final TextChannel channel = commandContainer.event.getChannel();
5955

6056
if (commands.containsKey(commandContainer.invoke.toLowerCase())) {
@@ -85,88 +81,4 @@ public static void handle(final CommandContainer commandContainer) {
8581
}
8682
}
8783
}
88-
89-
/**
90-
* CommandParser
91-
*/
92-
static final class CommandParser {
93-
static final Pattern SPACE_PATTERN = Pattern.compile("\\s+");
94-
95-
/**
96-
* Private constructor for utility class
97-
*/
98-
private CommandParser() {
99-
/* Prevent instantiation */
100-
}
101-
102-
/**
103-
* Parse GuildMessageReceivedEvent and Prefix to CommandContainer
104-
*
105-
* @param event incomming {@link net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent GuildMessageReceivedEvent}
106-
* @param prefix prefix
107-
* @return {@link io.github.jdiscordbots.command_framework.CommandHandler.CommandContainer CommandContainer}
108-
*/
109-
static CommandContainer parse(final GuildMessageReceivedEvent event, final String prefix) {
110-
final Member member = event.getMember();
111-
112-
if (member == null)
113-
throw new IllegalStateException("Member is null");
114-
115-
String raw = event.getMessage().getContentRaw();
116-
117-
if (!member.hasPermission(event.getChannel(), Permission.MESSAGE_MENTION_EVERYONE))
118-
raw = raw.replace("@everyone", "@\u200Beveryone").replace("@here", "@\u200Bhere");
119-
120-
final String beheaded = raw.replaceFirst(Pattern.quote(prefix), "");
121-
122-
final String[] splitBeheaded = SPACE_PATTERN.split(beheaded.trim());
123-
final String invoke = splitBeheaded[0];
124-
final List<String> split = new ArrayList<>();
125-
boolean inQuote = false;
126-
127-
for (int i = 1; i < splitBeheaded.length; i++) {
128-
String s = splitBeheaded[i];
129-
130-
if (inQuote) {
131-
if (s.endsWith("\"")) {
132-
inQuote = false;
133-
s = s.substring(0, s.length() - 1);
134-
}
135-
136-
split.add(split.remove(split.size() - 1).concat(" ").concat(s));
137-
} else {
138-
if (s.startsWith("\"") && !s.endsWith("\"")) {
139-
inQuote = true;
140-
s = s.substring(1);
141-
}
142-
143-
split.add(s);
144-
}
145-
}
146-
147-
final CommandEvent commandEvent = new CommandEvent(event, split);
148-
return new CommandContainer(invoke, commandEvent);
149-
}
150-
}
151-
152-
/**
153-
* CommandContainer
154-
*/
155-
public static final class CommandContainer {
156-
public final String invoke;
157-
public final List<String> args;
158-
public final CommandEvent event;
159-
160-
/**
161-
* Construct a new Container by given command invoke and -event
162-
*
163-
* @param invoke name/invoke of command
164-
* @param event {@link io.github.jdiscordbots.command_framework.command.CommandEvent CommandEvent}
165-
*/
166-
public CommandContainer(String invoke, CommandEvent event) {
167-
this.invoke = invoke;
168-
this.args = event.getArgs();
169-
this.event = event;
170-
}
171-
}
17284
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package io.github.jdiscordbots.command_framework;
2+
3+
import io.github.jdiscordbots.command_framework.command.CommandEvent;
4+
import net.dv8tion.jda.api.Permission;
5+
import net.dv8tion.jda.api.entities.Member;
6+
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
import java.util.regex.Pattern;
11+
12+
public class CommandParser {
13+
public static final Pattern SPACE_PATTERN = Pattern.compile("\\s+");
14+
private final CommandFramework framework;
15+
16+
public CommandParser(CommandFramework framework) {
17+
this.framework = framework;
18+
}
19+
20+
public CommandContainer parse(GuildMessageReceivedEvent event, String prefix) {
21+
final Member member = event.getMember();
22+
23+
if (member == null)
24+
throw new IllegalStateException("Member is null");
25+
26+
String raw = event.getMessage().getContentRaw();
27+
28+
if (!member.hasPermission(event.getChannel(), Permission.MESSAGE_MENTION_EVERYONE))
29+
raw = raw.replace("@everyone", "@\u200Beveryone").replace("@here", "@\u200Bhere");
30+
31+
final String beheaded = raw.replaceFirst(Pattern.quote(prefix), "");
32+
final String[] splitBeheaded = SPACE_PATTERN.split(beheaded.trim());
33+
final String invoke = splitBeheaded[0];
34+
final List<String> split = new ArrayList<>();
35+
boolean inQuote = false;
36+
37+
for (int i = 1; i < splitBeheaded.length; i++) {
38+
String s = splitBeheaded[i];
39+
40+
if (inQuote) {
41+
if (s.endsWith("\"")) {
42+
inQuote = false;
43+
s = s.substring(0, s.length() - 1);
44+
}
45+
46+
split.add(split.remove(split.size() - 1).concat(" ").concat(s));
47+
} else {
48+
if (s.startsWith("\"") && !s.endsWith("\"")) {
49+
inQuote = true;
50+
s = s.substring(1);
51+
}
52+
53+
split.add(s);
54+
}
55+
}
56+
57+
final CommandEvent commandEvent = new CommandEvent(this.framework, event, split);
58+
return new CommandContainer(invoke, commandEvent);
59+
}
60+
61+
/**
62+
* CommandContainer
63+
*/
64+
static final class CommandContainer {
65+
public final String invoke;
66+
public final List<String> args;
67+
public final CommandEvent event;
68+
69+
/**
70+
* Construct a new Container by given command invoke and -event
71+
*
72+
* @param invoke name/invoke of command
73+
* @param event {@link io.github.jdiscordbots.command_framework.command.CommandEvent CommandEvent}
74+
*/
75+
public CommandContainer(String invoke, CommandEvent event) {
76+
this.invoke = invoke;
77+
this.args = event.getArgs();
78+
this.event = event;
79+
}
80+
}
81+
}

src/main/java/io/github/jdiscordbots/command_framework/command/CommandEvent.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,19 @@
1111
* CommandEvent
1212
*/
1313
public class CommandEvent {
14+
private final CommandFramework framework;
1415
private final GuildMessageReceivedEvent event;
1516
private final List<String> args;
1617

1718
/**
1819
* Construct a new CommandEvent
1920
*
20-
* @param event incomming {@link net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent GuildMessageReceivedEvent}
21+
* @param framework {@link CommandFramework CommandFramework}
22+
* @param event incomming {@link GuildMessageReceivedEvent GuildMessageReceivedEvent}
2123
* @param args Command arguments
2224
*/
23-
public CommandEvent(GuildMessageReceivedEvent event, List<String> args) {
25+
public CommandEvent(CommandFramework framework, GuildMessageReceivedEvent event, List<String> args) {
26+
this.framework = framework;
2427
this.event = event;
2528
this.args = args;
2629
}
@@ -31,7 +34,7 @@ public CommandEvent(GuildMessageReceivedEvent event, List<String> args) {
3134
* @return {@link io.github.jdiscordbots.command_framework.CommandFramework CommandFramework} instance
3235
*/
3336
public CommandFramework getFramework() {
34-
return CommandFramework.getInstance();
37+
return this.framework;
3538
}
3639

3740
/**

src/test/java/io/github/jdiscordbots/command_framework/Main.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,10 @@ public static void main(String[] args) {
2424
try (final Scanner sc = new Scanner(new File(".token"))) {
2525
if (sc.hasNextLine()) {
2626
final String token = sc.nextLine();
27-
final CommandFramework framework = new CommandFramework()
28-
.onUnknownCommand(channel -> channel.sendMessage("Custom unknown message reply").queue())
29-
.setMentionPrefix(true)
30-
.setPrefix("nd--")
31-
.setOwners(new String[]{"358291050957111296", "321227144791326730"});
27+
final CommandFramework exclamation = new CommandFramework();
28+
final CommandFramework question = new CommandFramework().setPrefix("?");
3229

33-
JDABuilder.createDefault(token).addEventListeners(framework.build()).build();
30+
JDABuilder.createDefault(token).addEventListeners(exclamation.build(), question.build()).build();
3431
} else
3532
LOG.error("The file .token is empty.");
3633
} catch (FileNotFoundException e) {

0 commit comments

Comments
 (0)