1
1
package org .togetherjava .tjbot .features .basic ;
2
2
3
+ import com .github .benmanes .caffeine .cache .Cache ;
4
+ import com .github .benmanes .caffeine .cache .Caffeine ;
3
5
import net .dv8tion .jda .api .EmbedBuilder ;
4
6
import net .dv8tion .jda .api .Permission ;
5
7
import net .dv8tion .jda .api .entities .Guild ;
20
22
import org .togetherjava .tjbot .features .EventReceiver ;
21
23
22
24
import java .util .Optional ;
25
+ import java .util .concurrent .TimeUnit ;
23
26
24
27
import static org .togetherjava .tjbot .db .generated .tables .StarboardMessages .STARBOARD_MESSAGES ;
25
28
@@ -29,17 +32,23 @@ public class Starboard extends ListenerAdapter implements EventReceiver {
29
32
private final StarboardConfig config ;
30
33
private final Database database ;
31
34
35
+ private final Cache <Long , Object > messageCache ;
36
+
32
37
public Starboard (Config config , Database database ) {
33
38
this .config = config .getStarboard ();
34
39
this .database = database ;
40
+ this .messageCache = Caffeine .newBuilder ()
41
+ .maximumSize (100 )
42
+ .expireAfterAccess (24 , TimeUnit .HOURS ) // TODO make these constants
43
+ .build ();
35
44
}
36
45
37
46
@ Override
38
47
public void onMessageReactionAdd (@ NotNull MessageReactionAddEvent event ) {
39
48
String emojiName = event .getEmoji ().asCustom ().getName ();
40
49
Guild guild = event .getGuild ();
41
- if ( shouldIgnoreMessage ( emojiName , guild , event .getGuildChannel (),
42
- event .getMessageIdLong () )) {
50
+ long messageId = event .getMessageIdLong ();
51
+ if ( shouldIgnoreMessage ( emojiName , guild , event .getGuildChannel (), messageId )) {
43
52
return ;
44
53
}
45
54
Optional <TextChannel > starboardChannel = getStarboardChannel (guild );
@@ -48,8 +57,8 @@ public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event) {
48
57
config .channelPattern ());
49
58
return ;
50
59
}
51
- database .write (context -> context .newRecord (STARBOARD_MESSAGES )
52
- . setMessageId ( event . getMessageIdLong () ));
60
+ database .write (context -> context .newRecord (STARBOARD_MESSAGES ). setMessageId ( messageId ));
61
+ messageCache . put ( messageId , new Object ( ));
53
62
event .retrieveMessage ()
54
63
.flatMap (
55
64
message -> starboardChannel .orElseThrow ().sendMessageEmbeds (formEmbed (message )))
@@ -60,6 +69,7 @@ private boolean shouldIgnoreMessage(String emojiName, Guild guild, GuildChannel
60
69
long messageId ) {
61
70
return !config .emojiNames ().contains (emojiName )
62
71
|| !guild .getPublicRole ().hasPermission (channel , Permission .VIEW_CHANNEL )
72
+ || messageCache .getIfPresent (messageId ) != null
63
73
|| database
64
74
.read (context -> context .fetchExists (context .selectFrom (STARBOARD_MESSAGES )
65
75
.where (STARBOARD_MESSAGES .MESSAGE_ID .eq (messageId ))));
0 commit comments