From 474c24975d1b2932ad3ac7ce684abdce968c6a9d Mon Sep 17 00:00:00 2001 From: alphaBEE Date: Sun, 12 Nov 2023 19:19:03 +0530 Subject: [PATCH 1/7] modify config files to add select-your-roles channel pattern --- application/config.json.template | 3 ++- .../java/org/togetherjava/tjbot/config/Config.java | 10 +++++++++- .../tjbot/features/help/AutoPruneHelperRoutine.java | 5 +++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/application/config.json.template b/application/config.json.template index c625b3d212..4776c8a9ee 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -107,5 +107,6 @@ ], "special": [ ] - } + }, + "selectYourRolesChannelPattern": "select-your-roles" } diff --git a/application/src/main/java/org/togetherjava/tjbot/config/Config.java b/application/src/main/java/org/togetherjava/tjbot/config/Config.java index 161bfe75fd..1d26580f54 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/Config.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/Config.java @@ -41,6 +41,7 @@ public final class Config { private final JShellConfig jshell; private final HelperPruneConfig helperPruneConfig; private final FeatureBlacklistConfig featureBlacklistConfig; + private final String selectYourRolesChannelPatten; @SuppressWarnings("ConstructorWithTooManyParameters") @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) @@ -82,7 +83,9 @@ private Config(@JsonProperty(value = "token", required = true) String token, @JsonProperty(value = "helperPruneConfig", required = true) HelperPruneConfig helperPruneConfig, @JsonProperty(value = "featureBlacklist", - required = true) FeatureBlacklistConfig featureBlacklistConfig) { + required = true) FeatureBlacklistConfig featureBlacklistConfig, + @JsonProperty(value = "selectYourRolesChannelPattern", + required = true) String selectYourRolesChannelPatten) { this.token = Objects.requireNonNull(token); this.gistApiKey = Objects.requireNonNull(gistApiKey); this.databasePath = Objects.requireNonNull(databasePath); @@ -110,6 +113,7 @@ private Config(@JsonProperty(value = "token", required = true) String token, this.jshell = Objects.requireNonNull(jshell); this.helperPruneConfig = Objects.requireNonNull(helperPruneConfig); this.featureBlacklistConfig = Objects.requireNonNull(featureBlacklistConfig); + this.selectYourRolesChannelPatten = Objects.requireNonNull(selectYourRolesChannelPatten); } /** @@ -368,4 +372,8 @@ public HelperPruneConfig getHelperPruneConfig() { public FeatureBlacklistConfig getFeatureBlacklistConfig() { return featureBlacklistConfig; } + + public String getSelectYourRolesChannelPatten() { + return selectYourRolesChannelPatten; + } } diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java index 63563ccf1e..33bf699668 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java @@ -19,6 +19,8 @@ import java.time.Period; import java.util.*; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import java.util.regex.Pattern; import static org.togetherjava.tjbot.db.generated.tables.HelpChannelMessages.HELP_CHANNEL_MESSAGES; @@ -42,6 +44,7 @@ public final class AutoPruneHelperRoutine implements Routine { private final ModAuditLogWriter modAuditLogWriter; private final Database database; private final List allCategories; + private final Predicate selectYourRolesChannelNamePredicate; /** * Creates a new instance. @@ -64,6 +67,8 @@ public AutoPruneHelperRoutine(Config config, HelpSystemHelper helper, pruneMemberAmount = helperPruneConfig.pruneMemberAmount(); inactiveAfter = Period.ofDays(helperPruneConfig.inactivateAfterDays()); recentlyJoinedDays = helperPruneConfig.recentlyJoinedDays(); + selectYourRolesChannelNamePredicate = + Pattern.compile(config.getSelectYourRolesChannelPatten()).asMatchPredicate(); } @Override From 1deec9fb29048455ce543c3f9bf992bca8d858c8 Mon Sep 17 00:00:00 2001 From: alphaBEE Date: Sun, 12 Nov 2023 19:35:07 +0530 Subject: [PATCH 2/7] refactor name for pattern --- application/config.json.template | 2 +- .../java/org/togetherjava/tjbot/config/Config.java | 12 ++++++------ .../tjbot/features/help/AutoPruneHelperRoutine.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/application/config.json.template b/application/config.json.template index 4776c8a9ee..4819ac8478 100644 --- a/application/config.json.template +++ b/application/config.json.template @@ -108,5 +108,5 @@ "special": [ ] }, - "selectYourRolesChannelPattern": "select-your-roles" + "selectRolesChannelPattern": "select-your-roles" } diff --git a/application/src/main/java/org/togetherjava/tjbot/config/Config.java b/application/src/main/java/org/togetherjava/tjbot/config/Config.java index 1d26580f54..5ab478d9b5 100644 --- a/application/src/main/java/org/togetherjava/tjbot/config/Config.java +++ b/application/src/main/java/org/togetherjava/tjbot/config/Config.java @@ -41,7 +41,7 @@ public final class Config { private final JShellConfig jshell; private final HelperPruneConfig helperPruneConfig; private final FeatureBlacklistConfig featureBlacklistConfig; - private final String selectYourRolesChannelPatten; + private final String selectRolesChannelPatten; @SuppressWarnings("ConstructorWithTooManyParameters") @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) @@ -84,8 +84,8 @@ private Config(@JsonProperty(value = "token", required = true) String token, required = true) HelperPruneConfig helperPruneConfig, @JsonProperty(value = "featureBlacklist", required = true) FeatureBlacklistConfig featureBlacklistConfig, - @JsonProperty(value = "selectYourRolesChannelPattern", - required = true) String selectYourRolesChannelPatten) { + @JsonProperty(value = "selectRolesChannelPattern", + required = true) String selectRolesChannelPatten) { this.token = Objects.requireNonNull(token); this.gistApiKey = Objects.requireNonNull(gistApiKey); this.databasePath = Objects.requireNonNull(databasePath); @@ -113,7 +113,7 @@ private Config(@JsonProperty(value = "token", required = true) String token, this.jshell = Objects.requireNonNull(jshell); this.helperPruneConfig = Objects.requireNonNull(helperPruneConfig); this.featureBlacklistConfig = Objects.requireNonNull(featureBlacklistConfig); - this.selectYourRolesChannelPatten = Objects.requireNonNull(selectYourRolesChannelPatten); + this.selectRolesChannelPatten = Objects.requireNonNull(selectRolesChannelPatten); } /** @@ -373,7 +373,7 @@ public FeatureBlacklistConfig getFeatureBlacklistConfig() { return featureBlacklistConfig; } - public String getSelectYourRolesChannelPatten() { - return selectYourRolesChannelPatten; + public String getSelectRolesChannelPatten() { + return selectRolesChannelPatten; } } diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java index 33bf699668..163003975b 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java @@ -68,7 +68,7 @@ public AutoPruneHelperRoutine(Config config, HelpSystemHelper helper, inactiveAfter = Period.ofDays(helperPruneConfig.inactivateAfterDays()); recentlyJoinedDays = helperPruneConfig.recentlyJoinedDays(); selectYourRolesChannelNamePredicate = - Pattern.compile(config.getSelectYourRolesChannelPatten()).asMatchPredicate(); + Pattern.compile(config.getSelectRolesChannelPatten()).asMatchPredicate(); } @Override From 748ba2e1caf51bbf9deddebb9e0209e7b8bc0e9f Mon Sep 17 00:00:00 2001 From: alphaBEE Date: Sun, 12 Nov 2023 19:45:34 +0530 Subject: [PATCH 3/7] add method to get select roles channel --- .../tjbot/features/help/AutoPruneHelperRoutine.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java index 163003975b..af8c606365 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java @@ -5,6 +5,7 @@ import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -178,4 +179,14 @@ private void warnModsAbout(String message, Guild guild) { modAuditLogWriter.write("Auto-prune helpers", message, null, Instant.now(), guild); } + + private TextChannel getSelectRolesChannel(JDA jda) { + Optional selectRolesChannelOptional = jda.getTextChannels() + .stream() + .filter(textChannel -> selectYourRolesChannelNamePredicate.test(textChannel.getName())) + .findFirst(); + + return selectRolesChannelOptional.orElseThrow(() -> new IllegalStateException( + "Did not find the select your roles channel during AutoPruneHelper routine. Make sure the config is setup properly.")); + } } From c720d5c92292e24cf278e7926ee746fefa1b8727 Mon Sep 17 00:00:00 2001 From: alphaBEE Date: Sun, 12 Nov 2023 20:57:25 +0530 Subject: [PATCH 4/7] refactor AutoPruneHelperRoutine to use select-your-roles channel instead of helper-forum --- .../features/help/AutoPruneHelperRoutine.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java index af8c606365..df46899bd3 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java @@ -4,7 +4,6 @@ import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.entities.channel.concrete.ForumChannel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,25 +82,21 @@ public void runRoutine(JDA jda) { } private void pruneForGuild(Guild guild) { - ForumChannel helpForum = guild.getForumChannels() - .stream() - .filter(channel -> helper.isHelpForumName(channel.getName())) - .findAny() - .orElseThrow(); Instant now = Instant.now(); + JDA jda = guild.getJDA(); allCategories.stream() .map(category -> helper.handleFindRoleForCategory(category, guild)) .filter(Optional::isPresent) .map(Optional::orElseThrow) - .forEach(role -> pruneRoleIfFull(role, helpForum, now)); + .forEach(role -> pruneRoleIfFull(role, jda, now)); } - private void pruneRoleIfFull(Role role, ForumChannel helpForum, Instant when) { + private void pruneRoleIfFull(Role role, JDA jda, Instant when) { role.getGuild().findMembersWithRoles(role).onSuccess(members -> { if (isRoleFull(members)) { logger.debug("Helper role {} is full, starting to prune.", role.getName()); - pruneRole(role, members, helpForum, when); + pruneRole(role, members, jda, when); } }); } @@ -110,8 +105,7 @@ private boolean isRoleFull(Collection members) { return members.size() >= roleFullThreshold; } - private void pruneRole(Role role, List members, ForumChannel helpForum, - Instant when) { + private void pruneRole(Role role, List members, JDA jda, Instant when) { List membersShuffled = new ArrayList<>(members); Collections.shuffle(membersShuffled); @@ -134,7 +128,7 @@ private void pruneRole(Role role, List members, ForumChannel h logger.info("Pruning {} users {} from role {}", membersToPrune.size(), membersToPrune, role.getName()); - membersToPrune.forEach(member -> pruneMemberFromRole(member, role, helpForum)); + membersToPrune.forEach(member -> pruneMemberFromRole(member, role, jda)); } private boolean isMemberInactive(Member member, Instant when) { @@ -156,15 +150,16 @@ private boolean isMemberInactive(Member member, Instant when) { .and(HELP_CHANNEL_MESSAGES.SENT_AT.greaterThan(latestActiveMoment)))) == 0; } - private void pruneMemberFromRole(Member member, Role role, ForumChannel helpForum) { + private void pruneMemberFromRole(Member member, Role role, JDA jda) { Guild guild = member.getGuild(); + TextChannel selectRolesChannel = getSelectRolesChannel(jda); String dmMessage = """ You seem to have been inactive for some time in server **%s**, hence we removed you from the **%s** role. If that was a mistake, just head back to %s and select the role again. Sorry for any inconvenience caused by this 🙇""" - .formatted(guild.getName(), role.getName(), helpForum.getAsMention()); + .formatted(guild.getName(), role.getName(), selectRolesChannel.getAsMention()); guild.removeRoleFromMember(member, role) .flatMap(any -> member.getUser().openPrivateChannel()) @@ -187,6 +182,6 @@ private TextChannel getSelectRolesChannel(JDA jda) { .findFirst(); return selectRolesChannelOptional.orElseThrow(() -> new IllegalStateException( - "Did not find the select your roles channel during AutoPruneHelper routine. Make sure the config is setup properly.")); + "Could not find role selection channel during AutoPruneHelper routine. Make sure the config is setup properly.")); } } From de6f1fc6d2df4679e5b103d3938262426482a2bd Mon Sep 17 00:00:00 2001 From: alphaBEE Date: Mon, 13 Nov 2023 21:44:55 +0530 Subject: [PATCH 5/7] refactor to pass down channel optional instead of JDA --- .../features/help/AutoPruneHelperRoutine.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java index df46899bd3..c93237fecf 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java @@ -4,6 +4,7 @@ import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.entities.channel.Channel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,20 +84,22 @@ public void runRoutine(JDA jda) { private void pruneForGuild(Guild guild) { Instant now = Instant.now(); - JDA jda = guild.getJDA(); + Optional selectRoleChannelOptional = + getSelectRolesChannelOptional(guild.getJDA()); allCategories.stream() .map(category -> helper.handleFindRoleForCategory(category, guild)) .filter(Optional::isPresent) .map(Optional::orElseThrow) - .forEach(role -> pruneRoleIfFull(role, jda, now)); + .forEach(role -> pruneRoleIfFull(role, selectRoleChannelOptional, now)); } - private void pruneRoleIfFull(Role role, JDA jda, Instant when) { + private void pruneRoleIfFull(Role role, Optional selectRoleChannelOptional, + Instant when) { role.getGuild().findMembersWithRoles(role).onSuccess(members -> { if (isRoleFull(members)) { logger.debug("Helper role {} is full, starting to prune.", role.getName()); - pruneRole(role, members, jda, when); + pruneRole(role, members, selectRoleChannelOptional, when); } }); } @@ -105,7 +108,8 @@ private boolean isRoleFull(Collection members) { return members.size() >= roleFullThreshold; } - private void pruneRole(Role role, List members, JDA jda, Instant when) { + private void pruneRole(Role role, List members, + Optional selectRoleChannelOptional, Instant when) { List membersShuffled = new ArrayList<>(members); Collections.shuffle(membersShuffled); @@ -128,7 +132,8 @@ private void pruneRole(Role role, List members, JDA jda, Insta logger.info("Pruning {} users {} from role {}", membersToPrune.size(), membersToPrune, role.getName()); - membersToPrune.forEach(member -> pruneMemberFromRole(member, role, jda)); + membersToPrune + .forEach(member -> pruneMemberFromRole(member, role, selectRoleChannelOptional)); } private boolean isMemberInactive(Member member, Instant when) { @@ -150,16 +155,18 @@ private boolean isMemberInactive(Member member, Instant when) { .and(HELP_CHANNEL_MESSAGES.SENT_AT.greaterThan(latestActiveMoment)))) == 0; } - private void pruneMemberFromRole(Member member, Role role, JDA jda) { + private void pruneMemberFromRole(Member member, Role role, + Optional selectRoleChannelOptional) { Guild guild = member.getGuild(); - TextChannel selectRolesChannel = getSelectRolesChannel(jda); + String channelMentionOrFallbackMessage = + selectRoleChannelOptional.map(Channel::getAsMention).orElse("appropriate channel"); String dmMessage = """ You seem to have been inactive for some time in server **%s**, hence we removed you from the **%s** role. If that was a mistake, just head back to %s and select the role again. Sorry for any inconvenience caused by this 🙇""" - .formatted(guild.getName(), role.getName(), selectRolesChannel.getAsMention()); + .formatted(guild.getName(), role.getName(), channelMentionOrFallbackMessage); guild.removeRoleFromMember(member, role) .flatMap(any -> member.getUser().openPrivateChannel()) @@ -175,13 +182,10 @@ private void warnModsAbout(String message, Guild guild) { modAuditLogWriter.write("Auto-prune helpers", message, null, Instant.now(), guild); } - private TextChannel getSelectRolesChannel(JDA jda) { - Optional selectRolesChannelOptional = jda.getTextChannels() + private Optional getSelectRolesChannelOptional(JDA jda) { + return jda.getTextChannels() .stream() .filter(textChannel -> selectYourRolesChannelNamePredicate.test(textChannel.getName())) .findFirst(); - - return selectRolesChannelOptional.orElseThrow(() -> new IllegalStateException( - "Could not find role selection channel during AutoPruneHelper routine. Make sure the config is setup properly.")); } } From 0b05566dc9506a53fce05dc606a421664bd7dc8f Mon Sep 17 00:00:00 2001 From: alphaBEE Date: Mon, 13 Nov 2023 23:38:38 +0530 Subject: [PATCH 6/7] replaced Optional with Nullable --- .../features/help/AutoPruneHelperRoutine.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java index c93237fecf..b093fbde4e 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/AutoPruneHelperRoutine.java @@ -4,7 +4,6 @@ import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.entities.channel.Channel; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,6 +14,8 @@ import org.togetherjava.tjbot.features.Routine; import org.togetherjava.tjbot.features.moderation.audit.ModAuditLogWriter; +import javax.annotation.Nullable; + import java.time.Duration; import java.time.Instant; import java.time.Period; @@ -84,22 +85,20 @@ public void runRoutine(JDA jda) { private void pruneForGuild(Guild guild) { Instant now = Instant.now(); - Optional selectRoleChannelOptional = - getSelectRolesChannelOptional(guild.getJDA()); + TextChannel selectRoleChannel = getSelectRolesChannelOptional(guild.getJDA()).orElse(null); allCategories.stream() .map(category -> helper.handleFindRoleForCategory(category, guild)) .filter(Optional::isPresent) .map(Optional::orElseThrow) - .forEach(role -> pruneRoleIfFull(role, selectRoleChannelOptional, now)); + .forEach(role -> pruneRoleIfFull(role, selectRoleChannel, now)); } - private void pruneRoleIfFull(Role role, Optional selectRoleChannelOptional, - Instant when) { + private void pruneRoleIfFull(Role role, @Nullable TextChannel selectRoleChannel, Instant when) { role.getGuild().findMembersWithRoles(role).onSuccess(members -> { if (isRoleFull(members)) { logger.debug("Helper role {} is full, starting to prune.", role.getName()); - pruneRole(role, members, selectRoleChannelOptional, when); + pruneRole(role, members, selectRoleChannel, when); } }); } @@ -109,7 +108,7 @@ private boolean isRoleFull(Collection members) { } private void pruneRole(Role role, List members, - Optional selectRoleChannelOptional, Instant when) { + @Nullable TextChannel selectRoleChannel, Instant when) { List membersShuffled = new ArrayList<>(members); Collections.shuffle(membersShuffled); @@ -132,8 +131,7 @@ private void pruneRole(Role role, List members, logger.info("Pruning {} users {} from role {}", membersToPrune.size(), membersToPrune, role.getName()); - membersToPrune - .forEach(member -> pruneMemberFromRole(member, role, selectRoleChannelOptional)); + membersToPrune.forEach(member -> pruneMemberFromRole(member, role, selectRoleChannel)); } private boolean isMemberInactive(Member member, Instant when) { @@ -156,11 +154,13 @@ private boolean isMemberInactive(Member member, Instant when) { } private void pruneMemberFromRole(Member member, Role role, - Optional selectRoleChannelOptional) { + @Nullable TextChannel selectRoleChannel) { Guild guild = member.getGuild(); String channelMentionOrFallbackMessage = - selectRoleChannelOptional.map(Channel::getAsMention).orElse("appropriate channel"); + selectRoleChannel == null ? "role selection channel" + : selectRoleChannel.getAsMention(); + String dmMessage = """ You seem to have been inactive for some time in server **%s**, hence we removed you from the **%s** role. From 8a48289c1955ae9901f2e519054a3b9ecab8b8a4 Mon Sep 17 00:00:00 2001 From: alphaBEE Date: Fri, 17 Nov 2023 04:21:33 +0530 Subject: [PATCH 7/7] sonar fix for develop --- .../tjbot/features/help/HelpThreadCreatedListener.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java b/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java index 693ade353e..a5127d9ac2 100644 --- a/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java +++ b/application/src/main/java/org/togetherjava/tjbot/features/help/HelpThreadCreatedListener.java @@ -179,8 +179,9 @@ public void onModalSubmitted(ModalInteractionEvent event, List args) { } private boolean isPostAuthor(Member interactionUser, Message message) { - if (message.getEmbeds().isEmpty()) + if (message.getEmbeds().isEmpty()) { return false; + } String embedAuthor = Objects .requireNonNull(message.getEmbeds().get(0).getAuthor(),