22
33import net .dv8tion .jda .api .JDA ;
44import net .dv8tion .jda .api .Permission ;
5+ import net .dv8tion .jda .api .entities .AbstractChannel ;
56import net .dv8tion .jda .api .entities .Guild ;
67import net .dv8tion .jda .api .entities .TextChannel ;
7- import net .dv8tion .jda .api .events .GenericEvent ;
88import net .dv8tion .jda .api .events .ReadyEvent ;
99import net .dv8tion .jda .api .events .interaction .ButtonClickEvent ;
1010import net .dv8tion .jda .api .events .interaction .SelectionMenuEvent ;
1111import net .dv8tion .jda .api .events .interaction .SlashCommandEvent ;
1212import net .dv8tion .jda .api .events .message .guild .GuildMessageReceivedEvent ;
1313import net .dv8tion .jda .api .events .message .guild .GuildMessageUpdateEvent ;
1414import net .dv8tion .jda .api .exceptions .ErrorHandler ;
15- import net .dv8tion .jda .api .hooks .EventListener ;
1615import net .dv8tion .jda .api .hooks .ListenerAdapter ;
1716import net .dv8tion .jda .api .interactions .commands .Command ;
1817import net .dv8tion .jda .api .interactions .components .ComponentInteraction ;
3231import java .util .concurrent .ExecutorService ;
3332import java .util .concurrent .Executors ;
3433import java .util .function .Function ;
34+ import java .util .regex .Pattern ;
3535import java .util .stream .Collectors ;
36+ import java .util .stream .Stream ;
3637
3738/**
3839 * The bot core is the core of command handling in this application.
@@ -53,6 +54,7 @@ public final class BotCore extends ListenerAdapter implements SlashCommandProvid
5354 private final Map <String , SlashCommand > nameToSlashCommands ;
5455 private final ComponentIdParser componentIdParser ;
5556 private final ComponentIdStore componentIdStore ;
57+ private final Map <Pattern , MessageReceiver > channelNameToMessageReceiver = new HashMap <>();
5658
5759 /**
5860 * 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) {
7072 features .stream ()
7173 .filter (MessageReceiver .class ::isInstance )
7274 .map (MessageReceiver .class ::cast )
73- .map ( MessageReceiverAsEventListener :: new )
74- . forEach ( jda :: addEventListener );
75+ .forEach ( messageReceiver -> channelNameToMessageReceiver
76+ . put ( messageReceiver . getChannelNamePattern (), messageReceiver ) );
7577
7678 // Event receivers
7779 features .stream ()
@@ -129,6 +131,29 @@ public void onReady(@NotNull ReadyEvent event) {
129131 logger .debug ("Bot core is now ready" );
130132 }
131133
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+
132157 @ Override
133158 public void onSlashCommand (@ NotNull SlashCommandEvent event ) {
134159 logger .debug ("Received slash command '{}' (#{}) on guild '{}'" , event .getName (),
@@ -283,25 +308,4 @@ private interface TriConsumer<A, B, C> {
283308 */
284309 void accept (A first , B second , C third );
285310 }
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- }
307311}
0 commit comments