From bcd565b9cd284f760d566176b523d61579211094 Mon Sep 17 00:00:00 2001 From: harryob <55142896+harryob@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:43:37 +0000 Subject: [PATCH] reorganise embeds - put frontmatter extras above and body below --- tools/od_ref_bot/src/main.rs | 53 ++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/tools/od_ref_bot/src/main.rs b/tools/od_ref_bot/src/main.rs index cb27dbe82..bd0ea7d43 100644 --- a/tools/od_ref_bot/src/main.rs +++ b/tools/od_ref_bot/src/main.rs @@ -37,7 +37,13 @@ async fn odref( let page = get_page(&search_for, ctx.data()).unwrap_or("Not found."); match format_embed(page, ctx.data()) { - Some(embed) => ctx.send(poise::CreateReply::default().embed(embed)).await?, + Some(embeds) => { + let mut reply = poise::CreateReply::default(); + for embed in embeds.into_iter() { + reply = reply.embed(embed) + } + ctx.send(reply).await? + } None => { log::debug!("Unable to locate a page for {}.", &search_for); @@ -134,7 +140,7 @@ fn get_page<'a>(query: &'a String, data: &'a Data) -> Option<&'a str> { /// Retains most Markdown, as this (mostly) renders fine in Discord embeds. /// Scrubs all Tera shortcodes, apart from the ones we can render into direct links here. /// Pulls some extra information from the frontmatter, and puts it in fields. -fn format_embed(page: &str, data: &Data) -> Option { +fn format_embed(page: &str, data: &Data) -> Option> { let body_regex = Regex::new(r"(?s)\+\+\+(.*)\+\+\+(.*)").unwrap(); let parsed = data.path_to_parsed.get(page)?; @@ -163,18 +169,33 @@ fn format_embed(page: &str, data: &Data) -> Option { ) }; + let url = get_url(page, parsed); + + let body = format_body(body, data).trim().to_string(); + let mut embed = serenity::CreateEmbed::default() .title(&title) - .url(get_url(page, parsed)) + .url(&url) .color(Colour::from_rgb(246, 114, 128)) - .description(format_body(body, data)); + .description(&body); let extra = parsed.extra.as_ref(); if extra.is_none() { - return Some(embed); + if body.len() <= 0 { + return None; + } + + return Some(vec![embed]); } + let mut extra_embed = serenity::CreateEmbed::default() + .title(&title) + .color(Colour::from_rgb(246, 114, 128)) + .url(&url); + + embed = embed.title("").url(""); + let extra = extra.unwrap(); if let Some(formats) = &extra.format { @@ -188,7 +209,7 @@ fn format_embed(page: &str, data: &Data) -> Option { format_string.push_str(")```"); - embed = embed.field( + extra_embed = extra_embed.field( format!("Format {}", format.0 + 1).as_str(), format_string, false, @@ -203,11 +224,11 @@ fn format_embed(page: &str, data: &Data) -> Option { args_string.push_str(")```"); - embed = embed.field("Arguments", args_string, false); + extra_embed = extra_embed.field("Arguments", args_string, false); } if let Some(val) = &extra.usage { - embed = embed.field("Usage", val.as_str(), false) + extra_embed = extra_embed.field("Usage", val.as_str(), false) }; if let Some(val) = &extra._return { @@ -228,12 +249,12 @@ fn format_embed(page: &str, data: &Data) -> Option { }; if !return_string.is_empty() { - embed = embed.field("Return", return_string, false); + extra_embed = extra_embed.field("Return", return_string, false); } } PageReturnOrString::String(string) => { - embed = embed.field("Return", string.as_str(), false) + extra_embed = extra_embed.field("Return", string.as_str(), false) } } }; @@ -245,18 +266,22 @@ fn format_embed(page: &str, data: &Data) -> Option { string_val = "\"\""; } - embed = embed.field("Default Value", string_val, true) + extra_embed = extra_embed.field("Default Value", string_val, true) }; if let Some(val) = &extra.permitted_values { - embed = embed.field("Permitted Values", val.as_str(), true) + extra_embed = extra_embed.field("Permitted Values", val.as_str(), true) }; if let Some(val) = &extra._type { - embed = embed.field("Type", val.as_str(), true) + extra_embed = extra_embed.field("Type", val.as_str(), true) + }; + + if body.len() <= 0 { + return Some(vec![extra_embed]); }; - Some(embed) + Some(vec![extra_embed, embed]) } /// Converts the Tera-formatted markdown into more Discord compatible markdown.