rory: handle errors from api

This commit is contained in:
seth 2023-12-08 11:09:40 -05:00
parent 7e96bced41
commit 026d4cb607
No known key found for this signature in database
GPG key ID: D31BD0D494BBEE86
5 changed files with 31 additions and 13 deletions

View file

@ -16,6 +16,6 @@ pub async fn get_joke() -> Result<String> {
if let StatusCode::OK = status { if let StatusCode::OK = status {
Ok(resp.text().await?) Ok(resp.text().await?)
} else { } else {
Err(eyre!("Failed to fetch joke from {DADJOKE} with {status}")) Err(eyre!("Couldn't get a joke!"))
} }
} }

View file

@ -1,6 +1,6 @@
use crate::api::REQWEST_CLIENT; use crate::api::REQWEST_CLIENT;
use color_eyre::eyre::{eyre, Result}; use color_eyre::eyre::{eyre, Context, Result};
use log::*; use log::*;
use reqwest::StatusCode; use reqwest::StatusCode;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -27,11 +27,15 @@ pub async fn get_latest_minecraft_version() -> Result<String> {
let status = resp.status(); let status = resp.status();
if let StatusCode::OK = status { if let StatusCode::OK = status {
let data = resp.json::<MinecraftPackageJson>().await?; let data = resp
.json::<MinecraftPackageJson>()
.await
.wrap_err_with(|| "Couldn't parse Minecraft versions!")?;
let version = data let version = data
.recommended .recommended
.first() .first()
.ok_or_else(|| eyre!("Couldn't find first recommended version!"))?; .ok_or_else(|| eyre!("Couldn't find latest version of Minecraft!"))?;
Ok(version.clone()) Ok(version.clone())
} else { } else {

View file

@ -1,6 +1,6 @@
use crate::api::REQWEST_CLIENT; use crate::api::REQWEST_CLIENT;
use color_eyre::eyre::{eyre, Result}; use color_eyre::eyre::{eyre, Context, Result};
use log::*; use log::*;
use reqwest::StatusCode; use reqwest::StatusCode;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -9,6 +9,7 @@ use serde::{Deserialize, Serialize};
pub struct RoryResponse { pub struct RoryResponse {
pub id: u64, pub id: u64,
pub url: String, pub url: String,
pub error: Option<String>,
} }
const RORY: &str = "https://rory.cat"; const RORY: &str = "https://rory.cat";
@ -25,14 +26,22 @@ pub async fn get_rory(id: Option<u64>) -> Result<RoryResponse> {
let req = REQWEST_CLIENT let req = REQWEST_CLIENT
.get(format!("{RORY}{ENDPOINT}/{target}")) .get(format!("{RORY}{ENDPOINT}/{target}"))
.build()?; .build()
.wrap_err_with(|| "Couldn't build reqwest client!")?;
info!("Making request to {}", req.url()); info!("Making request to {}", req.url());
let resp = REQWEST_CLIENT.execute(req).await?; let resp = REQWEST_CLIENT
.execute(req)
.await
.wrap_err_with(|| "Couldn't make request for shiggy!")?;
let status = resp.status(); let status = resp.status();
if let StatusCode::OK = status { if let StatusCode::OK = status {
let data = resp.json::<RoryResponse>().await?; let data = resp
.json::<RoryResponse>()
.await
.wrap_err_with(|| "Couldn't parse the shiggy response!")?;
Ok(data) Ok(data)
} else { } else {
Err(eyre!( Err(eyre!(

View file

@ -9,14 +9,18 @@ pub async fn rory(
ctx: Context<'_>, ctx: Context<'_>,
#[description = "specify a Rory ID"] id: Option<u64>, #[description = "specify a Rory ID"] id: Option<u64>,
) -> Result<()> { ) -> Result<()> {
let resp = get_rory(id).await?; let rory = get_rory(id).await?;
ctx.send(|m| { ctx.send(|m| {
m.embed(|e| { m.embed(|e| {
e.title("Rory :3") if let Some(error) = rory.error {
.url(&resp.url) e.title("Error!").description(error)
.image(resp.url) } else {
.footer(|f| f.text(format!("ID {}", resp.id))) e.title("Rory :3")
.url(&rory.url)
.image(rory.url)
.footer(|f| f.text(format!("ID {}", rory.id)))
}
}) })
}) })
.await?; .await?;

View file

@ -17,6 +17,7 @@ pub async fn say(ctx: Context<'_>, #[description = "Just content?"] content: Str
.await .await
.ok_or_else(|| eyre!("Couldn't get channel!"))?; .ok_or_else(|| eyre!("Couldn't get channel!"))?;
ctx.defer_ephemeral().await?;
channel.say(ctx, &content).await?; channel.say(ctx, &content).await?;
ctx.say("I said what you said!").await?; ctx.say("I said what you said!").await?;