3.1, new APIs
This commit is contained in:
parent
57b79e7a5e
commit
88c5a1b1a0
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "manifold"
|
||||
version = "3.0.0"
|
||||
version = "3.1.0"
|
||||
authors = ["Lucy Bladen <admin@lbladen.uk>"]
|
||||
edition = "2021"
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
use crate::error::{ManifoldError, ManifoldResult};
|
||||
use crate::{ManifoldContext, ManifoldData};
|
||||
use crate::models::dadjoke::{DadJoke, DadJokeWrapper};
|
||||
|
||||
#[poise::command(slash_command, prefix_command, aliases("dad"))]
|
||||
async fn dad_joke(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
|
||||
|
||||
debug!("Processing tip");
|
||||
|
||||
if let Some(tank) = ctx.data().bot_config.services.get("dad_jokes") {
|
||||
let tip: &DadJoke = &tank.next_or_fill::<DadJoke, DadJokeWrapper>().await?;
|
||||
|
||||
debug!("Tip: {:?}", tip);
|
||||
|
||||
ctx.send(|f| f.content(format!("{}", tip)).reply(true)).await?;
|
||||
} else {
|
||||
error!("No such fuel tank dad_jokes");
|
||||
ctx.send(|f| f.content("Can't find any dad jokes. Maybe your dad isn't funny.".to_string()).reply(true)).await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn commands() -> [poise::Command<ManifoldData, ManifoldError>; 1] {
|
||||
[dad_joke()]
|
||||
}
|
||||
|
|
@ -2,6 +2,8 @@ mod admin;
|
|||
mod animal;
|
||||
mod convert;
|
||||
mod core;
|
||||
mod joke;
|
||||
mod nasa;
|
||||
mod weather;
|
||||
|
||||
use crate::ManifoldCommand;
|
||||
|
|
@ -11,6 +13,8 @@ pub fn collect_commands(injected: Vec<ManifoldCommand>) -> Vec<ManifoldCommand>
|
|||
.chain(admin::commands())
|
||||
.chain(animal::commands())
|
||||
.chain(convert::commands())
|
||||
.chain(joke::commands())
|
||||
.chain(nasa::commands())
|
||||
.chain(weather::commands())
|
||||
.chain(injected)
|
||||
.collect()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
use crate::error::{ManifoldError, ManifoldResult};
|
||||
use crate::{ManifoldContext, ManifoldData};
|
||||
use crate::models::nasa::*;
|
||||
|
||||
#[poise::command(slash_command, prefix_command, aliases("apod"))]
|
||||
async fn nasa_apod(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
|
||||
|
||||
debug!("Processing tip");
|
||||
|
||||
if let Some(tank) = ctx.data().bot_config.services.get("nasa_apod") {
|
||||
let photo: &NasaAstroPhoto = &tank.next_or_fill::<NasaAstroPhoto, NasaAstroPhoto>().await?;
|
||||
|
||||
debug!("Tip: {:?}", photo);
|
||||
|
||||
ctx.send(|f| {
|
||||
f.content(format!("{}", photo))
|
||||
.reply(true)
|
||||
.embed(|e| {
|
||||
e.title(&photo.title);
|
||||
e.description(&photo.explanation);
|
||||
e.image(&photo.hdurl);
|
||||
e
|
||||
})
|
||||
}).await?;
|
||||
} else {
|
||||
error!("No such fuel tank nasa_apod");
|
||||
ctx.send(|f| f.content("The NASA Astronomy Photo of the Day was missing. Try looking up instead.".to_string()).reply(true)).await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn commands() -> [poise::Command<ManifoldData, ManifoldError>; 1] {
|
||||
[nasa_apod()]
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
use std::fmt::{Display, Formatter};
|
||||
use crate::models::fueltank::Pump;
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
pub struct DadJoke {
|
||||
pub id: String,
|
||||
pub joke: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
pub struct DadJokeWrapper {
|
||||
pub results: Vec<DadJoke>
|
||||
}
|
||||
|
||||
impl Display for DadJoke {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{}", self.joke)
|
||||
}
|
||||
}
|
||||
|
||||
impl Pump<DadJoke> for DadJokeWrapper {
|
||||
fn pump(&mut self) -> Option<DadJoke> {
|
||||
self.results.pop()
|
||||
}
|
||||
|
||||
fn len(&self) -> usize {
|
||||
self.results.len()
|
||||
}
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@ use std::path::PathBuf;
|
|||
use dirs::home_dir;
|
||||
use std::io::{SeekFrom, Seek};
|
||||
use reqwest::Client;
|
||||
use reqwest::header::CONTENT_TYPE;
|
||||
use reqwest::header::{ACCEPT, CONTENT_TYPE};
|
||||
use serde::de::DeserializeOwned;
|
||||
use serde::Serialize;
|
||||
|
||||
|
|
@ -32,15 +32,6 @@ pub enum TankMode {
|
|||
}
|
||||
|
||||
impl FuelTank {
|
||||
pub fn new(source_uri: String, cache_name: Option<String>, api_key: Option<String>, cache_mode: TankMode) -> Self {
|
||||
Self {
|
||||
source_uri,
|
||||
cache_name,
|
||||
api_key,
|
||||
cache_mode,
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn next_or_fill<T: Debug, U: Debug>(&self) -> ManifoldResult<T>
|
||||
where T: DeserializeOwned,
|
||||
U: Serialize,
|
||||
|
|
@ -99,10 +90,13 @@ impl FuelTank {
|
|||
let result: U;
|
||||
|
||||
let mut client = Client::new().get(&self.source_uri)
|
||||
.header(CONTENT_TYPE, "application/json");
|
||||
.header(CONTENT_TYPE, "application/json")
|
||||
.header(ACCEPT, "application/json");
|
||||
|
||||
if let Some(api_key) = &self.api_key {
|
||||
client = client.header("X-API-KEY", api_key);
|
||||
}
|
||||
|
||||
result = client.send().await?.json().await?;
|
||||
|
||||
debug!("Result: {:?}", &result);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
pub mod animalpics;
|
||||
pub mod fueltank;
|
||||
pub mod dadjoke;
|
||||
pub mod frogtip;
|
||||
pub mod fueltank;
|
||||
pub mod nasa;
|
||||
pub mod user;
|
||||
pub mod weather;
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
use std::fmt::{Display, Formatter};
|
||||
use crate::models::fueltank::Pump;
|
||||
|
||||
#[derive(Clone, Serialize, Deserialize, Debug)]
|
||||
pub struct NasaAstroPhoto {
|
||||
pub explanation: String,
|
||||
pub hdurl: String,
|
||||
pub title: String
|
||||
}
|
||||
|
||||
impl Display for NasaAstroPhoto {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "{}", self.hdurl)
|
||||
}
|
||||
}
|
||||
|
||||
impl Pump<NasaAstroPhoto> for NasaAstroPhoto {
|
||||
fn pump(&mut self) -> Option<NasaAstroPhoto> {
|
||||
Some(self.clone())
|
||||
}
|
||||
|
||||
fn len(&self) -> usize {
|
||||
1
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue