44import net .dv8tion .jda .api .entities .Message ;
55import net .dv8tion .jda .api .entities .MessageEmbed ;
66import net .dv8tion .jda .api .entities .MessageType ;
7+ import net .dv8tion .jda .api .entities .messages .MessageSnapshot ;
78import net .dv8tion .jda .api .events .message .MessageReceivedEvent ;
89import net .dv8tion .jda .api .requests .RestAction ;
910import net .dv8tion .jda .api .utils .messages .MessageCreateBuilder ;
1314import org .togetherjava .tjbot .features .MessageReceiverAdapter ;
1415
1516import java .awt .Color ;
17+ import java .util .concurrent .ConcurrentHashMap ;
1618import java .util .concurrent .TimeUnit ;
1719import java .util .regex .Pattern ;
1820
2527 */
2628public final class MediaOnlyChannelListener extends MessageReceiverAdapter {
2729
30+ private static final Pattern MEDIA_URL_PATTERN = Pattern .compile (
31+ ".*https?://\\ S+\\ .(png|jpe?g|gif|bmp|webp|mp4|mov|avi|webm|mp3|wav|ogg|youtube\\ .com/|youtu\\ .com|imgur\\ .com/).*" ,
32+ Pattern .CASE_INSENSITIVE );
33+
34+ private final ConcurrentHashMap <Long , Long > lastValidForwardedMediaMessageTime =
35+ new ConcurrentHashMap <>();
36+
2837 /**
2938 * Creates a MediaOnlyChannelListener to receive all message sent in MediaOnly channel.
3039 *
@@ -45,19 +54,60 @@ public void onMessageReceived(MessageReceivedEvent event) {
4554 return ;
4655 }
4756
48- if (messageHasNoMediaAttached (message )) {
49- message .delete ().flatMap (any -> dmUser (message )).queue (any -> {
50- }, failure -> tempNotifyUserInChannel (message ));
57+ long userId = event .getAuthor ().getIdLong ();
58+
59+ boolean isForwardedWithMedia =
60+ !message .getMessageSnapshots ().isEmpty () && !messageHasNoMediaAttached (message );
61+
62+ if (isForwardedWithMedia ) {
63+ lastValidForwardedMediaMessageTime .put (userId , System .currentTimeMillis ());
64+ return ;
65+ }
66+
67+ boolean isNormalMediaUpload =
68+ message .getMessageSnapshots ().isEmpty () && !messageHasNoMediaAttached (message );
69+ if (isNormalMediaUpload ) {
70+ return ;
71+ }
72+
73+ Long lastForwardedMediaTime = lastValidForwardedMediaMessageTime .get (userId );
74+ long gracePeriodMillis = TimeUnit .SECONDS .toMillis (1 );
75+
76+ if (lastForwardedMediaTime != null
77+ && (System .currentTimeMillis () - lastForwardedMediaTime ) <= gracePeriodMillis ) {
78+ lastValidForwardedMediaMessageTime .remove (userId );
79+ return ;
5180 }
81+
82+ message .delete ().queue (deleteSuccess -> dmUser (message ).queue (dmSuccess -> {
83+ }, dmFailure -> tempNotifyUserInChannel (message )),
84+ deleteFailure -> tempNotifyUserInChannel (message ));
5285 }
5386
5487 private boolean messageHasNoMediaAttached (Message message ) {
55- return message .getAttachments ().isEmpty () && message .getEmbeds ().isEmpty ()
56- && !message .getContentRaw ().contains ("http" );
88+ if (!message .getAttachments ().isEmpty () || !message .getEmbeds ().isEmpty ()
89+ || MEDIA_URL_PATTERN .matcher (message .getContentRaw ()).matches ()) {
90+ return false ;
91+ }
92+
93+ if (!message .getMessageSnapshots ().isEmpty ()) {
94+ for (MessageSnapshot snapshot : message .getMessageSnapshots ()) {
95+ if (!snapshot .getAttachments ().isEmpty () || !snapshot .getEmbeds ().isEmpty ()
96+ || MEDIA_URL_PATTERN .matcher (snapshot .getContentRaw ()).matches ()) {
97+ return false ;
98+ }
99+ }
100+ return true ;
101+ }
102+
103+ return true ;
57104 }
58105
59106 private MessageCreateData createNotificationMessage (Message message ) {
60107 String originalMessageContent = message .getContentRaw ();
108+ if (originalMessageContent .trim ().isEmpty ()) {
109+ originalMessageContent = "(Original message had no visible text content)" ;
110+ }
61111
62112 MessageEmbed originalMessageEmbed =
63113 new EmbedBuilder ().setDescription (originalMessageContent )
0 commit comments