44import club .minnced .discord .webhook .external .JDAWebhookClient ;
55import club .minnced .discord .webhook .receive .ReadonlyMessage ;
66import club .minnced .discord .webhook .send .AllowedMentions ;
7+ import club .minnced .discord .webhook .send .WebhookEmbed .EmbedField ;
78import club .minnced .discord .webhook .send .WebhookEmbedBuilder ;
89import club .minnced .discord .webhook .send .WebhookMessageBuilder ;
910import club .minnced .discord .webhook .send .component .LayoutComponent ;
11+ import net .dv8tion .jda .api .entities .Member ;
1012import net .dv8tion .jda .api .entities .Message ;
1113import net .dv8tion .jda .api .entities .Message .Attachment ;
1214import net .dv8tion .jda .api .entities .MessageEmbed ;
1921import java .util .Optional ;
2022import java .util .concurrent .CompletableFuture ;
2123import java .util .function .Consumer ;
24+ import java .util .function .Function ;
2225
2326/**
2427 * Contains utility methods for dealing with Discord Webhooks.
@@ -90,14 +93,16 @@ public static CompletableFuture<ReadonlyMessage> mirrorMessageToWebhook(@NotNull
9093 .setThreadId (threadId ).buildJDA ();
9194 WebhookMessageBuilder message = new WebhookMessageBuilder ().setContent (newMessageContent )
9295 .setAllowedMentions (AllowedMentions .none ())
93- .setAvatarUrl (originalMessage .getMember (). getEffectiveAvatarUrl ( ))
94- .setUsername (originalMessage .getMember (). getEffectiveName ( ));
96+ .setAvatarUrl (transformOrNull ( originalMessage .getMember (), Member :: getEffectiveAvatarUrl ))
97+ .setUsername (transformOrNull ( originalMessage .getMember (), Member :: getEffectiveName ));
9598 if (components != null && !components .isEmpty ()) {
9699 message .addComponents (components );
97100 }
98- if (embeds != null && !embeds .isEmpty ()) {
99- message .addEmbeds (embeds .stream ().map (e -> WebhookEmbedBuilder .fromJDA (e ).build ()).toList ());
101+
102+ if (embeds == null || embeds .isEmpty ()) {
103+ embeds = originalMessage .getEmbeds ();
100104 }
105+ message .addEmbeds (embeds .stream ().map (e -> WebhookEmbedBuilder .fromJDA (e ).build ()).toList ());
101106 List <Attachment > attachments = originalMessage .getAttachments ();
102107 @ SuppressWarnings ("unchecked" )
103108 CompletableFuture <?>[] futures = new CompletableFuture <?>[attachments .size ()];
@@ -106,12 +111,32 @@ public static CompletableFuture<ReadonlyMessage> mirrorMessageToWebhook(@NotNull
106111 futures [i ] = attachment .getProxy ().download ().thenAccept (
107112 is -> message .addFile ((attachment .isSpoiler () ? "SPOILER_" : "" ) + attachment .getFileName (), is ));
108113 }
109- return CompletableFuture .allOf (futures ).thenCompose (unused -> client . send ( message . build () ))
114+ return CompletableFuture .allOf (futures ).thenCompose (unused -> sendMessage ( client , message ))
110115 .whenComplete ((result , err ) -> {
111116 client .close ();
112117 if ( err != null ) {
113118 ExceptionLogger .capture (err , WebhookUtil .class .getSimpleName ());
114119 }
115120 });
116121 }
122+
123+ private static <T , R > R transformOrNull (T toTransform , Function <T , R > transformer ) {
124+ return toTransform == null ? null : transformer .apply (toTransform );
125+ }
126+
127+ private static List <EmbedField > transformFields (MessageEmbed embed ) {
128+ return embed
129+ .getFields ()
130+ .stream ()
131+ .map (field -> new EmbedField (field .isInline (), field .getName (), field .getValue ()))
132+ .toList ();
133+ }
134+
135+ private static @ NotNull CompletableFuture <ReadonlyMessage > sendMessage (JDAWebhookClient client ,
136+ WebhookMessageBuilder message ) {
137+ if (message .isEmpty ()) {
138+ message .setContent ("<empty message>" );
139+ }
140+ return client .send (message .build ());
141+ }
117142}
0 commit comments