2
2
3
3
import net .dv8tion .jda .api .JDA ;
4
4
import net .dv8tion .jda .api .Permission ;
5
+ import net .dv8tion .jda .api .entities .AbstractChannel ;
5
6
import net .dv8tion .jda .api .entities .Guild ;
6
7
import net .dv8tion .jda .api .entities .TextChannel ;
7
- import net .dv8tion .jda .api .events .GenericEvent ;
8
8
import net .dv8tion .jda .api .events .ReadyEvent ;
9
9
import net .dv8tion .jda .api .events .interaction .ButtonClickEvent ;
10
10
import net .dv8tion .jda .api .events .interaction .SelectionMenuEvent ;
11
11
import net .dv8tion .jda .api .events .interaction .SlashCommandEvent ;
12
12
import net .dv8tion .jda .api .events .message .guild .GuildMessageReceivedEvent ;
13
13
import net .dv8tion .jda .api .events .message .guild .GuildMessageUpdateEvent ;
14
14
import net .dv8tion .jda .api .exceptions .ErrorHandler ;
15
- import net .dv8tion .jda .api .hooks .EventListener ;
16
15
import net .dv8tion .jda .api .hooks .ListenerAdapter ;
17
16
import net .dv8tion .jda .api .interactions .commands .Command ;
18
17
import net .dv8tion .jda .api .interactions .components .ComponentInteraction ;
32
31
import java .util .concurrent .ExecutorService ;
33
32
import java .util .concurrent .Executors ;
34
33
import java .util .function .Function ;
34
+ import java .util .regex .Pattern ;
35
35
import java .util .stream .Collectors ;
36
+ import java .util .stream .Stream ;
36
37
37
38
/**
38
39
* The bot core is the core of command handling in this application.
@@ -53,6 +54,7 @@ public final class BotCore extends ListenerAdapter implements SlashCommandProvid
53
54
private final Map <String , SlashCommand > nameToSlashCommands ;
54
55
private final ComponentIdParser componentIdParser ;
55
56
private final ComponentIdStore componentIdStore ;
57
+ private final Map <Pattern , MessageReceiver > channelNameToMessageReceiver = new HashMap <>();
56
58
57
59
/**
58
60
* Creates a new command system which uses the given database to allow commands to persist data.
@@ -70,8 +72,8 @@ public BotCore(@NotNull JDA jda, @NotNull Database database) {
70
72
features .stream ()
71
73
.filter (MessageReceiver .class ::isInstance )
72
74
.map (MessageReceiver .class ::cast )
73
- .map ( MessageReceiverAsEventListener :: new )
74
- . forEach ( jda :: addEventListener );
75
+ .forEach ( messageReceiver -> channelNameToMessageReceiver
76
+ . put ( messageReceiver . getChannelNamePattern (), messageReceiver ) );
75
77
76
78
// Event receivers
77
79
features .stream ()
@@ -129,6 +131,29 @@ public void onReady(@NotNull ReadyEvent event) {
129
131
logger .debug ("Bot core is now ready" );
130
132
}
131
133
134
+ @ Override
135
+ public void onGuildMessageReceived (@ NotNull GuildMessageReceivedEvent event ) {
136
+ getMessageReceiversSubscribedTo (event .getChannel ())
137
+ .forEach (messageReceiver -> messageReceiver .onMessageReceived (event ));
138
+ }
139
+
140
+ @ Override
141
+ public void onGuildMessageUpdate (@ NotNull GuildMessageUpdateEvent event ) {
142
+ getMessageReceiversSubscribedTo (event .getChannel ())
143
+ .forEach (messageReceiver -> messageReceiver .onMessageUpdated (event ));
144
+ }
145
+
146
+ private @ NotNull Stream <MessageReceiver > getMessageReceiversSubscribedTo (
147
+ @ NotNull AbstractChannel channel ) {
148
+ String channelName = channel .getName ();
149
+ return channelNameToMessageReceiver .entrySet ()
150
+ .stream ()
151
+ .filter (patternAndReceiver -> patternAndReceiver .getKey ()
152
+ .matcher (channelName )
153
+ .matches ())
154
+ .map (Map .Entry ::getValue );
155
+ }
156
+
132
157
@ Override
133
158
public void onSlashCommand (@ NotNull SlashCommandEvent event ) {
134
159
logger .debug ("Received slash command '{}' (#{}) on guild '{}'" , event .getName (),
@@ -283,25 +308,4 @@ private interface TriConsumer<A, B, C> {
283
308
*/
284
309
void accept (A first , B second , C third );
285
310
}
286
-
287
- private static final class MessageReceiverAsEventListener implements EventListener {
288
- private final MessageReceiver messageReceiver ;
289
-
290
- MessageReceiverAsEventListener (MessageReceiver messageReceiver ) {
291
- this .messageReceiver = messageReceiver ;
292
- }
293
-
294
- @ SuppressWarnings ("squid:S2583" ) // False-positive about the if-else-instanceof, sonar
295
- // thinks the second case is unreachable; but it passes
296
- // without pattern-matching. Probably a bug in SonarLint
297
- // with Java 17.
298
- @ Override
299
- public void onEvent (@ NotNull GenericEvent event ) {
300
- if (event instanceof GuildMessageReceivedEvent receivedEvent ) {
301
- messageReceiver .onMessageReceived (receivedEvent );
302
- } else if (event instanceof GuildMessageUpdateEvent updateEvent ) {
303
- messageReceiver .onMessageUpdated (updateEvent );
304
- }
305
- }
306
- }
307
311
}
0 commit comments