this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(starboard): show replied message for context

+79 -4
+1
.gitignore
··· 9 9 blahaj.toml 10 10 packages.db 11 11 nixpkgs.hash 12 + /starboard.db
+78 -4
src/event_handler/starboard.rs
··· 131 131 ) 132 132 .await 133 133 { 134 - let embed = create_star_embed(&message, star_count); 134 + let embed = create_star_embed(ctx, &message, star_count).await; 135 135 starboard_msg 136 136 .edit(ctx, EditMessage::new().embed(embed)) 137 137 .await ··· 141 141 if should_send { 142 142 // Create starboard message 143 143 let starboard_channel = poise::serenity_prelude::ChannelId::new(starboard_channel_id); 144 - let embed = create_star_embed(&message, star_count); 144 + let embed = create_star_embed(ctx, &message, star_count).await; 145 145 146 146 if let Ok(starboard_msg) = starboard_channel 147 147 .send_message( ··· 308 308 ) 309 309 .await 310 310 { 311 - let embed = create_star_embed(&message, star_count); 311 + let embed = create_star_embed(ctx, &message, star_count).await; 312 312 starboard_msg 313 313 .edit(ctx, EditMessage::new().embed(embed)) 314 314 .await ··· 319 319 Ok(()) 320 320 } 321 321 322 - fn create_star_embed( 322 + async fn create_star_embed( 323 + ctx: &Context, 323 324 message: &poise::serenity_prelude::Message, 324 325 star_count: u64, 325 326 ) -> poise::serenity_prelude::CreateEmbed { ··· 335 336 .colour(Colour::GOLD) 336 337 .timestamp(message.timestamp); 337 338 339 + if let Some(message_reference) = &message.message_reference 340 + && let Some(reference_message_id) = message_reference.message_id 341 + { 342 + let reference_details = if let Some(reference_message) = 343 + message.referenced_message.as_deref() 344 + { 345 + Some(( 346 + reference_message.author.name.clone(), 347 + summarized_message_content( 348 + &reference_message.content, 349 + !reference_message.attachments.is_empty(), 350 + ), 351 + )) 352 + } else { 353 + let reference_channel_id = message_reference.channel_id; 354 + reference_channel_id 355 + .message(ctx, reference_message_id) 356 + .await 357 + .ok() 358 + .map(|reference_message| { 359 + ( 360 + reference_message.author.name, 361 + summarized_message_content( 362 + &reference_message.content, 363 + !reference_message.attachments.is_empty(), 364 + ), 365 + ) 366 + }) 367 + }; 368 + 369 + if let Some((reference_author_name, reference_preview)) = reference_details { 370 + let reference_channel_id = message_reference.channel_id; 371 + let reference_url = format!( 372 + "https://discord.com/channels/{}/{}/{}", 373 + message 374 + .guild_id 375 + .map_or_else(|| "@me".to_string(), |guild_id| guild_id.get().to_string()), 376 + reference_channel_id, 377 + reference_message_id 378 + ); 379 + 380 + embed = embed.field( 381 + "Replying to", 382 + format!( 383 + "**{}**\n{}\n[Jump to referenced message]({reference_url})", 384 + reference_author_name, reference_preview 385 + ), 386 + false, 387 + ); 388 + } 389 + } 390 + 338 391 if let Some(first_attachment) = message.attachments.first() { 339 392 embed = embed.image(&first_attachment.url); 340 393 } 341 394 342 395 embed 343 396 } 397 + 398 + fn summarized_message_content(content: &str, has_attachments: bool) -> String { 399 + let collapsed = content.split_whitespace().collect::<Vec<_>>().join(" "); 400 + if collapsed.is_empty() { 401 + return if has_attachments { 402 + "[attachment-only message]".to_string() 403 + } else { 404 + "[no text content]".to_string() 405 + }; 406 + } 407 + 408 + let preview_limit = 300; 409 + let char_count = collapsed.chars().count(); 410 + if char_count > preview_limit { 411 + let mut truncated = collapsed.chars().take(preview_limit).collect::<String>(); 412 + truncated.push('…'); 413 + truncated 414 + } else { 415 + collapsed 416 + } 417 + }