From ae858289b8501e4d9c96fdebf65bb97b3672b615 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sat, 17 Oct 2026 14:10:14 +0200 Subject: [PATCH 1/3] starboard improvements --- .../data/config/guild/StarboardConfig.java | 3 + .../systems/starboard/StarboardManager.java | 67 +++++++++++++------ 2 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/discordjug/javabot/data/config/guild/StarboardConfig.java b/src/main/java/net/discordjug/javabot/data/config/guild/StarboardConfig.java index e8f8abf3c..27c581517 100644 --- a/src/main/java/net/discordjug/javabot/data/config/guild/StarboardConfig.java +++ b/src/main/java/net/discordjug/javabot/data/config/guild/StarboardConfig.java @@ -8,7 +8,9 @@ import net.dv8tion.jda.api.entities.emoji.UnicodeEmoji; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Configuration for the guild's starboard system. @@ -19,6 +21,7 @@ public class StarboardConfig extends GuildConfigItem { private long starboardChannelId; private int reactionThreshold; private List emojiUnicodes = new ArrayList<>(); + private Set disallowedChannelIds = new HashSet<>(); public TextChannel getStarboardChannel() { return this.getGuild().getTextChannelById(this.starboardChannelId); diff --git a/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java b/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java index 308717cc8..b05914a4d 100644 --- a/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java +++ b/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java @@ -21,6 +21,7 @@ import net.dv8tion.jda.api.entities.emoji.Emoji; import net.dv8tion.jda.api.entities.emoji.UnicodeEmoji; import net.dv8tion.jda.api.events.message.MessageDeleteEvent; +import net.dv8tion.jda.api.events.message.react.GenericMessageReactionEvent; import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent; import net.dv8tion.jda.api.events.message.react.MessageReactionRemoveEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; @@ -30,8 +31,10 @@ import org.jetbrains.annotations.NotNull; import org.springframework.dao.DataAccessException; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -47,34 +50,55 @@ public class StarboardManager extends ListenerAdapter { @Override public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event) { - if (isInvalidUser(event.getUser())) return; - if (isInvalidChannel(event.getChannel())) return; + if (shouldSkip(event)) { + return; + } + if (isInvalidUser(event.getUser())) { + return; + } + if (event.getMessageAuthorIdLong() == event.getUserIdLong()) { + return; + } handleReactionEvent(event.getGuild(), event.getEmoji(), event.getChannel(), event.getMessageIdLong()); } @Override public void onMessageReactionRemove(@NotNull MessageReactionRemoveEvent event) { - if (isInvalidUser(event.getUser())) return; - if (isInvalidChannel(event.getGuildChannel())) return; + if (shouldSkip(event)) { + return; + } handleReactionEvent(event.getGuild(), event.getEmoji(), event.getChannel(), event.getMessageIdLong()); } - + + private boolean shouldSkip(GenericMessageReactionEvent event) { + if (isInvalidChannel(event.getChannel())) { + return true; + } + StarboardConfig config = botConfig.get(event.getGuild()).getStarboardConfig(); + if (config.getDisallowedChannelIds().contains(event.getChannel().getIdLong())) { + return true; + } + if (config.getStarboardChannelId() == event.getChannel().getIdLong()) { + return true; + } + return false; + } + private void handleReactionEvent(Guild guild, Emoji emoji, MessageChannel channel, long messageId) { asyncPool.submit(() -> { StarboardConfig config = botConfig.get(guild).getStarboardConfig(); - if (config.getStarboardChannel().equals(channel)) return; - Emoji starEmote = config.getEmojis().get(0); - if (!emoji.equals(starEmote)) return; + Set starEmojis = new HashSet<>(config.getEmojis()); + if (!starEmojis.contains(emoji)) return; channel.retrieveMessageById(messageId).queue( message -> { - int stars = getReactionCountForEmote(starEmote, message); asyncPool.execute(()->{ + long stars = getReactionCountForEmotes(starEmojis, message); try { starboardRepository .getEntryByMessageId(message.getIdLong()) - .ifPresentOrElse(entry->{ - updateStarboardMessage(message, stars, config); - }, ()->{ + .ifPresentOrElse(_ -> + updateStarboardMessage(message, stars, config) + , ()->{ if (stars >= config.getReactionThreshold()) { addMessageToStarboard(message, stars, config); } else if (stars < 1 && !removeMessageFromStarboard(message.getIdLong(), channel, config)) { @@ -122,21 +146,24 @@ private boolean isInvalidUser(User user) { } /** - * Attemps to get the amount of reactions for the given emote. + * Attemps to get the amount of reactions for the given emotes. * * @param emoji The emote. * @param message The message. * @return The amount of reactions. */ - private int getReactionCountForEmote(Emoji emoji, @NotNull Message message) { + private long getReactionCountForEmotes(Set emojis, @NotNull Message message) { return message.getReactions().stream() - .filter(r -> r.getEmoji().equals(emoji)) - .findFirst() - .map(MessageReaction::getCount) - .orElse(0); + .filter(r -> emojis.contains(r.getEmoji())) + .flatMap(reaction -> reaction.retrieveUsers().complete().stream()) + .filter(user -> !isInvalidUser(user)) + .mapToLong(User::getIdLong) + .filter(userId -> userId != message.getAuthor().getIdLong()) + .distinct() + .count(); } - private void addMessageToStarboard(Message message, int stars, @NotNull StarboardConfig config) throws DataAccessException { + private void addMessageToStarboard(Message message, long stars, @NotNull StarboardConfig config) throws DataAccessException { if (stars < config.getReactionThreshold()) return; MessageEmbed embed = buildStarboardEmbed(message); MessageCreateAction action = config.getStarboardChannel() @@ -177,7 +204,7 @@ private void addMessageToStarboard(Message message, int stars, @NotNull Starboar ); } - private void updateStarboardMessage(@NotNull Message message, int stars, @NotNull StarboardConfig config) throws DataAccessException { + private void updateStarboardMessage(@NotNull Message message, long stars, @NotNull StarboardConfig config) throws DataAccessException { Optional starboardEntry = starboardRepository.getEntryByMessageId(message.getIdLong()); starboardEntry.ifPresentOrElse(entry->{ long starboardId = entry.getStarboardMessageId(); From 75c7d275689ffdf974107ce9ead9ac3dd5004f2d Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sat, 17 Oct 2026 14:19:08 +0200 Subject: [PATCH 2/3] reduce thresholds for different star emojis --- .../javabot/systems/starboard/StarboardManager.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java b/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java index b05914a4d..bb300bcff 100644 --- a/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java +++ b/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java @@ -224,8 +224,12 @@ private void updateStarboardMessage(@NotNull Message message, long stars, @NotNu } } else { UnicodeEmoji starEmote = config.getEmojis().get(0); - if (stars > 10) starEmote = config.getEmojis().get(1); - if (stars > 25) starEmote = config.getEmojis().get(2); + if (stars > 5 && config.getEmojis().size() > 1) { + starEmote = config.getEmojis().get(1); + } + if (stars > 10 && config.getEmojis().size() > 2) { + starEmote = config.getEmojis().get(2); + } starboardMessage.editMessage( String.format("%s %s | %s", starEmote, stars, message.getChannel().getAsMention())) .queue(); From 1c3937effae438581643bf2a7dcb8eea547e7a41 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sat, 17 Oct 2026 14:21:47 +0200 Subject: [PATCH 3/3] fix Javadoc --- .../discordjug/javabot/systems/starboard/StarboardManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java b/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java index bb300bcff..fdfe785dc 100644 --- a/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java +++ b/src/main/java/net/discordjug/javabot/systems/starboard/StarboardManager.java @@ -148,7 +148,7 @@ private boolean isInvalidUser(User user) { /** * Attemps to get the amount of reactions for the given emotes. * - * @param emoji The emote. + * @param emojis The emotes that included in the count. * @param message The message. * @return The amount of reactions. */