From e9adc2393d8995c7b39c3705a5e030a22546db77 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 21 Aug 2021 11:17:13 +0200 Subject: [PATCH 1/4] Improve inspirobot embed Signed-off-by: trivernis --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/messages/inspirobot.rs | 18 +++++++++++++----- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58288e4..031c102 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2575,7 +2575,7 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tobi-rs" -version = "0.9.3" +version = "0.9.4" dependencies = [ "animethemes-rs", "aspotify", diff --git a/Cargo.toml b/Cargo.toml index 8c9cf43..07a80b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tobi-rs" -version = "0.9.3" +version = "0.9.4" authors = ["trivernis "] edition = "2018" diff --git a/src/messages/inspirobot.rs b/src/messages/inspirobot.rs index 46bedef..98ab969 100644 --- a/src/messages/inspirobot.rs +++ b/src/messages/inspirobot.rs @@ -4,19 +4,23 @@ use serenity::builder::CreateMessage; use serenity::client::Context; use serenity::model::id::ChannelId; use serenity_rich_interaction::core::EXTRA_LONG_TIMEOUT; -use serenity_rich_interaction::menu::{display_page, MenuBuilder, Page}; +use serenity_rich_interaction::menu::{ + close_menu, display_page, MenuBuilder, Page, CLOSE_MENU_EMOJI, +}; -static REFRESH_CONTROL: &str = "🔄"; +static REFRESH_EMOJI: &str = "🔄"; pub async fn create_inspirobot_menu(ctx: &Context, channel_id: ChannelId) -> BotResult<()> { MenuBuilder::default() - .add_control(0, REFRESH_CONTROL, |ctx, menu, _r| { + .add_control(0, REFRESH_EMOJI, |ctx, menu, _r| { Box::pin(async move { display_page(ctx, menu).await?; Ok(()) }) }) - .add_help(REFRESH_CONTROL, "Creates a new inspiring image.") + .add_help(REFRESH_EMOJI, "Creates a new inspiring image.") + .add_control(1, CLOSE_MENU_EMOJI, |c, m, r| Box::pin(close_menu(c, m, r))) + .add_help(CLOSE_MENU_EMOJI, "Closes this menu.") .show_help() .add_page(Page::new_builder(|| { Box::pin(async { @@ -36,7 +40,11 @@ pub async fn create_inspirobot_menu(ctx: &Context, channel_id: ChannelId) -> Bot async fn create_inspirobot_page<'a>() -> BotResult> { let image = get_inspirobot_image().await?; let mut message = CreateMessage::default(); - message.embed(|e| e.image(image).title("Be inspired")); + message.embed(|e| { + e.image(image) + .title("Be inspired") + .footer(|f| f.text("Powered by inspirobot.me")) + }); Ok(message) } From 1357d2c17c2b77d68068799c10c1621592948c67 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 21 Aug 2021 11:45:07 +0200 Subject: [PATCH 2/4] Update rich interactions and add owners to several menus Signed-off-by: trivernis --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- src/commands/misc/inspirobot.rs | 2 +- src/commands/misc/media.rs | 2 +- src/commands/misc/xkcd.rs | 2 +- src/commands/weeb/theme.rs | 2 +- src/messages/gifs.rs | 4 +++- src/messages/inspirobot.rs | 9 +++++++-- src/messages/theme.rs | 4 +++- src/messages/xkcd.rs | 4 +++- 10 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 031c102..292b24e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2208,9 +2208,9 @@ dependencies = [ [[package]] name = "serenity-rich-interaction" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8151b0ce52fdbcc8834a0b6788ff67baf83dea37a4050462c2b5ae2621b87821" +checksum = "9e29c534ec1387d4a0849587494e03acfb9780335468d9936f19af00f5fd0178" dependencies = [ "futures", "log 0.4.14", diff --git a/Cargo.toml b/Cargo.toml index 07a80b8..8cf306d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ panic = 'abort' [dependencies] bot-database = {path="./bot-database"} bot-coreutils = {path="./bot-coreutils"} -serenity-rich-interaction = "0.2.2" +serenity-rich-interaction = "0.2.5" serenity = "0.10.5" dotenv = "0.15.0" tokio = { version = "1.4.0", features = ["macros", "rt-multi-thread"] } diff --git a/src/commands/misc/inspirobot.rs b/src/commands/misc/inspirobot.rs index 209ad83..7b8b5e2 100644 --- a/src/commands/misc/inspirobot.rs +++ b/src/commands/misc/inspirobot.rs @@ -10,7 +10,7 @@ use serenity::model::channel::Message; #[aliases("inspireme", "inspire-me", "inspiro")] #[bucket("general")] async fn inspirobot(ctx: &Context, msg: &Message) -> CommandResult { - create_inspirobot_menu(ctx, msg.channel_id).await?; + create_inspirobot_menu(ctx, msg.channel_id, msg.author.id).await?; Ok(()) } diff --git a/src/commands/misc/media.rs b/src/commands/misc/media.rs index a4597af..3f85781 100644 --- a/src/commands/misc/media.rs +++ b/src/commands/misc/media.rs @@ -12,7 +12,7 @@ use serenity::model::channel::Message; async fn media(ctx: &Context, msg: &Message) -> CommandResult { let database = get_database_from_context(ctx).await; let gifs = database.get_all_media().await?; - create_media_menu(ctx, msg.channel_id, gifs).await?; + create_media_menu(ctx, msg.channel_id, gifs, msg.author.id).await?; Ok(()) } diff --git a/src/commands/misc/xkcd.rs b/src/commands/misc/xkcd.rs index c267fc7..3156eb6 100644 --- a/src/commands/misc/xkcd.rs +++ b/src/commands/misc/xkcd.rs @@ -29,7 +29,7 @@ async fn xkcd(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { vec![xkcd_search::get_latest_comic().await?] }; - create_xkcd_menu(ctx, msg.channel_id, comics).await?; + create_xkcd_menu(ctx, msg.channel_id, comics, msg.author.id).await?; Ok(()) } diff --git a/src/commands/weeb/theme.rs b/src/commands/weeb/theme.rs index 84fb763..019b6cd 100644 --- a/src/commands/weeb/theme.rs +++ b/src/commands/weeb/theme.rs @@ -25,7 +25,7 @@ async fn theme(ctx: &Context, msg: &Message, args: Args) -> CommandResult { }) .await?; } else { - create_theme_menu(ctx, msg.channel_id, entries).await?; + create_theme_menu(ctx, msg.channel_id, entries, msg.author.id).await?; } } else { EphemeralMessage::create(&ctx.http, msg.channel_id, MEDIUM_TIMEOUT, |c| { diff --git a/src/messages/gifs.rs b/src/messages/gifs.rs index c6c7c94..97c9717 100644 --- a/src/messages/gifs.rs +++ b/src/messages/gifs.rs @@ -2,7 +2,7 @@ use crate::utils::error::BotResult; use bot_database::models::Media; use serenity::builder::CreateMessage; use serenity::client::Context; -use serenity::model::id::ChannelId; +use serenity::model::id::{ChannelId, UserId}; use serenity_rich_interaction::menu::{MenuBuilder, Page}; use std::time::Duration; @@ -11,6 +11,7 @@ pub async fn create_media_menu( ctx: &Context, channel_id: ChannelId, media: Vec, + owner: UserId, ) -> BotResult<()> { let total_pages = (media.len() as f32 / 10.0).ceil() as usize; let pages: Vec = media @@ -23,6 +24,7 @@ pub async fn create_media_menu( .timeout(Duration::from_secs(120)) .add_pages(pages) .show_help() + .owner(owner) .build(ctx, channel_id) .await?; diff --git a/src/messages/inspirobot.rs b/src/messages/inspirobot.rs index 98ab969..87090ec 100644 --- a/src/messages/inspirobot.rs +++ b/src/messages/inspirobot.rs @@ -2,7 +2,7 @@ use crate::providers::music::inspirobot::get_inspirobot_image; use crate::utils::error::BotResult; use serenity::builder::CreateMessage; use serenity::client::Context; -use serenity::model::id::ChannelId; +use serenity::model::id::{ChannelId, UserId}; use serenity_rich_interaction::core::EXTRA_LONG_TIMEOUT; use serenity_rich_interaction::menu::{ close_menu, display_page, MenuBuilder, Page, CLOSE_MENU_EMOJI, @@ -10,7 +10,11 @@ use serenity_rich_interaction::menu::{ static REFRESH_EMOJI: &str = "🔄"; -pub async fn create_inspirobot_menu(ctx: &Context, channel_id: ChannelId) -> BotResult<()> { +pub async fn create_inspirobot_menu( + ctx: &Context, + channel_id: ChannelId, + owner: UserId, +) -> BotResult<()> { MenuBuilder::default() .add_control(0, REFRESH_EMOJI, |ctx, menu, _r| { Box::pin(async move { @@ -30,6 +34,7 @@ pub async fn create_inspirobot_menu(ctx: &Context, channel_id: ChannelId) -> Bot Ok(message) }) })) + .owner(owner) .timeout(EXTRA_LONG_TIMEOUT) .build(ctx, channel_id) .await?; diff --git a/src/messages/theme.rs b/src/messages/theme.rs index 317a165..5dbea60 100644 --- a/src/messages/theme.rs +++ b/src/messages/theme.rs @@ -2,7 +2,7 @@ use crate::utils::error::BotResult; use animethemes_rs::models::{ThemeEntry, ThemeType}; use serenity::builder::CreateMessage; use serenity::client::Context; -use serenity::model::id::ChannelId; +use serenity::model::id::{ChannelId, UserId}; use serenity_rich_interaction::core::EXTRA_LONG_TIMEOUT; use serenity_rich_interaction::menu::{MenuBuilder, Page}; @@ -11,6 +11,7 @@ pub async fn create_theme_menu( ctx: &Context, channel_id: ChannelId, mut entries: Vec, + owner: UserId, ) -> BotResult<()> { let nsfw = ctx.http.get_channel(channel_id.0).await?.is_nsfw(); entries.sort_by_key(|t| { @@ -40,6 +41,7 @@ pub async fn create_theme_menu( .map(create_theme_page), ) .timeout(EXTRA_LONG_TIMEOUT) + .owner(owner) .build(ctx, channel_id) .await?; diff --git a/src/messages/xkcd.rs b/src/messages/xkcd.rs index 9dc3434..4a3bf91 100644 --- a/src/messages/xkcd.rs +++ b/src/messages/xkcd.rs @@ -1,7 +1,7 @@ use crate::utils::error::BotResult; use serenity::builder::CreateMessage; use serenity::client::Context; -use serenity::model::id::ChannelId; +use serenity::model::id::{ChannelId, UserId}; use serenity_rich_interaction::core::LONG_TIMEOUT; use serenity_rich_interaction::menu::{MenuBuilder, Page}; use xkcd_search::Comic; @@ -11,6 +11,7 @@ pub async fn create_xkcd_menu( ctx: &Context, channel_id: ChannelId, comics: Vec, + owner: UserId, ) -> BotResult<()> { let mut builder = if comics.len() > 1 { MenuBuilder::new_paginator() @@ -25,6 +26,7 @@ pub async fn create_xkcd_menu( builder .add_pages(comics.into_iter().map(|c| create_xkcd_page(c))) .timeout(LONG_TIMEOUT) + .owner(owner) .build(ctx, channel_id) .await?; From 965e4fd8491b7d11117ff9b0a8e8e79e88daef0e Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 21 Aug 2021 12:39:11 +0200 Subject: [PATCH 3/4] Fix animethemes command Signed-off-by: trivernis --- Cargo.lock | 4 +-- Cargo.toml | 2 +- src/commands/weeb/theme.rs | 20 +++++++++--- src/messages/theme.rs | 65 +++++++++++++++++++++++--------------- 4 files changed, 58 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 292b24e..544d078 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,9 +28,9 @@ dependencies = [ [[package]] name = "animethemes-rs" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85ae35b6d7efdd387a743cbf2d2bd1b8e9545d2c3e5abc85a1aa0e5ca99e5af" +checksum = "b717f29f786445f30818874943f9c7c6ad370804cc7a345d3f0bae3c85163d17" dependencies = [ "reqwest", "serde", diff --git a/Cargo.toml b/Cargo.toml index 8cf306d..1da9e10 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,4 +41,4 @@ typemap_rev = "0.1.5" youtube-metadata = "0.1.1" xkcd-search = "0.1.1" lavalink-rs = {version="0.7.1", features=["native", "serenity"]} -animethemes-rs = "0.2.1" \ No newline at end of file +animethemes-rs = "0.3.0" \ No newline at end of file diff --git a/src/commands/weeb/theme.rs b/src/commands/weeb/theme.rs index 019b6cd..049d737 100644 --- a/src/commands/weeb/theme.rs +++ b/src/commands/weeb/theme.rs @@ -1,5 +1,6 @@ use crate::messages::theme::create_theme_menu; use animethemes_rs::client::AnimeThemesClient; +use animethemes_rs::includes; use serenity::client::Context; use serenity::framework::standard::macros::command; use serenity::framework::standard::{Args, CommandResult}; @@ -10,22 +11,31 @@ use serenity_rich_interaction::ephemeral_message::EphemeralMessage; #[command] #[description("Query for the opening/ending/insert song of an anime")] #[usage("")] +#[min_args(1)] #[aliases("animetheme", "anime-theme", "opening", "ending", "ost")] #[bucket("general")] async fn theme(ctx: &Context, msg: &Message, args: Args) -> CommandResult { let query = args.message(); let client = AnimeThemesClient::default(); - let themes = client - .search(query, &["entries"], &["theme", "theme.anime", "videos"]) + let search_results = client + .search( + query, + &[includes::ANIME], + &[ + "animethemes", + "animethemes.animethemeentries", + "animethemes.animethemeentries.videos", + ], + ) .await?; - if let Some(entries) = themes.entries { - if entries.is_empty() { + if let Some(anime) = search_results.anime { + if anime.is_empty() { EphemeralMessage::create(&ctx.http, msg.channel_id, MEDIUM_TIMEOUT, |c| { c.reference_message(msg).content("No themes found") }) .await?; } else { - create_theme_menu(ctx, msg.channel_id, entries, msg.author.id).await?; + create_theme_menu(ctx, msg.channel_id, anime, msg.author.id).await?; } } else { EphemeralMessage::create(&ctx.http, msg.channel_id, MEDIUM_TIMEOUT, |c| { diff --git a/src/messages/theme.rs b/src/messages/theme.rs index 5dbea60..4a9e129 100644 --- a/src/messages/theme.rs +++ b/src/messages/theme.rs @@ -1,5 +1,5 @@ use crate::utils::error::BotResult; -use animethemes_rs::models::{ThemeEntry, ThemeType}; +use animethemes_rs::models::{Anime, ThemeEntry, ThemeType}; use serenity::builder::CreateMessage; use serenity::client::Context; use serenity::model::id::{ChannelId, UserId}; @@ -10,12 +10,12 @@ use serenity_rich_interaction::menu::{MenuBuilder, Page}; pub async fn create_theme_menu( ctx: &Context, channel_id: ChannelId, - mut entries: Vec, + mut anime_entries: Vec, owner: UserId, ) -> BotResult<()> { let nsfw = ctx.http.get_channel(channel_id.0).await?.is_nsfw(); - entries.sort_by_key(|t| { - if let Some(theme) = &t.theme { + anime_entries.sort_by_key(|a| { + if let Some(theme) = a.themes.as_ref().and_then(|t| t.first()) { match &theme.theme_type { ThemeType::OP => theme.sequence.unwrap_or(1), ThemeType::ED => theme.sequence.unwrap_or(1) * 100, @@ -24,22 +24,9 @@ pub async fn create_theme_menu( 10000 } }); + let pages = create_theme_pages(anime_entries, nsfw); MenuBuilder::new_paginator() - .add_pages( - entries - .into_iter() - .filter(|e| { - if !nsfw && e.nsfw { - return false; - } - if let Some(videos) = &e.videos { - !videos.is_empty() - } else { - false - } - }) - .map(create_theme_page), - ) + .add_pages(pages) .timeout(EXTRA_LONG_TIMEOUT) .owner(owner) .build(ctx, channel_id) @@ -48,13 +35,41 @@ pub async fn create_theme_menu( Ok(()) } +fn create_theme_pages(anime_entries: Vec, nsfw: bool) -> Vec> { + let mut pages = Vec::new(); + for anime in anime_entries { + if anime.themes.is_none() { + continue; + } + for theme in anime.themes.unwrap() { + if theme.entries.is_none() { + continue; + } + let sequence = theme.sequence.clone().unwrap_or(1); + for entry in theme.entries.unwrap() { + if entry.nsfw && !nsfw { + continue; + } + let page = create_theme_page(&anime.name, &theme.theme_type, sequence, entry); + pages.push(page); + } + } + } + + pages +} + /// Creates a new anime theme page -fn create_theme_page(entry: ThemeEntry) -> Page<'static> { +fn create_theme_page( + anime_name: &str, + theme_type: &ThemeType, + theme_sequence: u16, + entry: ThemeEntry, +) -> Page<'static> { let mut message = CreateMessage::default(); let videos = entry.videos.unwrap(); - let theme = entry.theme.unwrap(); - let anime = theme.anime.unwrap(); - let theme_type = match theme.theme_type { + + let theme_type = match theme_type { ThemeType::OP => "Opening", ThemeType::ED => "Ending", }; @@ -62,8 +77,8 @@ fn create_theme_page(entry: ThemeEntry) -> Page<'static> { message.content(format!( "**{} {}** of **{}**\nhttps://animethemes.moe/video/{}", theme_type, - theme.sequence.unwrap_or(1), - anime.name, + theme_sequence, + anime_name, videos.first().unwrap().basename )); From 22d8162822a07fe76a3666795acfccf4b9350e01 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 21 Aug 2021 12:39:44 +0200 Subject: [PATCH 4/4] Add alias 'a' to gura command Signed-off-by: trivernis --- src/commands/weeb/hololive/gura.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/weeb/hololive/gura.rs b/src/commands/weeb/hololive/gura.rs index 85e987a..84b77ae 100644 --- a/src/commands/weeb/hololive/gura.rs +++ b/src/commands/weeb/hololive/gura.rs @@ -7,7 +7,7 @@ use serenity::model::channel::Message; #[command] #[description("Posts a random gura")] #[usage("")] -#[aliases("shark", "city-pop-shark", "same")] +#[aliases("a", "shark", "city-pop-shark", "same")] #[bucket("general")] async fn gura(ctx: &Context, msg: &Message) -> CommandResult { post_random_media(ctx, msg, "gura").await