Skip to content

Commit 559694b

Browse files
authored
Merge pull request #510 from danthe1st/role-prune
assign role for pruning
2 parents ae8208f + a534326 commit 559694b

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

src/main/java/net/discordjug/javabot/systems/moderation/PruneCommand.java

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,18 @@
1818
import java.time.OffsetDateTime;
1919
import java.time.ZoneOffset;
2020
import java.time.format.DateTimeFormatter;
21-
import java.util.concurrent.TimeUnit;
21+
import java.util.List;
22+
import java.util.concurrent.atomic.AtomicInteger;
2223
import java.util.regex.Pattern;
2324

25+
import lombok.extern.slf4j.Slf4j;
26+
2427
/**
2528
* <h3>This class represents the /prune command.</h3>
2629
* This command will systematically ban users from the server if they match
2730
* certain criteria.
2831
*/
32+
@Slf4j
2933
public class PruneCommand extends ModerateCommand {
3034
private static final DateTimeFormatter TIMESTAMP_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
3135

@@ -39,8 +43,6 @@ public PruneCommand(BotConfig botConfig) {
3943
.addOption(OptionType.STRING, "pattern", "A regular expression pattern to use, to remove members whose contains a match with the pattern.", false)
4044
.addOption(OptionType.STRING, "before", "Remove only users before the given timestamp. Format is yyyy-MM-dd HH:mm:ss, in UTC.", false)
4145
.addOption(OptionType.STRING, "after", "Remove only users after the given timestamp. Format is yyyy-MM-dd HH:mm:ss, in UTC.", false)
42-
.addOption(OptionType.STRING, "reason", "The reason for issuing the prune command. This will be provided as the reason for each ban.", false)
43-
.addOption(OptionType.INTEGER, "delete-days-of-history", "The number of days of the banned users' chat history to remove, between 0 and 7. Defaults to 0.", false)
4446
);
4547
}
4648

@@ -54,36 +56,46 @@ protected ReplyCallbackAction handleModerationCommand(@NotNull SlashCommandInter
5456
OptionMapping patternOption = event.getOption("pattern");
5557
OptionMapping beforeOption = event.getOption("before");
5658
OptionMapping afterOption = event.getOption("after");
57-
OptionMapping reasonOption = event.getOption("reason");
58-
OptionMapping delDaysOption = event.getOption("delete-days-of-history");
5959

6060
final Pattern pattern = patternOption == null ? null : Pattern.compile(patternOption.getAsString());
6161
final OffsetDateTime before = beforeOption == null ? null : LocalDateTime.parse(beforeOption.getAsString(), TIMESTAMP_FORMATTER).atOffset(ZoneOffset.UTC);
6262
final OffsetDateTime after = afterOption == null ? null : LocalDateTime.parse(afterOption.getAsString(), TIMESTAMP_FORMATTER).atOffset(ZoneOffset.UTC);
63-
final int delDays = delDaysOption == null ? 0 : (int) delDaysOption.getAsLong();
64-
final String reason = reasonOption == null ? null : reasonOption.getAsString();
6563

6664
if (pattern == null && before == null && after == null) {
6765
return Responses.warning(event, "At least one filter parameter must be given; cannot remove every user from the server.");
6866
}
69-
if (delDays < 0 || delDays > 7) {
70-
return Responses.warning(event, "The number of days of history to delete must not be less than 0, or greater than 7.");
71-
}
72-
if (reason != null && reason.length() > 512) {
73-
return Responses.warning(event, "The reason for the prune cannot be more than 512 characters.");
74-
}
75-
76-
event.getGuild().loadMembers().onSuccess(members -> {
77-
members.forEach(member -> {
78-
boolean shouldRemove = (pattern == null || pattern.matcher(member.getUser().getName()).find()) &&
79-
(before == null || member.getTimeJoined().isBefore(before)) &&
80-
(after == null || member.getTimeJoined().isAfter(after));
81-
if (shouldRemove) {
82-
config.getLogChannel().sendMessage("Removing " + UserUtils.getUserTag(member.getUser()) + " as part of prune.").queue();
83-
member.ban(delDays, TimeUnit.DAYS).reason(reason).queue();
67+
String pruneRoleName = "prune-" + LocalDateTime.now();
68+
event.getGuild().createRole().setName(pruneRoleName).queue(role -> {
69+
event.getGuild().loadMembers().onSuccess(members -> {
70+
AtomicInteger count = new AtomicInteger(0);
71+
members.forEach(member -> {
72+
boolean shouldRemove = (pattern == null || pattern.matcher(member.getUser().getName()).find()) &&
73+
(before == null || member.getTimeJoined().isBefore(before)) &&
74+
(after == null || member.getTimeJoined().isAfter(after));
75+
if (shouldRemove) {
76+
if(member.getUser().isBot() || !moderator.canInteract(member) || Checks.hasStaffRole(botConfig, member)) {
77+
config.getLogChannel()
78+
.sendMessage("# WARNING\nPrune by " + moderator.getAsMention() + " would affect " + UserUtils.getUserTag(member.getUser()) + " who is a privileged user! This is likely not intentional.")
79+
.queue();
80+
return;
81+
}
82+
log.info("Marking " + UserUtils.getUserTag(member.getUser()) + " with " + pruneRoleName +" as part of prune.");
83+
config.getLogChannel()
84+
.sendMessage("Marking " + member.getAsMention() + " (" + UserUtils.getUserTag(member.getUser()) + ") with " + role.getAsMention() +" as part of prune.")
85+
.setAllowedMentions(List.of())
86+
.queue();
87+
event.getGuild().addRoleToMember(member, role).queue();
88+
count.incrementAndGet();
89+
}
90+
});
91+
int finalCount = count.get();
92+
config.getLogChannel().sendMessage("Prune by "+ moderator.getAsMention() +" complete - the role " + pruneRoleName + " is being assigned to " + finalCount + " members.").queue();
93+
if (finalCount > members.size()/10) {
94+
config.getLogChannel().sendMessage("# WARNING\nThis prune affects a significant portion of all members!").queue();
8495
}
8596
});
8697
});
98+
8799
return Responses.success(event, "Prune Started", "The prune action has started. Please check the log channel for information on the status of the prune.");
88100

89101
}

0 commit comments

Comments
 (0)