Add xkcd command

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/28/head
trivernis 3 years ago
parent d6fb52daf2
commit 84dd3174e7
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

17
Cargo.lock generated

@ -2526,7 +2526,7 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
[[package]]
name = "tobi-rs"
version = "0.8.0"
version = "0.8.1"
dependencies = [
"aspotify",
"bot-coreutils",
@ -2557,6 +2557,7 @@ dependencies = [
"tokio",
"trigram",
"typemap_rev",
"xkcd-search",
"youtube-metadata",
]
@ -3052,6 +3053,20 @@ dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "xkcd-search"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b456f115f18547c3a1185788837a000201bc29893dd5b70a12437f11d2ded190"
dependencies = [
"lazy_static",
"reqwest",
"scraper",
"serde",
"thiserror",
"trigram",
]
[[package]]
name = "xml5ever"
version = "0.16.1"

@ -1,6 +1,6 @@
[package]
name = "tobi-rs"
version = "0.8.0"
version = "0.8.1"
authors = ["trivernis <trivernis@protonmail.com>"]
edition = "2018"
@ -39,4 +39,5 @@ rustc_version_runtime = "0.2.0"
trigram = "0.4.4"
typemap_rev = "0.1.5"
youtube-metadata = "0.1.1"
xkcd-search = "0.1.0"
lavalink-rs = {version="0.7.1", features=["native", "serenity"]}

@ -19,12 +19,10 @@ use crate::utils::context_data::{
use crate::utils::error::{BotError, BotResult};
use lavalink_rs::LavalinkClient;
use serenity::framework::standard::buckets::LimitedFor;
use serenity_rich_interaction::menu::EventDrivenMessageContainer;
use serenity_rich_interaction::RegisterRichInteractions;
use std::env;
use std::sync::Arc;
use std::time::SystemTime;
use tokio::sync::Mutex;
pub async fn get_client() -> BotResult<Client> {
let token = env::var("BOT_TOKEN").map_err(|_| BotError::MissingToken)?;

@ -11,6 +11,7 @@ use shutdown::SHUTDOWN_COMMAND;
use stats::STATS_COMMAND;
use time::TIME_COMMAND;
use timezones::TIMEZONES_COMMAND;
use xkcd::XKCD_COMMAND;
mod about;
mod add_media;
@ -24,9 +25,10 @@ mod shutdown;
mod stats;
mod time;
mod timezones;
mod xkcd;
#[group]
#[commands(
ping, stats, shutdown, time, timezones, qalc, about, add_media, media, pain, clear
ping, stats, shutdown, time, timezones, qalc, about, add_media, media, pain, clear, xkcd
)]
pub struct Misc;

@ -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(())
}

@ -8,6 +8,7 @@ pub mod gifs;
pub mod minecraft;
pub mod music;
pub mod sauce;
pub mod xkcd;
/// Adds an ephemeral message to the database
pub async fn add_ephemeral_handle_to_database(

@ -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…
Cancel
Save