From 7a7ec5654fc8f1f34538baea382e8dae680eaad8 Mon Sep 17 00:00:00 2001 From: Sheldan <5037282+Sheldan@users.noreply.github.com> Date: Sun, 20 Nov 2022 22:37:10 +0100 Subject: [PATCH] [AB-25] changing member loading to be partitioned --- .../service/AUserExperienceServiceBean.java | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java index 8b25a822e..cbbe1f7c6 100644 --- a/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java +++ b/abstracto-application/abstracto-modules/experience-tracking/experience-tracking-impl/src/main/java/dev/sheldan/abstracto/experience/service/AUserExperienceServiceBean.java @@ -9,6 +9,7 @@ import dev.sheldan.abstracto.core.service.management.ServerManagementService; import dev.sheldan.abstracto.core.service.management.UserInServerManagementService; import dev.sheldan.abstracto.core.templating.model.MessageToSend; import dev.sheldan.abstracto.core.templating.service.TemplateService; +import dev.sheldan.abstracto.core.utils.CompletableFutureList; import dev.sheldan.abstracto.core.utils.FutureUtils; import dev.sheldan.abstracto.experience.config.ExperienceFeatureConfig; import dev.sheldan.abstracto.experience.config.ExperienceFeatureDefinition; @@ -28,6 +29,7 @@ import lombok.extern.slf4j.Slf4j; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; +import org.apache.commons.collections4.ListUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.task.TaskExecutor; @@ -183,18 +185,32 @@ public class AUserExperienceServiceBean implements AUserExperienceService { CompletableFuture returnFuture = new CompletableFuture<>(); Long serverId = server.getId(); int supposedUserCount = userIds.size(); - memberService.getMembersInServerAsync(server.getId(), userIds).whenComplete((members, throwable) -> { - if(throwable != null) { - log.warn("Failed to load all members in server {} for syncing experience. We started with {} and got {}.", - serverId, supposedUserCount, members.size(), throwable); - } - self.syncUsers(members, serverId, messageChannel).thenAccept(unused -> { - log.info("Finished syncing users for experience roles."); - returnFuture.complete(null); - }).exceptionally(throwable1 -> { + + List> partitionedUserIds = ListUtils.partition(userIds, 100); + List>> memberLoadingFutures = new ArrayList<>(); + partitionedUserIds.forEach(userIdsPart -> { + memberLoadingFutures.add(memberService.getMembersInServerAsync(server.getId(), userIdsPart)); + }); + CompletableFutureList> listCompletableFutureList = new CompletableFutureList<>(memberLoadingFutures); + listCompletableFutureList.getMainFuture().whenComplete((result, throwable) -> { + List members = new ArrayList<>(); + listCompletableFutureList.getFutures().forEach(listCompletableFuture -> members.addAll(listCompletableFuture.join())); + if(throwable != null) { + log.warn("Failed to load all members in server {} for syncing experience. We started with {} and got {}.", + serverId, supposedUserCount, members.size(), throwable); + } + self.syncUsers(members, serverId, messageChannel).thenAccept(unused -> { + log.info("Finished syncing users for experience roles."); + returnFuture.complete(null); + }).exceptionally(throwable1 -> { + log.error("Failed to sync members.", throwable); + returnFuture.complete(null); + return null; + }); + }).exceptionally(throwable -> { + log.error("Failed to load members.", throwable); returnFuture.complete(null); return null; - }); }); return returnFuture; }