@@ -10,10 +10,11 @@ use arc_swap::ArcSwap;
1010use async_trait:: async_trait;
1111use serenity:: all:: {
1212 ButtonStyle , ChannelId , ChannelType , Context , CreateActionRow , CreateAttachment , CreateButton ,
13- CreateEmbed , CreateEmbedFooter , CreateInteractionResponse , CreateInteractionResponseMessage ,
14- CreateMessage , CreatePoll , CreatePollAnswer , CreateSelectMenu , CreateSelectMenuKind ,
15- CreateSelectMenuOption , CreateThread , EditMessage , EventHandler , GatewayIntents , GetMessages ,
16- Http , Interaction , Message , MessageId , ReactionType , Ready , ShardManager , User , UserId ,
13+ CreateEmbed , CreateEmbedAuthor , CreateEmbedFooter , CreateInteractionResponse ,
14+ CreateInteractionResponseMessage , CreateMessage , CreatePoll , CreatePollAnswer ,
15+ CreateSelectMenu , CreateSelectMenuKind , CreateSelectMenuOption , CreateThread , EditMessage ,
16+ EventHandler , GatewayIntents , GetMessages , Http , Interaction , Message , MessageId , ReactionType ,
17+ Ready , ShardManager , Timestamp , User , UserId ,
1718} ;
1819use std:: collections:: HashMap ;
1920use std:: sync:: Arc ;
@@ -1038,11 +1039,39 @@ fn build_embed(card: &crate::Card) -> CreateEmbed {
10381039 embed = embed. url ( url) ;
10391040 }
10401041 if let Some ( footer) = & card. footer {
1041- let mut discord_footer = CreateEmbedFooter :: new ( footer. text . clone ( ) ) ;
1042- if let Some ( icon_url) = & footer. icon_url {
1043- discord_footer = discord_footer. icon_url ( icon_url) ;
1042+ let footer_text = footer. text . trim ( ) ;
1043+ if !footer_text. is_empty ( ) {
1044+ let mut footer_builder = CreateEmbedFooter :: new ( footer_text) ;
1045+ if let Some ( icon_url) = & footer. icon_url {
1046+ footer_builder = footer_builder. icon_url ( icon_url) ;
1047+ }
1048+ embed = embed. footer ( footer_builder) ;
1049+ }
1050+ }
1051+ if let Some ( thumbnail) = & card. thumbnail {
1052+ embed = embed. thumbnail ( & thumbnail. url ) ;
1053+ }
1054+ if let Some ( image) = & card. image {
1055+ embed = embed. image ( & image. url ) ;
1056+ }
1057+ if let Some ( author) = & card. author {
1058+ let author_name = author. name . trim ( ) ;
1059+ if !author_name. is_empty ( ) {
1060+ let mut author_builder = CreateEmbedAuthor :: new ( author_name) ;
1061+ if let Some ( url) = & author. url {
1062+ author_builder = author_builder. url ( url) ;
1063+ }
1064+ if let Some ( icon_url) = & author. icon_url {
1065+ author_builder = author_builder. icon_url ( icon_url) ;
1066+ }
1067+ embed = embed. author ( author_builder) ;
1068+ }
1069+ }
1070+ if let Some ( timestamp) = & card. timestamp {
1071+ match timestamp. parse :: < Timestamp > ( ) {
1072+ Ok ( ts) => embed = embed. timestamp ( ts) ,
1073+ Err ( e) => tracing:: warn!( timestamp, %e, "invalid ISO 8601 timestamp in card, skipping" ) ,
10441074 }
1045- embed = embed. footer ( discord_footer) ;
10461075 }
10471076
10481077 for ( i, field) in card. fields . iter ( ) . enumerate ( ) {
@@ -1319,10 +1348,7 @@ mod tests {
13191348 let cards = vec ! [ Card {
13201349 title: Some ( "Status" . into( ) ) ,
13211350 description: Some ( "All green" . into( ) ) ,
1322- color: None ,
1323- url: None ,
1324- fields: Vec :: new( ) ,
1325- footer: None ,
1351+ ..Default :: default ( )
13261352 } ] ;
13271353
13281354 let parts = prepare_rich_message_parts ( String :: new ( ) , & cards, & [ ] , None ) ;
0 commit comments