Skip to content

Commit 00e30ba

Browse files
authored
Bugfix/getting your role back message after Auto-Prune routine (#948)
* modify config files to add select-your-roles channel pattern * refactor name for pattern * add method to get select roles channel * refactor AutoPruneHelperRoutine to use select-your-roles channel instead of helper-forum * refactor to pass down channel optional instead of JDA * replaced Optional with Nullable * sonar fix for develop
1 parent 022d77b commit 00e30ba

File tree

4 files changed

+42
-17
lines changed

4 files changed

+42
-17
lines changed

application/config.json.template

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,5 +107,6 @@
107107
],
108108
"special": [
109109
]
110-
}
110+
},
111+
"selectRolesChannelPattern": "select-your-roles"
111112
}

application/src/main/java/org/togetherjava/tjbot/config/Config.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public final class Config {
4141
private final JShellConfig jshell;
4242
private final HelperPruneConfig helperPruneConfig;
4343
private final FeatureBlacklistConfig featureBlacklistConfig;
44+
private final String selectRolesChannelPatten;
4445

4546
@SuppressWarnings("ConstructorWithTooManyParameters")
4647
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
@@ -82,7 +83,9 @@ private Config(@JsonProperty(value = "token", required = true) String token,
8283
@JsonProperty(value = "helperPruneConfig",
8384
required = true) HelperPruneConfig helperPruneConfig,
8485
@JsonProperty(value = "featureBlacklist",
85-
required = true) FeatureBlacklistConfig featureBlacklistConfig) {
86+
required = true) FeatureBlacklistConfig featureBlacklistConfig,
87+
@JsonProperty(value = "selectRolesChannelPattern",
88+
required = true) String selectRolesChannelPatten) {
8689
this.token = Objects.requireNonNull(token);
8790
this.gistApiKey = Objects.requireNonNull(gistApiKey);
8891
this.databasePath = Objects.requireNonNull(databasePath);
@@ -110,6 +113,7 @@ private Config(@JsonProperty(value = "token", required = true) String token,
110113
this.jshell = Objects.requireNonNull(jshell);
111114
this.helperPruneConfig = Objects.requireNonNull(helperPruneConfig);
112115
this.featureBlacklistConfig = Objects.requireNonNull(featureBlacklistConfig);
116+
this.selectRolesChannelPatten = Objects.requireNonNull(selectRolesChannelPatten);
113117
}
114118

115119
/**
@@ -368,4 +372,8 @@ public HelperPruneConfig getHelperPruneConfig() {
368372
public FeatureBlacklistConfig getFeatureBlacklistConfig() {
369373
return featureBlacklistConfig;
370374
}
375+
376+
public String getSelectRolesChannelPatten() {
377+
return selectRolesChannelPatten;
378+
}
371379
}

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

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import net.dv8tion.jda.api.entities.Guild;
55
import net.dv8tion.jda.api.entities.Member;
66
import net.dv8tion.jda.api.entities.Role;
7-
import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel;
7+
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
1010

@@ -14,11 +14,15 @@
1414
import org.togetherjava.tjbot.features.Routine;
1515
import org.togetherjava.tjbot.features.moderation.audit.ModAuditLogWriter;
1616

17+
import javax.annotation.Nullable;
18+
1719
import java.time.Duration;
1820
import java.time.Instant;
1921
import java.time.Period;
2022
import java.util.*;
2123
import java.util.concurrent.TimeUnit;
24+
import java.util.function.Predicate;
25+
import java.util.regex.Pattern;
2226

2327
import static org.togetherjava.tjbot.db.generated.tables.HelpChannelMessages.HELP_CHANNEL_MESSAGES;
2428

@@ -42,6 +46,7 @@ public final class AutoPruneHelperRoutine implements Routine {
4246
private final ModAuditLogWriter modAuditLogWriter;
4347
private final Database database;
4448
private final List<String> allCategories;
49+
private final Predicate<String> selectYourRolesChannelNamePredicate;
4550

4651
/**
4752
* Creates a new instance.
@@ -64,6 +69,8 @@ public AutoPruneHelperRoutine(Config config, HelpSystemHelper helper,
6469
pruneMemberAmount = helperPruneConfig.pruneMemberAmount();
6570
inactiveAfter = Period.ofDays(helperPruneConfig.inactivateAfterDays());
6671
recentlyJoinedDays = helperPruneConfig.recentlyJoinedDays();
72+
selectYourRolesChannelNamePredicate =
73+
Pattern.compile(config.getSelectRolesChannelPatten()).asMatchPredicate();
6774
}
6875

6976
@Override
@@ -77,25 +84,21 @@ public void runRoutine(JDA jda) {
7784
}
7885

7986
private void pruneForGuild(Guild guild) {
80-
ForumChannel helpForum = guild.getForumChannels()
81-
.stream()
82-
.filter(channel -> helper.isHelpForumName(channel.getName()))
83-
.findAny()
84-
.orElseThrow();
8587
Instant now = Instant.now();
88+
TextChannel selectRoleChannel = getSelectRolesChannelOptional(guild.getJDA()).orElse(null);
8689

8790
allCategories.stream()
8891
.map(category -> helper.handleFindRoleForCategory(category, guild))
8992
.filter(Optional::isPresent)
9093
.map(Optional::orElseThrow)
91-
.forEach(role -> pruneRoleIfFull(role, helpForum, now));
94+
.forEach(role -> pruneRoleIfFull(role, selectRoleChannel, now));
9295
}
9396

94-
private void pruneRoleIfFull(Role role, ForumChannel helpForum, Instant when) {
97+
private void pruneRoleIfFull(Role role, @Nullable TextChannel selectRoleChannel, Instant when) {
9598
role.getGuild().findMembersWithRoles(role).onSuccess(members -> {
9699
if (isRoleFull(members)) {
97100
logger.debug("Helper role {} is full, starting to prune.", role.getName());
98-
pruneRole(role, members, helpForum, when);
101+
pruneRole(role, members, selectRoleChannel, when);
99102
}
100103
});
101104
}
@@ -104,8 +107,8 @@ private boolean isRoleFull(Collection<?> members) {
104107
return members.size() >= roleFullThreshold;
105108
}
106109

107-
private void pruneRole(Role role, List<? extends Member> members, ForumChannel helpForum,
108-
Instant when) {
110+
private void pruneRole(Role role, List<? extends Member> members,
111+
@Nullable TextChannel selectRoleChannel, Instant when) {
109112
List<Member> membersShuffled = new ArrayList<>(members);
110113
Collections.shuffle(membersShuffled);
111114

@@ -128,7 +131,7 @@ private void pruneRole(Role role, List<? extends Member> members, ForumChannel h
128131

129132
logger.info("Pruning {} users {} from role {}", membersToPrune.size(), membersToPrune,
130133
role.getName());
131-
membersToPrune.forEach(member -> pruneMemberFromRole(member, role, helpForum));
134+
membersToPrune.forEach(member -> pruneMemberFromRole(member, role, selectRoleChannel));
132135
}
133136

134137
private boolean isMemberInactive(Member member, Instant when) {
@@ -150,15 +153,20 @@ private boolean isMemberInactive(Member member, Instant when) {
150153
.and(HELP_CHANNEL_MESSAGES.SENT_AT.greaterThan(latestActiveMoment)))) == 0;
151154
}
152155

153-
private void pruneMemberFromRole(Member member, Role role, ForumChannel helpForum) {
156+
private void pruneMemberFromRole(Member member, Role role,
157+
@Nullable TextChannel selectRoleChannel) {
154158
Guild guild = member.getGuild();
155159

160+
String channelMentionOrFallbackMessage =
161+
selectRoleChannel == null ? "role selection channel"
162+
: selectRoleChannel.getAsMention();
163+
156164
String dmMessage =
157165
"""
158166
You seem to have been inactive for some time in server **%s**, hence we removed you from the **%s** role.
159167
If that was a mistake, just head back to %s and select the role again.
160168
Sorry for any inconvenience caused by this 🙇"""
161-
.formatted(guild.getName(), role.getName(), helpForum.getAsMention());
169+
.formatted(guild.getName(), role.getName(), channelMentionOrFallbackMessage);
162170

163171
guild.removeRoleFromMember(member, role)
164172
.flatMap(any -> member.getUser().openPrivateChannel())
@@ -173,4 +181,11 @@ private void warnModsAbout(String message, Guild guild) {
173181

174182
modAuditLogWriter.write("Auto-prune helpers", message, null, Instant.now(), guild);
175183
}
184+
185+
private Optional<TextChannel> getSelectRolesChannelOptional(JDA jda) {
186+
return jda.getTextChannels()
187+
.stream()
188+
.filter(textChannel -> selectYourRolesChannelNamePredicate.test(textChannel.getName()))
189+
.findFirst();
190+
}
176191
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,9 @@ public void onModalSubmitted(ModalInteractionEvent event, List<String> args) {
179179
}
180180

181181
private boolean isPostAuthor(Member interactionUser, Message message) {
182-
if (message.getEmbeds().isEmpty())
182+
if (message.getEmbeds().isEmpty()) {
183183
return false;
184+
}
184185

185186
String embedAuthor = Objects
186187
.requireNonNull(message.getEmbeds().get(0).getAuthor(),

0 commit comments

Comments
 (0)