Skip to content

Commit cea6143

Browse files
committed
Optimize auto prune routine to not spam requests for all users
1 parent a51375e commit cea6143

File tree

1 file changed

+22
-9
lines changed

1 file changed

+22
-9
lines changed

application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java

+22-9
Original file line numberDiff line numberDiff line change
@@ -84,23 +84,36 @@ public void runRoutine(JDA jda) {
8484
}
8585

8686
private void pruneForGuild(Guild guild) {
87-
Instant now = Instant.now();
8887
TextChannel selectRoleChannel = getSelectRolesChannelOptional(guild.getJDA()).orElse(null);
88+
guild.loadMembers()
89+
.onSuccess(members -> pruneCategories(guild, members, selectRoleChannel))
90+
.onError(throwable -> logger.error("Failed to request all members for auto prune.",
91+
throwable));
92+
}
93+
94+
private void pruneCategories(Guild guild, List<Member> members,
95+
@Nullable TextChannel selectRoleChannel) {
96+
Instant now = Instant.now();
8997

9098
allCategories.stream()
9199
.map(category -> helper.handleFindRoleForCategory(category, guild))
92100
.filter(Optional::isPresent)
93101
.map(Optional::orElseThrow)
94-
.forEach(role -> pruneRoleIfFull(role, selectRoleChannel, now));
102+
.forEach(role -> pruneRoleIfFull(members, role, selectRoleChannel, now));
95103
}
96104

97-
private void pruneRoleIfFull(Role role, @Nullable TextChannel selectRoleChannel, Instant when) {
98-
role.getGuild().findMembersWithRoles(role).onSuccess(members -> {
99-
if (isRoleFull(members)) {
100-
logger.debug("Helper role {} is full, starting to prune.", role.getName());
101-
pruneRole(role, members, selectRoleChannel, when);
102-
}
103-
});
105+
private void pruneRoleIfFull(List<Member> members, Role targetRole,
106+
@Nullable TextChannel selectRoleChannel, Instant when) {
107+
List<Member> withRole = filterForRole(members, targetRole);
108+
109+
if (isRoleFull(withRole)) {
110+
logger.debug("Helper role {} is full, starting to prune.", targetRole.getName());
111+
pruneRole(targetRole, withRole, selectRoleChannel, when);
112+
}
113+
}
114+
115+
private List<Member> filterForRole(List<Member> members, Role role) {
116+
return members.stream().filter(member -> member.getRoles().contains(role)).toList();
104117
}
105118

106119
private boolean isRoleFull(Collection<?> members) {

0 commit comments

Comments
 (0)