44import com .github .benmanes .caffeine .cache .Caffeine ;
55import net .dv8tion .jda .api .EmbedBuilder ;
66import net .dv8tion .jda .api .Permission ;
7- import net .dv8tion .jda .api .entities .Guild ;
8- import net .dv8tion .jda .api .entities .Message ;
9- import net .dv8tion .jda .api .entities .MessageEmbed ;
10- import net .dv8tion .jda .api .entities .User ;
7+ import net .dv8tion .jda .api .entities .*;
118import net .dv8tion .jda .api .entities .channel .concrete .TextChannel ;
129import net .dv8tion .jda .api .entities .channel .middleman .GuildChannel ;
1310import net .dv8tion .jda .api .events .message .react .MessageReactionAddEvent ;
11+ import net .dv8tion .jda .api .events .message .react .MessageReactionRemoveEvent ;
1412import net .dv8tion .jda .api .hooks .ListenerAdapter ;
1513import org .jetbrains .annotations .NotNull ;
1614import org .slf4j .Logger ;
@@ -48,7 +46,7 @@ public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event) {
4846 String emojiName = event .getEmoji ().getName ();
4947 Guild guild = event .getGuild ();
5048 long messageId = event .getMessageIdLong ();
51- if (shouldIgnoreMessage (emojiName , guild , event .getGuildChannel (), messageId )) {
49+ if (shouldIgnoreMessage (emojiName , guild , event .getGuildChannel (), messageId , true )) {
5250 return ;
5351 }
5452 Optional <TextChannel > starboardChannel = getStarboardChannel (guild );
@@ -65,14 +63,35 @@ public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event) {
6563 .queue ();
6664 }
6765
66+ @ Override
67+ public void onMessageReactionRemove (@ NotNull MessageReactionRemoveEvent event ) {
68+ String emojiName = event .getEmoji ().getName ();
69+ Guild guild = event .getGuild ();
70+ long messageId = event .getMessageIdLong ();
71+ if (shouldIgnoreMessage (emojiName , guild , event .getGuildChannel (), messageId , false )) {
72+ return ;
73+ }
74+ event .retrieveMessage ()
75+ .map (m -> m .getReactions ()
76+ .stream ()
77+ .map (reaction -> reaction .getEmoji ().getName ())
78+ .noneMatch (config .emojiNames ()::contains ))
79+ .onSuccess (noGoodReactions -> {
80+ if (noGoodReactions ) {
81+ database .write (context -> context .data ().remove (messageId ));
82+ messageCache .invalidate (messageId );
83+ }
84+ })
85+ .queue ();
86+ }
87+
6888 private boolean shouldIgnoreMessage (String emojiName , Guild guild , GuildChannel channel ,
69- long messageId ) {
89+ long messageId , boolean addingMessage ) {
7090 return !config .emojiNames ().contains (emojiName )
7191 || !guild .getPublicRole ().hasPermission (channel , Permission .VIEW_CHANNEL )
72- || messageCache .getIfPresent (messageId ) != null
73- || database
92+ || (addingMessage == (messageCache .getIfPresent (messageId ) != null || database
7493 .read (context -> context .fetchExists (context .selectFrom (STARBOARD_MESSAGES )
75- .where (STARBOARD_MESSAGES .MESSAGE_ID .eq (messageId ))));
94+ .where (STARBOARD_MESSAGES .MESSAGE_ID .eq (messageId )))))) ;
7695 }
7796
7897 private Optional <TextChannel > getStarboardChannel (Guild guild ) {
0 commit comments