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