Skip to content

Commit a0b8391

Browse files
Merge pull request #366 from danthe1st/fix-duplicate-state-listener
make sure that StateListener is not registered twice
2 parents 19865d5 + f59dc1d commit a0b8391

21 files changed

+51
-22
lines changed

src/main/java/net/javadiscord/javabot/Bot.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@
3030
import net.dv8tion.jda.api.entities.Message;
3131
import net.dv8tion.jda.api.hooks.ListenerAdapter;
3232
import net.dv8tion.jda.api.utils.messages.MessageRequest;
33+
import net.javadiscord.javabot.annotations.AutoDetectableComponentHandler;
34+
import net.javadiscord.javabot.annotations.PreRegisteredListener;
3335
import net.javadiscord.javabot.data.config.BotConfig;
34-
import net.javadiscord.javabot.systems.AutoDetectableComponentHandler;
3536
import net.javadiscord.javabot.tasks.PresenceUpdater;
3637
import net.javadiscord.javabot.util.ExceptionLogger;
3738

@@ -57,7 +58,9 @@ public class Bot {
5758

5859
private void addEventListeners(final List<ListenerAdapter> listeners) {
5960
for (ListenerAdapter listener : listeners) {
60-
dih4jda.getJDA().addEventListener(listener);
61+
if(!(listener.getClass().isAnnotationPresent(PreRegisteredListener.class))) {
62+
dih4jda.getJDA().addEventListener(listener);
63+
}
6164
}
6265
dih4jda.getJDA().addEventListener(dih4jda);
6366
}

src/main/java/net/javadiscord/javabot/SpringConfig.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package net.javadiscord.javabot;
22

33
import java.nio.file.Path;
4+
import java.util.Collection;
45
import java.util.concurrent.Executors;
56
import java.util.concurrent.ScheduledExecutorService;
67

78
import javax.security.auth.login.LoginException;
89
import javax.sql.DataSource;
910

11+
import org.springframework.context.ApplicationContext;
1012
import org.springframework.context.annotation.Bean;
1113
import org.springframework.context.annotation.Configuration;
1214

@@ -24,10 +26,10 @@
2426
import net.dv8tion.jda.api.utils.ChunkingFilter;
2527
import net.dv8tion.jda.api.utils.MemberCachePolicy;
2628
import net.dv8tion.jda.api.utils.cache.CacheFlag;
29+
import net.javadiscord.javabot.annotations.PreRegisteredListener;
2730
import net.javadiscord.javabot.data.config.BotConfig;
2831
import net.javadiscord.javabot.data.config.SystemsConfig;
2932
import net.javadiscord.javabot.data.h2db.DbHelper;
30-
import net.javadiscord.javabot.listener.StateListener;
3133
import net.javadiscord.javabot.tasks.PresenceUpdater;
3234

3335
/**
@@ -64,19 +66,20 @@ public SystemsConfig systemsConfig(BotConfig botConfig) {
6466
/**
6567
* Initializes the {@link JDA} instances.
6668
* @param botConfig the main configuration of the bot
67-
* @param stateListener The {@link StateListener} which is listening for JDA lifecycle events and needs to be added before JDA is fully initialized
69+
* @param ctx the Spring application context used for obtaining all listeners
6870
* @return the initialized {@link JDA} object
6971
* @throws LoginException if the token is invalid
7072
*/
7173
@Bean
72-
public JDA jda(BotConfig botConfig, StateListener stateListener) throws LoginException {
74+
public JDA jda(BotConfig botConfig, ApplicationContext ctx) throws LoginException {
75+
Collection<Object> listeners = ctx.getBeansWithAnnotation(PreRegisteredListener.class).values();
7376
return JDABuilder.createDefault(botConfig.getSystems().getJdaBotToken())
7477
.setStatus(OnlineStatus.DO_NOT_DISTURB)
7578
.setChunkingFilter(ChunkingFilter.ALL)
7679
.setMemberCachePolicy(MemberCachePolicy.ALL)
7780
.enableCache(CacheFlag.ACTIVITY)
7881
.enableIntents(GatewayIntent.GUILD_MEMBERS, GatewayIntent.GUILD_PRESENCES, GatewayIntent.MESSAGE_CONTENT)
79-
.addEventListeners(stateListener)
82+
.addEventListeners(listeners.toArray())
8083
.build();
8184
}
8285

src/main/java/net/javadiscord/javabot/systems/AutoDetectableComponentHandler.java renamed to src/main/java/net/javadiscord/javabot/annotations/AutoDetectableComponentHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.javadiscord.javabot.systems;
1+
package net.javadiscord.javabot.annotations;
22

33
import java.lang.annotation.ElementType;
44
import java.lang.annotation.Retention;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package net.javadiscord.javabot.annotations;
2+
3+
import static java.lang.annotation.ElementType.TYPE;
4+
import static java.lang.annotation.RetentionPolicy.RUNTIME;
5+
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.Target;
8+
9+
/**
10+
* Marks JDA listeners to be registered before JDA is initialized.
11+
*
12+
* Only {@link net.dv8tion.jda.api.hooks.EventListener EventListener}s should be annoted with this annotation.
13+
* All listeners overriding {@link net.dv8tion.jda.api.hooks.EventListener#onReady(net.dv8tion.jda.api.events.session.ReadyEvent) onReady} should be annotated with this annotation.
14+
*/
15+
@Retention(RUNTIME)
16+
@Target(TYPE)
17+
public @interface PreRegisteredListener {
18+
19+
}

src/main/java/net/javadiscord/javabot/data/h2db/commands/QuickMigrateSubcommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import net.dv8tion.jda.api.interactions.components.text.TextInput;
1313
import net.dv8tion.jda.api.interactions.components.text.TextInputStyle;
1414
import net.dv8tion.jda.api.interactions.modals.ModalMapping;
15+
import net.javadiscord.javabot.annotations.AutoDetectableComponentHandler;
1516
import net.javadiscord.javabot.data.config.SystemsConfig;
16-
import net.javadiscord.javabot.systems.AutoDetectableComponentHandler;
1717
import net.javadiscord.javabot.util.ExceptionLogger;
1818
import net.javadiscord.javabot.util.Responses;
1919
import org.jetbrains.annotations.NotNull;

src/main/java/net/javadiscord/javabot/listener/StateListener.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.dv8tion.jda.api.events.session.SessionRecreateEvent;
1111
import net.dv8tion.jda.api.events.session.ShutdownEvent;
1212
import net.dv8tion.jda.api.hooks.ListenerAdapter;
13+
import net.javadiscord.javabot.annotations.PreRegisteredListener;
1314
import net.javadiscord.javabot.data.config.BotConfig;
1415
import net.javadiscord.javabot.data.config.guild.HelpConfig;
1516
import net.javadiscord.javabot.data.h2db.DbActions;
@@ -34,6 +35,7 @@
3435
*/
3536
@Slf4j
3637
@RequiredArgsConstructor
38+
@PreRegisteredListener
3739
public class StateListener extends ListenerAdapter {
3840
private final NotificationService notificationService;
3941
private final CustomTagManager customTagManager;

src/main/java/net/javadiscord/javabot/systems/help/HelpChannelInteractionManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
1010
import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent;
1111
import net.dv8tion.jda.api.interactions.components.buttons.Button;
12+
import net.javadiscord.javabot.annotations.AutoDetectableComponentHandler;
1213
import net.javadiscord.javabot.data.config.BotConfig;
1314
import net.javadiscord.javabot.data.config.guild.HelpConfig;
1415
import net.javadiscord.javabot.data.h2db.DbActions;
15-
import net.javadiscord.javabot.systems.AutoDetectableComponentHandler;
1616
import net.javadiscord.javabot.systems.help.model.ChannelReservation;
1717
import net.javadiscord.javabot.systems.help.model.HelpTransactionMessage;
1818
import net.javadiscord.javabot.util.ExceptionLogger;

src/main/java/net/javadiscord/javabot/systems/help/forum/ForumHelpListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
import net.dv8tion.jda.api.interactions.components.ActionComponent;
2020
import net.dv8tion.jda.api.interactions.components.ActionRow;
2121
import net.dv8tion.jda.api.interactions.components.buttons.Button;
22+
import net.javadiscord.javabot.annotations.AutoDetectableComponentHandler;
2223
import net.javadiscord.javabot.data.config.BotConfig;
2324
import net.javadiscord.javabot.data.config.guild.HelpConfig;
2425
import net.javadiscord.javabot.data.h2db.DbActions;
2526
import net.javadiscord.javabot.data.config.guild.HelpForumConfig;
26-
import net.javadiscord.javabot.systems.AutoDetectableComponentHandler;
2727
import net.javadiscord.javabot.systems.help.HelpChannelManager;
2828
import net.javadiscord.javabot.systems.help.HelpExperienceService;
2929
import net.javadiscord.javabot.systems.help.dao.HelpAccountRepository;

src/main/java/net/javadiscord/javabot/systems/moderation/report/ReportManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@
2222
import net.dv8tion.jda.api.interactions.components.text.TextInput;
2323
import net.dv8tion.jda.api.interactions.components.text.TextInputStyle;
2424
import net.dv8tion.jda.api.interactions.modals.ModalMapping;
25+
import net.javadiscord.javabot.annotations.AutoDetectableComponentHandler;
2526
import net.javadiscord.javabot.data.config.BotConfig;
2627
import net.dv8tion.jda.api.requests.restaction.WebhookMessageCreateAction;
2728
import net.javadiscord.javabot.data.config.GuildConfig;
2829
import net.javadiscord.javabot.data.config.guild.ModerationConfig;
29-
import net.javadiscord.javabot.systems.AutoDetectableComponentHandler;
3030
import net.javadiscord.javabot.util.InteractionUtils;
3131
import net.javadiscord.javabot.util.Responses;
3232
import org.jetbrains.annotations.NotNull;

src/main/java/net/javadiscord/javabot/systems/qotw/commands/questions_queue/AddQuestionSubcommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import net.dv8tion.jda.api.interactions.components.text.TextInputStyle;
1111
import net.dv8tion.jda.api.interactions.modals.ModalMapping;
1212
import net.dv8tion.jda.api.requests.restaction.interactions.InteractionCallbackAction;
13-
import net.javadiscord.javabot.systems.AutoDetectableComponentHandler;
13+
import net.javadiscord.javabot.annotations.AutoDetectableComponentHandler;
1414
import net.javadiscord.javabot.systems.qotw.commands.QOTWSubcommand;
1515
import net.javadiscord.javabot.systems.qotw.dao.QuestionQueueRepository;
1616
import net.javadiscord.javabot.systems.qotw.model.QOTWQuestion;

0 commit comments

Comments
 (0)