[AB-25] changing member loading to be partitioned

This commit is contained in:
Sheldan
2022-11-20 22:37:10 +01:00
parent 74679c2ccc
commit 7a7ec5654f

View File

@@ -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.service.management.UserInServerManagementService;
import dev.sheldan.abstracto.core.templating.model.MessageToSend; import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import dev.sheldan.abstracto.core.templating.service.TemplateService; 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.core.utils.FutureUtils;
import dev.sheldan.abstracto.experience.config.ExperienceFeatureConfig; import dev.sheldan.abstracto.experience.config.ExperienceFeatureConfig;
import dev.sheldan.abstracto.experience.config.ExperienceFeatureDefinition; 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.Member;
import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; 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.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.task.TaskExecutor; import org.springframework.core.task.TaskExecutor;
@@ -183,18 +185,32 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
CompletableFuture<Void> returnFuture = new CompletableFuture<>(); CompletableFuture<Void> returnFuture = new CompletableFuture<>();
Long serverId = server.getId(); Long serverId = server.getId();
int supposedUserCount = userIds.size(); int supposedUserCount = userIds.size();
memberService.getMembersInServerAsync(server.getId(), userIds).whenComplete((members, throwable) -> {
if(throwable != null) { List<List<Long>> partitionedUserIds = ListUtils.partition(userIds, 100);
log.warn("Failed to load all members in server {} for syncing experience. We started with {} and got {}.", List<CompletableFuture<List<Member>>> memberLoadingFutures = new ArrayList<>();
serverId, supposedUserCount, members.size(), throwable); partitionedUserIds.forEach(userIdsPart -> {
} memberLoadingFutures.add(memberService.getMembersInServerAsync(server.getId(), userIdsPart));
self.syncUsers(members, serverId, messageChannel).thenAccept(unused -> { });
log.info("Finished syncing users for experience roles."); CompletableFutureList<List<Member>> listCompletableFutureList = new CompletableFutureList<>(memberLoadingFutures);
returnFuture.complete(null); listCompletableFutureList.getMainFuture().whenComplete((result, throwable) -> {
}).exceptionally(throwable1 -> { List<Member> 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); returnFuture.complete(null);
return null; return null;
});
}); });
return returnFuture; return returnFuture;
} }