Add theme command for anime themes
Signed-off-by: trivernis <trivernis@protonmail.com>pull/31/head
parent
5b02a26217
commit
40f9a90a06
@ -0,0 +1,38 @@
|
||||
use crate::messages::theme::create_theme_menu;
|
||||
use animethemes_rs::client::AnimeThemesClient;
|
||||
use serenity::client::Context;
|
||||
use serenity::framework::standard::macros::command;
|
||||
use serenity::framework::standard::{Args, CommandResult};
|
||||
use serenity::model::channel::Message;
|
||||
use serenity_rich_interaction::core::MEDIUM_TIMEOUT;
|
||||
use serenity_rich_interaction::ephemeral_message::EphemeralMessage;
|
||||
|
||||
#[command]
|
||||
#[description("Query for the opening/ending/insert song of an anime")]
|
||||
#[usage("<query..>")]
|
||||
#[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"])
|
||||
.await?;
|
||||
if let Some(entries) = themes.entries {
|
||||
if entries.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).await?;
|
||||
}
|
||||
} else {
|
||||
EphemeralMessage::create(&ctx.http, msg.channel_id, MEDIUM_TIMEOUT, |c| {
|
||||
c.reference_message(msg).content("No themes found")
|
||||
})
|
||||
.await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
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_rich_interaction::core::EXTRA_LONG_TIMEOUT;
|
||||
use serenity_rich_interaction::menu::{MenuBuilder, Page};
|
||||
|
||||
/// Creates a new Anime Theme Menu
|
||||
pub async fn create_theme_menu(
|
||||
ctx: &Context,
|
||||
channel_id: ChannelId,
|
||||
mut entries: Vec<ThemeEntry>,
|
||||
) -> BotResult<()> {
|
||||
let nsfw = ctx.http.get_channel(channel_id.0).await?.is_nsfw();
|
||||
entries.sort_by_key(|t| {
|
||||
if let Some(theme) = &t.theme {
|
||||
match &theme.theme_type {
|
||||
ThemeType::OP => theme.sequence.unwrap_or(1),
|
||||
ThemeType::ED => theme.sequence.unwrap_or(1) * 100,
|
||||
}
|
||||
} else {
|
||||
10000
|
||||
}
|
||||
});
|
||||
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(|e| create_theme_page(e, nsfw)),
|
||||
)
|
||||
.timeout(EXTRA_LONG_TIMEOUT)
|
||||
.build(ctx, channel_id)
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Creates a new anime theme page
|
||||
fn create_theme_page(entry: ThemeEntry, nsfw: bool) -> 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 {
|
||||
ThemeType::OP => "Opening",
|
||||
ThemeType::ED => "Ending",
|
||||
};
|
||||
|
||||
message.content(format!(
|
||||
"**{} {}** of **{}**\nhttps://animethemes.moe/video/{}",
|
||||
theme_type,
|
||||
theme.sequence.unwrap_or(1),
|
||||
anime.name,
|
||||
videos.first().unwrap().basename
|
||||
));
|
||||
|
||||
Page::Static(message)
|
||||
}
|
Loading…
Reference in New Issue