diff --git a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warnings.java b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warnings.java index b9214d86f..3499a8e5d 100644 --- a/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warnings.java +++ b/abstracto-application/abstracto-modules/moderation/moderation-impl/src/main/java/dev/sheldan/abstracto/moderation/commands/Warnings.java @@ -51,6 +51,9 @@ public class Warnings extends AbstractConditionableCommand { @Autowired private PaginatorService paginatorService; + @Autowired + private EventWaiter eventWaiter; + @Override public CommandResult execute(CommandContext commandContext) { List warnsToDisplay; @@ -65,7 +68,7 @@ public class Warnings extends AbstractConditionableCommand { WarningsModel model = (WarningsModel) ContextConverter.fromCommandContext(commandContext, WarningsModel.class); model.setWarnings(warnEntries); - Paginator paginator = paginatorService.createPaginatorFromTemplate("warnings_response", model, new EventWaiter()); + Paginator paginator = paginatorService.createPaginatorFromTemplate("warnings_response", model, eventWaiter); paginator.display(commandContext.getChannel()); return CommandResult.fromSuccess(); } diff --git a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java index 73f38d839..38978f30e 100644 --- a/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java +++ b/abstracto-application/abstracto-modules/modmail/modmail-impl/src/main/java/dev/sheldan/abstracto/modmail/service/ModMailThreadServiceBean.java @@ -91,6 +91,9 @@ public class ModMailThreadServiceBean implements ModMailThreadService { @Autowired private ModMailSubscriberManagementService modMailSubscriberManagementService; + @Autowired + private EventWaiter eventWaiter; + @Autowired private ModMailThreadServiceBean self; @@ -197,19 +200,15 @@ public class ModMailThreadServiceBean implements ModMailThreadService { .commonGuilds(availableGuilds) .build(); String text = templateService.renderTemplate("modmail_modal_server_choice", modMailServerChooserModel); - // todo dont instantiate directly - EventWaiter waiter = new EventWaiter(); - botService.getInstance().addEventListener(waiter); ButtonMenu menu = new ButtonMenu.Builder() .setChoices(choices.keySet().toArray(new String[0])) - .setEventWaiter(waiter) + .setEventWaiter(eventWaiter) .setDescription(text) .setAction(reactionEmote -> { AUserInAServer chosenServer = choices.get(reactionEmote.getEmoji()); Member memberInServer = botService.getMemberInServer(chosenServer); FullUser fullUser = FullUser.builder().member(memberInServer).aUserInAServer(chosenServer).build(); self.createModMailThreadForUser(fullUser, channel, true); - botService.getInstance().removeEventListener(waiter); }) .build(); menu.display(channel); diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/CoreConfig.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/CoreConfig.java index b7cc7b1c1..f4499179f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/CoreConfig.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/config/CoreConfig.java @@ -2,17 +2,38 @@ package dev.sheldan.abstracto.core.config; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.jagrosh.jdautilities.commons.waiter.EventWaiter; +import dev.sheldan.abstracto.core.service.BotService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.OffsetDateTime; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; @Configuration public class CoreConfig { + + @Autowired + private BotService botService; + + @Value("${abstracto.eventWaiter.threads}") + private Integer threadCount; + @Bean public Gson gson() { return new GsonBuilder() .registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeAdapter()) .setPrettyPrinting().create(); } + + + @Bean + public EventWaiter eventWaiter() { + ScheduledExecutorService scheduledExecutorService = + Executors.newScheduledThreadPool(threadCount); + return new EventWaiter(scheduledExecutorService, true); + } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/ReadyListener.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/ReadyListener.java index c356432d0..35305cc9b 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/ReadyListener.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/ReadyListener.java @@ -1,5 +1,7 @@ package dev.sheldan.abstracto.core.listener; +import com.jagrosh.jdautilities.commons.waiter.EventWaiter; +import dev.sheldan.abstracto.core.service.BotService; import dev.sheldan.abstracto.core.service.StartupServiceBean; import dev.sheldan.abstracto.scheduling.service.SchedulerService; import net.dv8tion.jda.api.events.ReadyEvent; @@ -22,11 +24,18 @@ public class ReadyListener extends ListenerAdapter { @Autowired private SchedulerService schedulerService; + @Autowired + private EventWaiter eventWaiter; + + @Autowired + private BotService botService; + @Override public void onReady(@Nonnull ReadyEvent event) { if(synchronize){ startup.synchronize(); } + botService.getInstance().addEventListener(eventWaiter); schedulerService.startScheduler(); } } diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/ServerJoinListener.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/ServerJoinListener.java new file mode 100644 index 000000000..592c47ce2 --- /dev/null +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/listener/ServerJoinListener.java @@ -0,0 +1,29 @@ +package dev.sheldan.abstracto.core.listener; + +import dev.sheldan.abstracto.core.models.database.AServer; +import dev.sheldan.abstracto.core.service.management.ServerManagementService; +import net.dv8tion.jda.api.events.guild.GuildJoinEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Nonnull; +import java.util.List; + +@Component +public class ServerJoinListener extends ListenerAdapter { + + @Autowired + private List configListeners; + + @Autowired + private ServerManagementService serverManagementService; + + @Override + @Transactional + public void onGuildJoin(@Nonnull GuildJoinEvent event) { + AServer server = serverManagementService.loadOrCreate(event.getGuild().getIdLong()); + configListeners.forEach(serverConfigListener -> serverConfigListener.updateServerConfig(server)); + } +} diff --git a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PaginatorServiceBean.java b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PaginatorServiceBean.java index e8064ae8a..a9d46e36f 100644 --- a/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PaginatorServiceBean.java +++ b/abstracto-application/core/core-impl/src/main/java/dev/sheldan/abstracto/core/service/PaginatorServiceBean.java @@ -30,7 +30,6 @@ public class PaginatorServiceBean implements PaginatorService { public Paginator createPaginatorFromTemplate(String templateKey, Object model, EventWaiter waiter) { String embedConfig = templateService.renderTemplate(templateKey + "_paginator", model); PaginatorConfiguration configuration = gson.fromJson(embedConfig, PaginatorConfiguration.class); - botService.getInstance().addEventListener(waiter); List items = configuration.getItems(); int itemsPerPage = findAppropriateCountPerPage(items); @@ -41,9 +40,9 @@ public class PaginatorServiceBean implements PaginatorService { .setItems(configuration.getItems().toArray(new String[0])) .useNumberedItems(ObjectUtils.defaultIfNull(configuration.getUseNumberedItems(), false)) .setEventWaiter(waiter) + .waitOnSinglePage(true) .setTimeout(ObjectUtils.defaultIfNull(configuration.getTimeoutSeconds(), 120L), TimeUnit.SECONDS) .setFinalAction(message -> { - botService.getInstance().removeEventListener(waiter); message.delete().queue(); }) .build(); diff --git a/abstracto-application/core/core-impl/src/main/resources/abstracto.properties b/abstracto-application/core/core-impl/src/main/resources/abstracto.properties index 34bb7fe22..61de19c0f 100644 --- a/abstracto-application/core/core-impl/src/main/resources/abstracto.properties +++ b/abstracto-application/core/core-impl/src/main/resources/abstracto.properties @@ -3,4 +3,5 @@ abstracto.startup.synchronize=true abstracto.parameter.lowerBound=50 abstracto.features.core=true -abstracto.prefix=! \ No newline at end of file +abstracto.prefix=! +abstracto.eventWaiter.threads=10 \ No newline at end of file diff --git a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/models/database/ACommandInAServer.java b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/models/database/ACommandInAServer.java index 61916777a..6446b4b82 100644 --- a/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/models/database/ACommandInAServer.java +++ b/abstracto-application/core/core-interface/src/main/java/dev/sheldan/abstracto/core/command/models/database/ACommandInAServer.java @@ -23,11 +23,11 @@ public class ACommandInAServer { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long commandInServerId; - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name = "commandReference", nullable = false) private ACommand commandReference; - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name = "serverReference", nullable = false) private AServer serverReference;