11package org .togetherjava .tjbot .features .basic ;
22
3+ import com .github .benmanes .caffeine .cache .Cache ;
4+ import com .github .benmanes .caffeine .cache .Caffeine ;
35import net .dv8tion .jda .api .EmbedBuilder ;
46import net .dv8tion .jda .api .Permission ;
57import net .dv8tion .jda .api .entities .Guild ;
2022import org .togetherjava .tjbot .features .EventReceiver ;
2123
2224import java .util .Optional ;
25+ import java .util .concurrent .TimeUnit ;
2326
2427import static org .togetherjava .tjbot .db .generated .tables .StarboardMessages .STARBOARD_MESSAGES ;
2528
@@ -29,17 +32,23 @@ public class Starboard extends ListenerAdapter implements EventReceiver {
2932 private final StarboardConfig config ;
3033 private final Database database ;
3134
35+ private final Cache <Long , Object > messageCache ;
36+
3237 public Starboard (Config config , Database database ) {
3338 this .config = config .getStarboard ();
3439 this .database = database ;
40+ this .messageCache = Caffeine .newBuilder ()
41+ .maximumSize (100 )
42+ .expireAfterAccess (24 , TimeUnit .HOURS ) // TODO make these constants
43+ .build ();
3544 }
3645
3746 @ Override
3847 public void onMessageReactionAdd (@ NotNull MessageReactionAddEvent event ) {
3948 String emojiName = event .getEmoji ().asCustom ().getName ();
4049 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 )) {
4352 return ;
4453 }
4554 Optional <TextChannel > starboardChannel = getStarboardChannel (guild );
@@ -48,8 +57,8 @@ public void onMessageReactionAdd(@NotNull MessageReactionAddEvent event) {
4857 config .channelPattern ());
4958 return ;
5059 }
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 ( ));
5362 event .retrieveMessage ()
5463 .flatMap (
5564 message -> starboardChannel .orElseThrow ().sendMessageEmbeds (formEmbed (message )))
@@ -60,6 +69,7 @@ private boolean shouldIgnoreMessage(String emojiName, Guild guild, GuildChannel
6069 long messageId ) {
6170 return !config .emojiNames ().contains (emojiName )
6271 || !guild .getPublicRole ().hasPermission (channel , Permission .VIEW_CHANNEL )
72+ || messageCache .getIfPresent (messageId ) != null
6373 || database
6474 .read (context -> context .fetchExists (context .selectFrom (STARBOARD_MESSAGES )
6575 .where (STARBOARD_MESSAGES .MESSAGE_ID .eq (messageId ))));
0 commit comments