Fix animethemes command

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/37/head
trivernis 3 years ago
parent 1357d2c17c
commit 965e4fd849
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

4
Cargo.lock generated

@ -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",

@ -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"
animethemes-rs = "0.3.0"

@ -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("<query..>")]
#[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| {

@ -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<ThemeEntry>,
mut anime_entries: Vec<Anime>,
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<Anime>, nsfw: bool) -> Vec<Page<'static>> {
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
));

Loading…
Cancel
Save