parent
d6fb52daf2
commit
84dd3174e7
@ -0,0 +1,35 @@
|
||||
use crate::messages::xkcd::create_xkcd_menu;
|
||||
use serenity::client::Context;
|
||||
use serenity::framework::standard::macros::command;
|
||||
use serenity::framework::standard::{Args, CommandResult};
|
||||
use serenity::model::channel::Message;
|
||||
use xkcd_search::get_comic;
|
||||
|
||||
#[command]
|
||||
#[description("Retrieves xkcd comics")]
|
||||
#[usage("[(<id>|<query..>)]")]
|
||||
#[bucket("general")]
|
||||
async fn xkcd(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult {
|
||||
let comics = if let Ok(id) = args.single::<u32>() {
|
||||
if let Ok(comic) = xkcd_search::get_comic(id).await {
|
||||
vec![comic]
|
||||
} else {
|
||||
vec![]
|
||||
}
|
||||
} else if !args.is_empty() {
|
||||
let query = args.message();
|
||||
let results = xkcd_search::search(query).await?;
|
||||
let comics =
|
||||
futures::future::join_all(results.into_iter().map(|(_, id)| get_comic(id))).await;
|
||||
comics
|
||||
.into_iter()
|
||||
.filter_map(|result| result.ok())
|
||||
.collect()
|
||||
} else {
|
||||
vec![xkcd_search::get_latest_comic().await?]
|
||||
};
|
||||
|
||||
create_xkcd_menu(ctx, msg.channel_id, comics).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
use crate::utils::error::BotResult;
|
||||
use serenity::builder::CreateMessage;
|
||||
use serenity::client::Context;
|
||||
use serenity::model::id::ChannelId;
|
||||
use serenity_rich_interaction::core::LONG_TIMEOUT;
|
||||
use serenity_rich_interaction::menu::{MenuBuilder, Page};
|
||||
use xkcd_search::Comic;
|
||||
|
||||
/// Creates a new xkcd menu
|
||||
pub async fn create_xkcd_menu(
|
||||
ctx: &Context,
|
||||
channel_id: ChannelId,
|
||||
comics: Vec<Comic>,
|
||||
) -> BotResult<()> {
|
||||
let mut builder = if comics.len() > 1 {
|
||||
MenuBuilder::new_paginator()
|
||||
} else {
|
||||
MenuBuilder::default()
|
||||
};
|
||||
if comics.is_empty() {
|
||||
let mut message = CreateMessage::default();
|
||||
message.content("No Comics found");
|
||||
builder = builder.add_page(Page::new_static(message));
|
||||
}
|
||||
builder
|
||||
.add_pages(comics.into_iter().map(|c| create_xkcd_page(c)))
|
||||
.timeout(LONG_TIMEOUT)
|
||||
.build(ctx, channel_id)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Creates an xkcd message
|
||||
fn create_xkcd_page<'a>(comic: Comic) -> Page<'a> {
|
||||
let mut message = CreateMessage::default();
|
||||
|
||||
message.embed(|e| {
|
||||
e.title(format!("#{} - {}", comic.num, comic.title))
|
||||
.image(&comic.img)
|
||||
.url(format!("https://xkcd.com/{}", comic.num))
|
||||
.footer(|f| f.text(format!("{} | xkcd.com", comic.alt)))
|
||||
});
|
||||
|
||||
Page::new_static(message)
|
||||
}
|
Loading…
Reference in New Issue