4
4
import com .github .benmanes .caffeine .cache .Caffeine ;
5
5
import net .dv8tion .jda .api .EmbedBuilder ;
6
6
import 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 .*;
11
8
import net .dv8tion .jda .api .entities .channel .concrete .TextChannel ;
12
9
import net .dv8tion .jda .api .entities .channel .middleman .GuildChannel ;
13
10
import net .dv8tion .jda .api .events .message .react .MessageReactionAddEvent ;
11
+ import net .dv8tion .jda .api .events .message .react .MessageReactionRemoveEvent ;
14
12
import net .dv8tion .jda .api .hooks .ListenerAdapter ;
15
13
import org .jetbrains .annotations .NotNull ;
16
14
import org .slf4j .Logger ;
@@ -48,7 +46,7 @@ public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event) {
48
46
String emojiName = event .getEmoji ().getName ();
49
47
Guild guild = event .getGuild ();
50
48
long messageId = event .getMessageIdLong ();
51
- if (shouldIgnoreMessage (emojiName , guild , event .getGuildChannel (), messageId )) {
49
+ if (shouldIgnoreMessage (emojiName , guild , event .getGuildChannel (), messageId , true )) {
52
50
return ;
53
51
}
54
52
Optional <TextChannel > starboardChannel = getStarboardChannel (guild );
@@ -65,14 +63,35 @@ public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event) {
65
63
.queue ();
66
64
}
67
65
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
+
68
88
private boolean shouldIgnoreMessage (String emojiName , Guild guild , GuildChannel channel ,
69
- long messageId ) {
89
+ long messageId , boolean addingMessage ) {
70
90
return !config .emojiNames ().contains (emojiName )
71
91
|| !guild .getPublicRole ().hasPermission (channel , Permission .VIEW_CHANNEL )
72
- || messageCache .getIfPresent (messageId ) != null
73
- || database
92
+ || (addingMessage == (messageCache .getIfPresent (messageId ) != null || database
74
93
.read (context -> context .fetchExists (context .selectFrom (STARBOARD_MESSAGES )
75
- .where (STARBOARD_MESSAGES .MESSAGE_ID .eq (messageId ))));
94
+ .where (STARBOARD_MESSAGES .MESSAGE_ID .eq (messageId )))))) ;
76
95
}
77
96
78
97
private Optional <TextChannel > getStarboardChannel (Guild guild ) {
0 commit comments