4
4
import net .dv8tion .jda .api .entities .Guild ;
5
5
import net .dv8tion .jda .api .entities .Member ;
6
6
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 ;
8
8
import org .slf4j .Logger ;
9
9
import org .slf4j .LoggerFactory ;
10
10
14
14
import org .togetherjava .tjbot .features .Routine ;
15
15
import org .togetherjava .tjbot .features .moderation .audit .ModAuditLogWriter ;
16
16
17
+ import javax .annotation .Nullable ;
18
+
17
19
import java .time .Duration ;
18
20
import java .time .Instant ;
19
21
import java .time .Period ;
20
22
import java .util .*;
21
23
import java .util .concurrent .TimeUnit ;
24
+ import java .util .function .Predicate ;
25
+ import java .util .regex .Pattern ;
22
26
23
27
import static org .togetherjava .tjbot .db .generated .tables .HelpChannelMessages .HELP_CHANNEL_MESSAGES ;
24
28
@@ -42,6 +46,7 @@ public final class AutoPruneHelperRoutine implements Routine {
42
46
private final ModAuditLogWriter modAuditLogWriter ;
43
47
private final Database database ;
44
48
private final List <String > allCategories ;
49
+ private final Predicate <String > selectYourRolesChannelNamePredicate ;
45
50
46
51
/**
47
52
* Creates a new instance.
@@ -64,6 +69,8 @@ public AutoPruneHelperRoutine(Config config, HelpSystemHelper helper,
64
69
pruneMemberAmount = helperPruneConfig .pruneMemberAmount ();
65
70
inactiveAfter = Period .ofDays (helperPruneConfig .inactivateAfterDays ());
66
71
recentlyJoinedDays = helperPruneConfig .recentlyJoinedDays ();
72
+ selectYourRolesChannelNamePredicate =
73
+ Pattern .compile (config .getSelectRolesChannelPatten ()).asMatchPredicate ();
67
74
}
68
75
69
76
@ Override
@@ -77,25 +84,21 @@ public void runRoutine(JDA jda) {
77
84
}
78
85
79
86
private void pruneForGuild (Guild guild ) {
80
- ForumChannel helpForum = guild .getForumChannels ()
81
- .stream ()
82
- .filter (channel -> helper .isHelpForumName (channel .getName ()))
83
- .findAny ()
84
- .orElseThrow ();
85
87
Instant now = Instant .now ();
88
+ TextChannel selectRoleChannel = getSelectRolesChannelOptional (guild .getJDA ()).orElse (null );
86
89
87
90
allCategories .stream ()
88
91
.map (category -> helper .handleFindRoleForCategory (category , guild ))
89
92
.filter (Optional ::isPresent )
90
93
.map (Optional ::orElseThrow )
91
- .forEach (role -> pruneRoleIfFull (role , helpForum , now ));
94
+ .forEach (role -> pruneRoleIfFull (role , selectRoleChannel , now ));
92
95
}
93
96
94
- private void pruneRoleIfFull (Role role , ForumChannel helpForum , Instant when ) {
97
+ private void pruneRoleIfFull (Role role , @ Nullable TextChannel selectRoleChannel , Instant when ) {
95
98
role .getGuild ().findMembersWithRoles (role ).onSuccess (members -> {
96
99
if (isRoleFull (members )) {
97
100
logger .debug ("Helper role {} is full, starting to prune." , role .getName ());
98
- pruneRole (role , members , helpForum , when );
101
+ pruneRole (role , members , selectRoleChannel , when );
99
102
}
100
103
});
101
104
}
@@ -104,8 +107,8 @@ private boolean isRoleFull(Collection<?> members) {
104
107
return members .size () >= roleFullThreshold ;
105
108
}
106
109
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 ) {
109
112
List <Member > membersShuffled = new ArrayList <>(members );
110
113
Collections .shuffle (membersShuffled );
111
114
@@ -128,7 +131,7 @@ private void pruneRole(Role role, List<? extends Member> members, ForumChannel h
128
131
129
132
logger .info ("Pruning {} users {} from role {}" , membersToPrune .size (), membersToPrune ,
130
133
role .getName ());
131
- membersToPrune .forEach (member -> pruneMemberFromRole (member , role , helpForum ));
134
+ membersToPrune .forEach (member -> pruneMemberFromRole (member , role , selectRoleChannel ));
132
135
}
133
136
134
137
private boolean isMemberInactive (Member member , Instant when ) {
@@ -150,15 +153,20 @@ private boolean isMemberInactive(Member member, Instant when) {
150
153
.and (HELP_CHANNEL_MESSAGES .SENT_AT .greaterThan (latestActiveMoment )))) == 0 ;
151
154
}
152
155
153
- private void pruneMemberFromRole (Member member , Role role , ForumChannel helpForum ) {
156
+ private void pruneMemberFromRole (Member member , Role role ,
157
+ @ Nullable TextChannel selectRoleChannel ) {
154
158
Guild guild = member .getGuild ();
155
159
160
+ String channelMentionOrFallbackMessage =
161
+ selectRoleChannel == null ? "role selection channel"
162
+ : selectRoleChannel .getAsMention ();
163
+
156
164
String dmMessage =
157
165
"""
158
166
You seem to have been inactive for some time in server **%s**, hence we removed you from the **%s** role.
159
167
If that was a mistake, just head back to %s and select the role again.
160
168
Sorry for any inconvenience caused by this 🙇"""
161
- .formatted (guild .getName (), role .getName (), helpForum . getAsMention () );
169
+ .formatted (guild .getName (), role .getName (), channelMentionOrFallbackMessage );
162
170
163
171
guild .removeRoleFromMember (member , role )
164
172
.flatMap (any -> member .getUser ().openPrivateChannel ())
@@ -173,4 +181,11 @@ private void warnModsAbout(String message, Guild guild) {
173
181
174
182
modAuditLogWriter .write ("Auto-prune helpers" , message , null , Instant .now (), guild );
175
183
}
184
+
185
+ private Optional <TextChannel > getSelectRolesChannelOptional (JDA jda ) {
186
+ return jda .getTextChannels ()
187
+ .stream ()
188
+ .filter (textChannel -> selectYourRolesChannelNamePredicate .test (textChannel .getName ()))
189
+ .findFirst ();
190
+ }
176
191
}
0 commit comments