diff options
Diffstat (limited to 'src/commands/pony.rs')
-rw-r--r-- | src/commands/pony.rs | 71 |
1 files changed, 61 insertions, 10 deletions
diff --git a/src/commands/pony.rs b/src/commands/pony.rs index b908ca4..532937a 100644 --- a/src/commands/pony.rs +++ b/src/commands/pony.rs @@ -9,6 +9,7 @@ pub struct PonyResponse { pub pony: Pony, } +#[allow(non_snake_case)] #[derive(Deserialize)] pub struct Pony { pub id: u64, @@ -24,6 +25,7 @@ pub struct Pony { pub representations: PonyRepresentation, } +#[allow(non_snake_case)] #[derive(Deserialize)] pub struct PonyRepresentation { pub full: String, @@ -39,11 +41,10 @@ pub struct PonyRepresentation { /// Retrieves a random SFW pony image #[poise::command(slash_command, prefix_command)] pub async fn randpony(ctx: Context<'_>) -> Result<(), Error> { - let mut response_msg = ctx + let response_msg = ctx .say("Fetching a random pony image, please wait!") .await?; - let client = reqwest::Client::new(); let res = reqwest::get("https://theponyapi.com/api/v1/pony/random") .await? .json::<PonyResponse>() @@ -64,13 +65,12 @@ pub async fn randpony(ctx: Context<'_>) -> Result<(), Error> { } else { e.field("Source", "None found", true); } - e - }); - m + e.footer(|f| f.text(format!("Pony ID: {}", res.pony.id))) + }) }) .await?; } - Err(e) => { + Err(_) => { ctx.say("Error editing message").await?; } }; @@ -91,7 +91,7 @@ pub async fn tpony( #[rest] tags: String, ) -> Result<(), Error> { - let mut response_msg = ctx + let response_msg = ctx .say(format!( "Fetching pony image based on tags: {:?}", tags.clone() @@ -119,9 +119,8 @@ pub async fn tpony( } else { e.field("Source", "None found", true); } - e - }); - m + e.footer(|f| f.text(format!("Pony ID: {}", res.pony.id))) + }) }) .await?; } @@ -133,6 +132,58 @@ pub async fn tpony( Ok(()) } +/// Gets a specific pony based on the ID +/// +/// Usage: +/// /ponybyid <id> +#[poise::command(slash_command, prefix_command)] +pub async fn ponybyid( + ctx: Context<'_>, + #[description = "The ID to search for"] id: String, +) -> Result<(), Error> { + let response_msg = ctx + .say(format!("Fetching pony based on id: {}", id)) + .await?; + + let res = match reqwest::get(format!("https://theponyapi.com/api/v1/pony/id/{}", id).as_str()) + .await + { + Ok(r) => r.json::<PonyResponse>().await?, + Err(_) => { + response_msg.unwrap().message().await.unwrap().edit(ctx.discord(), |m| { + m.content("There was an error fetching that pony, please double-check your ID and try again.") + }).await?; + return Ok(()); + } + }; + + match response_msg.unwrap().message().await { + Ok(mut msg) => { + msg.edit(&ctx.discord(), |m| { + m.content(""); + m.embed(|e| { + e.title("Pony!"); + e.image(res.pony.representations.full.clone()); + let res_tags = get_tags_as_string(res.pony.tags); + e.field("Tags", format!("{:?}", res_tags), true); + if let Some(url) = res.pony.sourceURL { + e.field("Source", url, true); + } else { + e.field("Source", "None found", true); + } + e.footer(|f| f.text(format!("Pony ID: {}", res.pony.id))) + }) + }) + .await? + } + Err(e) => { + ctx.say("Could not edit message").await?; + } + }; + + Ok(()) +} + fn get_tags_as_string(tags: Vec<String>) -> String { let mut response = String::from(tags.get(0).unwrap()); for (i, s) in tags.iter().enumerate() { |