4
4
import net .dv8tion .jda .api .entities .Message ;
5
5
import net .dv8tion .jda .api .entities .MessageEmbed ;
6
6
import net .dv8tion .jda .api .entities .MessageType ;
7
+ import net .dv8tion .jda .api .entities .messages .MessageSnapshot ;
7
8
import net .dv8tion .jda .api .events .message .MessageReceivedEvent ;
8
9
import net .dv8tion .jda .api .requests .RestAction ;
9
10
import net .dv8tion .jda .api .utils .messages .MessageCreateBuilder ;
13
14
import org .togetherjava .tjbot .features .MessageReceiverAdapter ;
14
15
15
16
import java .awt .Color ;
17
+ import java .util .concurrent .ConcurrentHashMap ;
16
18
import java .util .concurrent .TimeUnit ;
17
19
import java .util .regex .Pattern ;
18
20
25
27
*/
26
28
public final class MediaOnlyChannelListener extends MessageReceiverAdapter {
27
29
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
+
28
37
/**
29
38
* Creates a MediaOnlyChannelListener to receive all message sent in MediaOnly channel.
30
39
*
@@ -45,19 +54,60 @@ public void onMessageReceived(MessageReceivedEvent event) {
45
54
return ;
46
55
}
47
56
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 ;
51
80
}
81
+
82
+ message .delete ().queue (deleteSuccess -> dmUser (message ).queue (dmSuccess -> {
83
+ }, dmFailure -> tempNotifyUserInChannel (message )),
84
+ deleteFailure -> tempNotifyUserInChannel (message ));
52
85
}
53
86
54
87
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 ;
57
104
}
58
105
59
106
private MessageCreateData createNotificationMessage (Message message ) {
60
107
String originalMessageContent = message .getContentRaw ();
108
+ if (originalMessageContent .trim ().isEmpty ()) {
109
+ originalMessageContent = "(Original message had no visible text content)" ;
110
+ }
61
111
62
112
MessageEmbed originalMessageEmbed =
63
113
new EmbedBuilder ().setDescription (originalMessageContent )
0 commit comments