Skip to content

Commit 21a1880

Browse files
committed
Added Guilds, a helper with role and channel find methods
1 parent fa617d1 commit 21a1880

8 files changed

Lines changed: 76 additions & 23 deletions

File tree

application/src/main/java/org/togetherjava/tjbot/features/filesharing/FileSharingMessageListener.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import net.dv8tion.jda.api.entities.Member;
44
import net.dv8tion.jda.api.entities.Message;
5-
import net.dv8tion.jda.api.entities.Role;
65
import net.dv8tion.jda.api.entities.User;
76
import net.dv8tion.jda.api.entities.channel.ChannelType;
87
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
@@ -21,6 +20,7 @@
2120
import org.togetherjava.tjbot.features.UserInteractor;
2221
import org.togetherjava.tjbot.features.componentids.ComponentIdGenerator;
2322
import org.togetherjava.tjbot.features.componentids.ComponentIdInteractor;
23+
import org.togetherjava.tjbot.features.utils.Guilds;
2424

2525
import java.io.IOException;
2626
import java.io.InputStream;
@@ -99,8 +99,7 @@ public void onMessageReceived(MessageReceivedEvent event) {
9999
public void onButtonClick(ButtonInteractionEvent event, List<String> args) {
100100
Member interactionUser = event.getMember();
101101
String gistAuthorId = args.getFirst();
102-
boolean hasSoftModPermissions =
103-
interactionUser.getRoles().stream().map(Role::getName).anyMatch(isSoftModRole);
102+
boolean hasSoftModPermissions = Guilds.hasMemberRole(interactionUser, isSoftModRole);
104103

105104
if (!gistAuthorId.equals(interactionUser.getId()) && !hasSoftModPermissions) {
106105
event.reply("You do not have permission for this action.").setEphemeral(true).queue();

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.togetherjava.tjbot.features.chatgpt.ChatGptCommand;
2828
import org.togetherjava.tjbot.features.chatgpt.ChatGptService;
2929
import org.togetherjava.tjbot.features.componentids.ComponentIdInteractor;
30+
import org.togetherjava.tjbot.features.utils.Guilds;
3031

3132
import java.awt.Color;
3233
import java.time.Instant;
@@ -57,7 +58,7 @@ public final class HelpSystemHelper {
5758

5859
static final Color AMBIENT_COLOR = new Color(255, 255, 165);
5960

60-
private final Predicate<String> hasTagManageRole;
61+
private final Predicate<String> isTagManageRole;
6162
private final Predicate<String> isHelpForumName;
6263
private final String helpForumPattern;
6364
/**
@@ -88,7 +89,7 @@ public HelpSystemHelper(Config config, Database database, ChatGptService chatGpt
8889
this.database = database;
8990
this.chatGptService = chatGptService;
9091

91-
hasTagManageRole = Pattern.compile(config.getTagManageRolePattern()).asMatchPredicate();
92+
isTagManageRole = Pattern.compile(config.getTagManageRolePattern()).asMatchPredicate();
9293
helpForumPattern = helpConfig.getHelpForumPattern();
9394
isHelpForumName = Pattern.compile(helpForumPattern).asMatchPredicate();
9495

@@ -344,7 +345,7 @@ private static ForumTag requireTag(String tagName, ForumChannel forumChannel) {
344345
}
345346

346347
boolean hasTagManageRole(Member member) {
347-
return member.getRoles().stream().map(Role::getName).anyMatch(hasTagManageRole);
348+
return Guilds.hasMemberRole(member, isTagManageRole);
348349
}
349350

350351
boolean isHelpForumName(String channelName) {

application/src/main/java/org/togetherjava/tjbot/features/moderation/ModerationUtils.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.togetherjava.tjbot.config.Config;
2020
import org.togetherjava.tjbot.features.moderation.modmail.ModMailCommand;
21+
import org.togetherjava.tjbot.features.utils.Guilds;
2122
import org.togetherjava.tjbot.features.utils.MessageUtils;
2223

2324
import javax.annotation.Nullable;
@@ -321,7 +322,7 @@ public static Predicate<String> getIsMutedRolePredicate(Config config) {
321322
*/
322323
public static Optional<Role> getMutedRole(Guild guild, Config config) {
323324
Predicate<String> isMutedRole = getIsMutedRolePredicate(config);
324-
return guild.getRoles().stream().filter(role -> isMutedRole.test(role.getName())).findAny();
325+
return Guilds.findRole(guild, isMutedRole);
325326
}
326327

327328
/**
@@ -343,10 +344,7 @@ public static Predicate<String> getIsQuarantinedRolePredicate(Config config) {
343344
*/
344345
public static Optional<Role> getQuarantinedRole(Guild guild, Config config) {
345346
Predicate<String> isQuarantinedRole = getIsQuarantinedRolePredicate(config);
346-
return guild.getRoles()
347-
.stream()
348-
.filter(role -> isQuarantinedRole.test(role.getName()))
349-
.findAny();
347+
return Guilds.findRole(guild, isQuarantinedRole);
350348
}
351349

352350
/**

application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/ScamBlocker.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import net.dv8tion.jda.api.entities.Member;
77
import net.dv8tion.jda.api.entities.Message;
88
import net.dv8tion.jda.api.entities.MessageEmbed;
9-
import net.dv8tion.jda.api.entities.Role;
109
import net.dv8tion.jda.api.entities.SelfUser;
1110
import net.dv8tion.jda.api.entities.User;
1211
import net.dv8tion.jda.api.entities.channel.concrete.PrivateChannel;
@@ -34,13 +33,15 @@
3433
import org.togetherjava.tjbot.features.moderation.ModerationActionsStore;
3534
import org.togetherjava.tjbot.features.moderation.ModerationUtils;
3635
import org.togetherjava.tjbot.features.moderation.modmail.ModMailCommand;
36+
import org.togetherjava.tjbot.features.utils.Guilds;
3737
import org.togetherjava.tjbot.features.utils.MessageUtils;
3838
import org.togetherjava.tjbot.logging.LogMarkers;
3939

4040
import java.awt.Color;
4141
import java.util.Collection;
4242
import java.util.EnumSet;
4343
import java.util.List;
44+
import java.util.Objects;
4445
import java.util.Optional;
4546
import java.util.Set;
4647
import java.util.function.Consumer;
@@ -71,7 +72,7 @@ public final class ScamBlocker extends MessageReceiverAdapter implements UserInt
7172
private final Config config;
7273
private final ModerationActionsStore actionsStore;
7374
private final ScamHistoryStore scamHistoryStore;
74-
private final Predicate<String> hasRequiredRole;
75+
private final Predicate<String> isRequiredRole;
7576

7677
private final ComponentIdInteractor componentIdInteractor;
7778

@@ -100,7 +101,7 @@ public ScamBlocker(ModerationActionsStore actionsStore, ScamHistoryStore scamHis
100101
Pattern.compile(botTrapChannelPattern).asMatchPredicate();
101102
isBotTrapChannel = channel -> isBotTrapChannelName.test(channel.getName());
102103

103-
hasRequiredRole = Pattern.compile(config.getSoftModerationRolePattern()).asMatchPredicate();
104+
isRequiredRole = Pattern.compile(config.getSoftModerationRolePattern()).asMatchPredicate();
104105

105106
componentIdInteractor = new ComponentIdInteractor(getInteractionType(), getName());
106107
}
@@ -316,7 +317,8 @@ private String generateComponentId(ComponentIdArguments args) {
316317
@Override
317318
public void onButtonClick(ButtonInteractionEvent event, List<String> argsRaw) {
318319
ComponentIdArguments args = ComponentIdArguments.fromList(argsRaw);
319-
if (event.getMember().getRoles().stream().map(Role::getName).noneMatch(hasRequiredRole)) {
320+
if (Guilds.doesMemberNotHaveRole(Objects.requireNonNull(event.getMember()),
321+
isRequiredRole)) {
320322
event.reply(
321323
"You can not handle scam in this guild, since you do not have the required role.")
322324
.setEphemeral(true)

application/src/main/java/org/togetherjava/tjbot/features/moderation/scam/ScamDetector.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import net.dv8tion.jda.api.entities.Member;
44
import net.dv8tion.jda.api.entities.Message;
5-
import net.dv8tion.jda.api.entities.Role;
65

76
import org.togetherjava.tjbot.config.Config;
87
import org.togetherjava.tjbot.config.ScamBlockerConfig;
8+
import org.togetherjava.tjbot.features.utils.Guilds;
99

1010
import java.util.Collection;
1111
import java.util.List;
@@ -51,8 +51,7 @@ public ScamDetector(Config config) {
5151
*/
5252
public boolean isScam(Message message) {
5353
Member author = message.getMember();
54-
boolean isTrustedUser = author != null
55-
&& author.getRoles().stream().map(Role::getName).anyMatch(hasTrustedRole);
54+
boolean isTrustedUser = author != null && Guilds.hasMemberRole(author, hasTrustedRole);
5655
if (isTrustedUser) {
5756
return false;
5857
}

application/src/main/java/org/togetherjava/tjbot/features/tophelper/TopHelpersAssignmentRoutine.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.togetherjava.tjbot.features.UserInteractor;
2626
import org.togetherjava.tjbot.features.componentids.ComponentIdGenerator;
2727
import org.togetherjava.tjbot.features.componentids.ComponentIdInteractor;
28+
import org.togetherjava.tjbot.features.utils.Guilds;
2829

2930
import javax.annotation.Nullable;
3031

@@ -213,10 +214,7 @@ public void onStringSelectSelection(StringSelectInteractionEvent event, List<Str
213214
.map(Long::parseLong)
214215
.collect(Collectors.toSet());
215216

216-
Optional<Role> topHelperRole = guild.getRoles()
217-
.stream()
218-
.filter(role -> roleNamePredicate.test(role.getName()))
219-
.findAny();
217+
Optional<Role> topHelperRole = Guilds.findRole(guild, roleNamePredicate);
220218
if (topHelperRole.isEmpty()) {
221219
logger.warn(
222220
"Unable to assign Top Helpers, did not find a role matching the configured pattern '{}' for guild '{}'",
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package org.togetherjava.tjbot.features.utils;
2+
3+
import net.dv8tion.jda.api.entities.Guild;
4+
import net.dv8tion.jda.api.entities.Member;
5+
import net.dv8tion.jda.api.entities.Role;
6+
7+
import java.util.Optional;
8+
import java.util.function.Predicate;
9+
10+
/**
11+
* Utility methods for working with {@link Guild}s.
12+
* <p>
13+
* This class is meant to contain all utility methods for {@link Guild}s that can be used on all
14+
* other commands to avoid similar methods appearing everywhere.
15+
*/
16+
public final class Guilds {
17+
private Guilds() {
18+
throw new UnsupportedOperationException("Utility class, construction not supported");
19+
}
20+
21+
/**
22+
* Finds any role in the guild whose name matches the given predicate.
23+
*
24+
* @param guild guild to search the role in
25+
* @param isRoleName a predicate matching the name of the role to search
26+
* @return the matched role, if any
27+
*/
28+
public static Optional<Role> findRole(Guild guild, Predicate<? super String> isRoleName) {
29+
return guild.getRoles().stream().filter(role -> isRoleName.test(role.getName())).findAny();
30+
}
31+
32+
/**
33+
* Checks whether a given member has a role whose name matches a given predicate.
34+
*
35+
* @param member the member to check
36+
* @param isRoleName a predicate matching the name of the role to search
37+
* @return {@code true} if the member has a matching role, {@code false} otherwise
38+
* @see #doesMemberNotHaveRole(Member, Predicate)
39+
*/
40+
public static boolean hasMemberRole(Member member, Predicate<? super String> isRoleName) {
41+
return member.getRoles().stream().map(Role::getName).anyMatch(isRoleName);
42+
}
43+
44+
/**
45+
* Checks whether a given member does not have a role whose name matches a given predicate.
46+
*
47+
* @param member the member to check
48+
* @param isRoleName a predicate matching the name of the role to search
49+
* @return {@code true} if the member does not have any matching role, {@code false} otherwise
50+
* @see #hasMemberRole(Member, Predicate)
51+
*/
52+
public static boolean doesMemberNotHaveRole(Member member,
53+
Predicate<? super String> isRoleName) {
54+
return member.getRoles().stream().map(Role::getName).noneMatch(isRoleName);
55+
}
56+
}

application/src/main/java/org/togetherjava/tjbot/features/utils/MessageUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
* This class is meant to contain all utility methods for {@link Message} that can be used on all
2020
* other commands to avoid similar methods appearing everywhere.
2121
*/
22-
public class MessageUtils {
22+
public final class MessageUtils {
2323
public static final int MAXIMUM_VISIBLE_EMBEDS = 25;
2424
public static final String ABBREVIATION = "...";
2525
private static final String CODE_FENCE_SYMBOL = "```";

0 commit comments

Comments
 (0)