From 9cc9b720e23159cc2faddf19089c24abfd9c6d77 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 17 Apr 2021 16:50:26 +0200 Subject: [PATCH 1/5] Fix song database lookup being slow with spotify playlists Signed-off-by: trivernis --- src/commands/music/mod.rs | 27 +++++++++++++++++++-------- src/providers/music/youtube_dl.rs | 9 +++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/commands/music/mod.rs b/src/commands/music/mod.rs index 9b1490f..f5a78e7 100644 --- a/src/commands/music/mod.rs +++ b/src/commands/music/mod.rs @@ -41,6 +41,8 @@ use crate::providers::settings::{get_setting, Setting}; use crate::utils::context_data::{DatabaseContainer, Store}; use crate::utils::error::{BotError, BotResult}; use bot_database::Database; +use futures::future::BoxFuture; +use futures::FutureExt; use serenity::framework::standard::{Args, CommandOptions, Reason}; mod clear_queue; @@ -341,13 +343,19 @@ async fn get_songs_for_query(ctx: &Context, msg: &Message, query: &str) -> BotRe log::debug!("Query is spotify playlist"); let tracks = store.spotify_api.get_songs_in_playlist(&query).await?; - for track in tracks { - songs.push( - get_youtube_song_for_track(&database, track.clone()) - .await? - .unwrap_or(track.into()), - ) - } + let futures: Vec> = tracks + .into_iter() + .map(|track| { + async { + get_youtube_song_for_track(&database, track.clone()) + .await + .unwrap_or(None) + .unwrap_or(track.into()) + } + .boxed() + }) + .collect(); + songs = futures::future::join_all(futures).await; added_multiple_msg(&ctx, msg, &mut songs).await?; } else if SPOTIFY_ALBUM_REGEX.is_match(&query) { @@ -466,7 +474,10 @@ async fn get_youtube_song_for_track(database: &Database, track: Track) -> BotRes if let Some(song) = &entry { // check if the video is still available - if youtube_dl::get_video_information(&song.url).await.is_err() { + if youtube_dl::check_video_available(&song.url) + .await + .unwrap_or(false) + { log::debug!("Video '{}' is not available. Deleting entry", song.url); database.delete_song(song.id).await?; return Ok(None); diff --git a/src/providers/music/youtube_dl.rs b/src/providers/music/youtube_dl.rs index a491131..03c3483 100644 --- a/src/providers/music/youtube_dl.rs +++ b/src/providers/music/youtube_dl.rs @@ -28,6 +28,15 @@ pub(crate) async fn get_videos_for_playlist(url: &str) -> BotResult BotResult { + log::debug!("Checking if video {} is available", url); + let output = youtube_dl(&["--no-warnings", "--skip-download", "--get-id", "-i", url]).await?; + + Ok(output.is_empty()) +} + /// Returns information for a single video by using youtube-dl pub(crate) async fn get_video_information(url: &str) -> BotResult { log::debug!("Fetching information for '{}'", url); From 6f4d9df4b7588d875f2a15cce4730b607f338e1b Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 18 Apr 2021 12:22:46 +0200 Subject: [PATCH 2/5] Switch to youtube-metadata for basic video information fetching Signed-off-by: trivernis --- Cargo.lock | 187 +++++++++++++++++++++++++++++- Cargo.toml | 3 +- src/commands/music/mod.rs | 8 +- src/providers/music/queue.rs | 12 ++ src/providers/music/responses.rs | 2 +- src/providers/music/youtube_dl.rs | 19 --- src/utils/error.rs | 3 + src/utils/logging.rs | 5 + 8 files changed, 211 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3d337dd..eee1ca6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -314,6 +314,12 @@ dependencies = [ "syn", ] +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.1" @@ -406,6 +412,33 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf", + "proc-macro2", + "quote", + "smallvec", + "syn", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "dashmap" version = "4.0.2" @@ -416,6 +449,18 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "derive_more" +version = "0.99.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f82b1b72f1263f214c0f823371768776c4f5841b942c9883aa8e5ec584fd0ba6" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "diesel" version = "1.4.6" @@ -484,6 +529,27 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + +[[package]] +name = "ego-tree" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591" + [[package]] name = "either" version = "1.6.1" @@ -675,6 +741,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generator" version = "0.6.25" @@ -698,6 +773,15 @@ dependencies = [ "version_check", ] +[[package]] +name = "getopts" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" +dependencies = [ + "unicode-width", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -1218,6 +1302,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + [[package]] name = "ntapi" version = "0.3.6" @@ -1356,7 +1446,9 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ + "phf_macros", "phf_shared", + "proc-macro-hack", ] [[package]] @@ -1379,6 +1471,20 @@ dependencies = [ "rand 0.7.3", ] +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "phf_shared" version = "0.8.0" @@ -1677,9 +1783,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf12057f289428dbf5c591c74bf10392e4a8003f993405a902f20117019022d4" +checksum = "2296f2fac53979e8ccbc4a1136b25dcefd37be9ed7e4a1f6b05a6029c84ff124" dependencies = [ "base64 0.13.0", "bytes 1.0.1", @@ -1837,6 +1943,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scraper" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e02aa790c80c2e494130dec6a522033b6a23603ffc06360e9fe6c611ea2c12" +dependencies = [ + "cssparser", + "ego-tree", + "getopts", + "html5ever", + "matches", + "selectors", + "smallvec", + "tendril", +] + [[package]] name = "sct" version = "0.6.0" @@ -1881,6 +2003,26 @@ dependencies = [ "markup5ever_rcdom", ] +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.2.1", + "cssparser", + "derive_more", + "fxhash", + "log 0.4.14", + "matches", + "phf", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + [[package]] name = "semver" version = "0.9.0" @@ -1999,6 +2141,16 @@ dependencies = [ "serde_repr", ] +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + [[package]] name = "sha-1" version = "0.9.4" @@ -2105,6 +2257,12 @@ dependencies = [ "lock_api", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "static_assertions" version = "1.1.0" @@ -2270,6 +2428,12 @@ dependencies = [ "winapi 0.2.8", ] +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + [[package]] name = "thiserror" version = "1.0.24" @@ -2348,6 +2512,7 @@ dependencies = [ "tokio", "trigram", "typemap_rev", + "youtube-metadata", ] [[package]] @@ -2573,6 +2738,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + [[package]] name = "unicode-xid" version = "0.0.3" @@ -2849,6 +3020,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "youtube-metadata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c3fe87fc0ceab2e8b36d76c273dacb9841aff323800f40f5ac01130cf3bf2d1" +dependencies = [ + "lazy_static", + "reqwest", + "scraper", + "thiserror", +] + [[package]] name = "zeroize" version = "1.2.0" diff --git a/Cargo.toml b/Cargo.toml index a5c8a1a..ab87193 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,4 +37,5 @@ chrono-tz = "0.5.3" sauce-api = "0.7.1" rustc_version_runtime = "0.2.0" trigram = "0.4.4" -typemap_rev = "0.1.5" \ No newline at end of file +typemap_rev = "0.1.5" +youtube-metadata = "0.1.1" \ No newline at end of file diff --git a/src/commands/music/mod.rs b/src/commands/music/mod.rs index f5a78e7..1e0ab1d 100644 --- a/src/commands/music/mod.rs +++ b/src/commands/music/mod.rs @@ -44,6 +44,7 @@ use bot_database::Database; use futures::future::BoxFuture; use futures::FutureExt; use serenity::framework::standard::{Args, CommandOptions, Reason}; +use youtube_metadata::get_video_information; mod clear_queue; mod current; @@ -330,7 +331,7 @@ async fn get_songs_for_query(ctx: &Context, msg: &Message, query: &str) -> BotRe // if no songs were found fetch the song as a video if songs.len() == 0 { log::debug!("Query is youtube video"); - let mut song: Song = youtube_dl::get_video_information(&query).await?.into(); + let mut song: Song = get_video_information(&query).await?.into(); added_one_msg(&ctx, msg, &mut song).await?; add_youtube_song_to_database(&store, &database, &mut song).await?; songs.push(song); @@ -474,10 +475,7 @@ async fn get_youtube_song_for_track(database: &Database, track: Track) -> BotRes if let Some(song) = &entry { // check if the video is still available - if youtube_dl::check_video_available(&song.url) - .await - .unwrap_or(false) - { + if get_video_information(&song.url).await.is_err() { log::debug!("Video '{}' is not available. Deleting entry", song.url); database.delete_song(song.id).await?; return Ok(None); diff --git a/src/providers/music/queue.rs b/src/providers/music/queue.rs index 65546ce..7929a95 100644 --- a/src/providers/music/queue.rs +++ b/src/providers/music/queue.rs @@ -217,3 +217,15 @@ impl From for Song { } } } + +impl From for Song { + fn from(i: youtube_metadata::VideoInformation) -> Self { + Self { + title: i.title, + author: i.uploader, + url: Some(i.url.clone()), + thumbnail: i.thumbnail, + source: SongSource::YouTube(i.url), + } + } +} diff --git a/src/providers/music/responses.rs b/src/providers/music/responses.rs index 9e78e38..079930f 100644 --- a/src/providers/music/responses.rs +++ b/src/providers/music/responses.rs @@ -11,7 +11,7 @@ pub(crate) struct PlaylistEntry { #[derive(Deserialize, Clone, Debug)] pub(crate) struct VideoInformation { - id: String, + pub(crate) id: String, pub title: String, pub thumbnail: Option, pub webpage_url: String, diff --git a/src/providers/music/youtube_dl.rs b/src/providers/music/youtube_dl.rs index 03c3483..4bb5027 100644 --- a/src/providers/music/youtube_dl.rs +++ b/src/providers/music/youtube_dl.rs @@ -28,25 +28,6 @@ pub(crate) async fn get_videos_for_playlist(url: &str) -> BotResult BotResult { - log::debug!("Checking if video {} is available", url); - let output = youtube_dl(&["--no-warnings", "--skip-download", "--get-id", "-i", url]).await?; - - Ok(output.is_empty()) -} - -/// Returns information for a single video by using youtube-dl -pub(crate) async fn get_video_information(url: &str) -> BotResult { - log::debug!("Fetching information for '{}'", url); - let output = youtube_dl(&["--no-warnings", "--dump-json", "-i", url]).await?; - - let information = serde_json::from_str(&*output)?; - - Ok(information) -} - /// Searches for a video pub(crate) async fn search_video_information(query: String) -> BotResult> { log::debug!("Searching for video '{}'", query); diff --git a/src/utils/error.rs b/src/utils/error.rs index 487ae43..664d77b 100644 --- a/src/utils/error.rs +++ b/src/utils/error.rs @@ -41,6 +41,9 @@ pub enum BotError { #[error("JoinError: {0}")] JoinError(#[from] songbird::error::JoinError), + #[error("YouTube Error: {0}")] + YoutubeError(#[from] youtube_metadata::error::YoutubeError), + #[error("{0}")] Msg(String), } diff --git a/src/utils/logging.rs b/src/utils/logging.rs index 0a80b08..e79b2a8 100644 --- a/src/utils/logging.rs +++ b/src/utils/logging.rs @@ -61,6 +61,11 @@ pub fn init_logger() { .level_for("mio", log::LevelFilter::Warn) .level_for("songbird", log::LevelFilter::Warn) .level_for("html5ever", log::LevelFilter::Warn) + .level_for("scraper", log::LevelFilter::Warn) + .level_for("html5ever", log::LevelFilter::Warn) + .level_for("cssparser", log::LevelFilter::Warn) + .level_for("selectors", log::LevelFilter::Warn) + .level_for("matches", log::LevelFilter::Warn) .chain(std::io::stdout()) .chain( fern::log_file(log_dir.join(PathBuf::from(format!( From 8209c3146936b26f01dc8fa16e45827707b2881b Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 18 Apr 2021 16:57:24 +0200 Subject: [PATCH 3/5] Add more information to mc item command Signed-off-by: trivernis --- Cargo.lock | 4 +-- Cargo.toml | 2 +- src/commands/minecraft/item.rs | 50 ++++---------------------------- src/messages/minecraft/item.rs | 53 ++++++++++++++++++++++++++++++++++ src/messages/minecraft/mod.rs | 1 + src/messages/mod.rs | 1 + src/providers/minecraft.rs | 47 ++++++++++++++++++++++++++++++ src/providers/mod.rs | 1 + 8 files changed, 112 insertions(+), 47 deletions(-) create mode 100644 src/messages/minecraft/item.rs create mode 100644 src/messages/minecraft/mod.rs create mode 100644 src/providers/minecraft.rs diff --git a/Cargo.lock b/Cargo.lock index eee1ca6..f1c2dd5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1224,9 +1224,9 @@ dependencies = [ [[package]] name = "minecraft-data-rs" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6878c011df73cf61f64b8c55022a2b9b713233d234a8083d2e8a01057921856e" +checksum = "2e1b246bcfc363acfa56bb9414deee90e194a9de2fbfb8c43442da0d77663de4" dependencies = [ "include_dir", "itertools", diff --git a/Cargo.toml b/Cargo.toml index ab87193..e86aa75 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ tokio = { version = "1.4.0", features = ["macros", "rt-multi-thread"] } serde_derive = "1.0.125" serde = "1.0.125" thiserror = "1.0.24" -minecraft-data-rs = "0.2.0" +minecraft-data-rs = "0.3.0" songbird = "0.1.5" serde_json = "1.0.64" rand = "0.8.3" diff --git a/src/commands/minecraft/item.rs b/src/commands/minecraft/item.rs index 496e173..a8cc563 100644 --- a/src/commands/minecraft/item.rs +++ b/src/commands/minecraft/item.rs @@ -1,8 +1,10 @@ use serenity::client::Context; -use serenity::framework::standard::{macros::command, Args, CommandError, CommandResult}; +use serenity::framework::standard::{macros::command, Args, CommandResult}; use serenity::model::channel::Message; use crate::commands::common::handle_autodelete; +use crate::messages::minecraft::item::create_item_message; +use crate::providers::minecraft::get_item_full_information; use crate::utils::context_data::Store; #[command] @@ -18,50 +20,10 @@ pub(crate) async fn item(ctx: &Context, msg: &Message, args: Args) -> CommandRes let item_name = args.message().to_lowercase(); log::debug!("Searching for item '{}'", item_name); - let items_by_name = store.minecraft_data_api.items.items_by_name()?; - let item = items_by_name - .get(&item_name) - .ok_or(CommandError::from(format!( - "The item `{}` could not be found", - item_name - )))?; - let enchantments_by_category = store - .minecraft_data_api - .enchantments - .enchantments_by_category()?; - log::trace!("Item is {:?}", item); + let information = get_item_full_information(&item_name, &store.minecraft_data_api)?; + log::trace!("Item full information is {:?}", information); + create_item_message(ctx, msg.channel_id, information).await?; - msg.channel_id - .send_message(ctx, |m| { - m.embed(|mut e| { - e = e - .title(&*item.display_name) - .thumbnail(format!( - "https://minecraftitemids.com/item/128/{}.png", - item.name - )) - .field("Name", &*item.name, false) - .field("Stack Size", item.stack_size, false); - if let Some(durability) = item.durability { - e = e.field("Durability", durability, true); - } - if let Some(variations) = &item.variations { - e = e.field("Variations", format!("{:?}", variations), false); - } - if let Some(enchant_categories) = &item.enchant_categories { - let item_enchantments = enchant_categories - .into_iter() - .filter_map(|c| enchantments_by_category.get(c)) - .flatten() - .map(|e| e.display_name.clone()) - .collect::>(); - e = e.field("Enchantments", item_enchantments.join(", "), false); - } - - e - }) - }) - .await?; handle_autodelete(ctx, msg).await?; Ok(()) diff --git a/src/messages/minecraft/item.rs b/src/messages/minecraft/item.rs new file mode 100644 index 0000000..5a62994 --- /dev/null +++ b/src/messages/minecraft/item.rs @@ -0,0 +1,53 @@ +use crate::providers::minecraft::ItemFullInformation; +use crate::utils::error::BotResult; +use serenity::client::Context; +use serenity::model::channel::Message; +use serenity::model::prelude::ChannelId; + +pub async fn create_item_message( + ctx: &Context, + channel_id: ChannelId, + item: ItemFullInformation, +) -> BotResult { + let message = channel_id + .send_message(ctx, |m| { + m.embed(|mut e| { + e = e + .title(&item.name) + .thumbnail(format!( + "https://minecraftitemids.com/item/128/{}.png", + item.id + )) + .field("Name", &item.name, false) + .field("Stack Size", item.stack_size, false); + + if let Some(durability) = item.durability { + e.field("Durability", durability, true); + } + + if let Some(food) = &item.food { + e.field("Saturation", food.saturation, true); + } + + if let Some(block) = &item.block { + e.field("Hardness", block.hardness.unwrap_or(0f32), true) + .field( + "Blast Resistance", + block.blast_resistance.unwrap_or(0f32), + true, + ) + .field("Transparent", block.transparent, true) + .field("Emission Level", block.emit_light, true); + } + + if !item.enchantments.is_empty() { + e.field("Enchantments", item.enchantments.join(", "), false); + } + + e + }) + }) + .await?; + + Ok(message) +} diff --git a/src/messages/minecraft/mod.rs b/src/messages/minecraft/mod.rs new file mode 100644 index 0000000..a35e98d --- /dev/null +++ b/src/messages/minecraft/mod.rs @@ -0,0 +1 @@ +pub mod item; diff --git a/src/messages/mod.rs b/src/messages/mod.rs index 3b74e13..43c3c2f 100644 --- a/src/messages/mod.rs +++ b/src/messages/mod.rs @@ -5,6 +5,7 @@ use serenity::client::Context; use std::time::{Duration, SystemTime}; pub mod gifs; +pub mod minecraft; pub mod music; pub mod sauce; diff --git a/src/providers/minecraft.rs b/src/providers/minecraft.rs new file mode 100644 index 0000000..1d9b8ff --- /dev/null +++ b/src/providers/minecraft.rs @@ -0,0 +1,47 @@ +use crate::utils::error::{BotError, BotResult}; +use minecraft_data_rs::api::Api; +use minecraft_data_rs::models::block::Block; +use minecraft_data_rs::models::food::Food; + +#[derive(Clone, Debug)] +pub struct ItemFullInformation { + pub id: String, + pub name: String, + pub enchantments: Vec, + pub durability: Option, + pub stack_size: u8, + pub food: Option, + pub block: Option, +} + +pub fn get_item_full_information(name: &str, api: &Api) -> BotResult { + let items_by_name = api.items.items_by_name()?; + let item = items_by_name.get(name).ok_or(BotError::Msg(format!( + "The item `{}` could not be found", + name + )))?; + let enchantments_by_category = api.enchantments.enchantments_by_category()?; + let mut enchantments = Vec::new(); + + if let Some(enchant_categories) = &item.enchant_categories { + enchantments = enchant_categories + .into_iter() + .filter_map(|c| enchantments_by_category.get(c)) + .flatten() + .map(|e| e.display_name.clone()) + .collect::>(); + } + let food_by_name = api.foods.foods_by_name()?; + let blocks_by_name = api.blocks.blocks_by_name()?; + + log::trace!("Item is {:?}", item); + Ok(ItemFullInformation { + id: item.name.clone(), + name: item.display_name.clone(), + enchantments, + durability: item.durability.clone(), + stack_size: item.stack_size, + food: food_by_name.get(name).cloned(), + block: blocks_by_name.get(name).cloned(), + }) +} diff --git a/src/providers/mod.rs b/src/providers/mod.rs index b26a4ed..f162fdb 100644 --- a/src/providers/mod.rs +++ b/src/providers/mod.rs @@ -1,3 +1,4 @@ pub(crate) mod music; pub(crate) mod qalc; pub(crate) mod settings; +pub(crate) mod minecraft; From 719e3e4c25392f16babceda5b502c08c842bd0f2 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 18 Apr 2021 17:01:19 +0200 Subject: [PATCH 4/5] Update dependencies Signed-off-by: trivernis --- Cargo.lock | 81 +++++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f1c2dd5..79946c1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,9 +55,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.48" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ea56748e10732c49404c153638a15ec3d6211ec5ff35d9bb20e13b93576adf" +checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" dependencies = [ "proc-macro2", "quote", @@ -359,9 +359,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils 0.8.3", @@ -597,9 +597,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.10.2" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531a685ab99b8f60a271b44d5dd1a76e55124a8c9fa0407b7a8e9cd172d5b588" +checksum = "11fce69af4d4582ea989e6adfc5c9b81fd2071ff89234e5c14675c82a85217df" dependencies = [ "futures-core", "futures-sink", @@ -862,9 +862,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" +checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ "bytes 1.0.1", "fnv", @@ -884,9 +884,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.3.5" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" +checksum = "4a1ce40d6fc9764887c2fdc7305c3dcc429ba11ff981c1509416afd5697e4437" [[package]] name = "httpdate" @@ -948,9 +948,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -1085,9 +1085,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d855069fafbb9b344c0f962150cd2c1187975cb1c22c1522c240d8c4986714" +checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" [[package]] name = "lock_api" @@ -1496,18 +1496,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6" +checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5" +checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" dependencies = [ "proc-macro2", "quote", @@ -1748,9 +1748,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +checksum = "8270314b5ccceb518e7e578952f0b72b88222d02e8f77f5ecf7abbb673539041" dependencies = [ "bitflags 1.2.1", ] @@ -1863,9 +1863,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "064fd21ff87c6e87ed4506e68beb42459caa4a0e2eb144932e6776768556980b" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" dependencies = [ "base64 0.13.0", "log 0.4.14", @@ -1961,9 +1961,9 @@ dependencies = [ [[package]] name = "sct" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ "ring", "untrusted", @@ -2203,9 +2203,9 @@ dependencies = [ [[package]] name = "songbird" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f905ef041c2222d57d3e77868d5cdc616f42b7c506d21a87b14fc62784209e" +checksum = "358efdd4b111021b0b7499fa087aa3cba8f01ae7210d37ab45620e4791c09ab8" dependencies = [ "async-trait", "async-tungstenite 0.13.1", @@ -2222,6 +2222,7 @@ dependencies = [ "serenity", "serenity-voice-model", "spin_sleep", + "spinning_top", "streamcatcher", "tokio", "tracing", @@ -2250,9 +2251,9 @@ dependencies = [ [[package]] name = "spinning_top" -version = "0.2.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd0ab6b8c375d2d963503b90d3770010d95bc3b5f98036f948dee24bf4e8879" +checksum = "7e529d73e80d64b5f2631f9035113347c578a1c9c7774b83a2b880788459ab36" dependencies = [ "lock_api", ] @@ -2319,9 +2320,9 @@ checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" [[package]] name = "syn" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce15dd3ed8aa2f8eeac4716d6ef5ab58b6b9256db41d7e1a0224c2788e8fd87" +checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" dependencies = [ "proc-macro2", "quote", @@ -2517,9 +2518,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134af885d758d645f0f0505c9a8b3f9bf8a348fd822e112ab5248138348f1722" +checksum = "83f0c8e7c0addab50b663055baf787d0af7f413a46e6e7fb9559a4e4db7137a5" dependencies = [ "autocfg", "bytes 1.0.1", @@ -2580,9 +2581,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5143d049e85af7fbc36f5454d990e62c2df705b3589f123b71f441b6b59f443f" +checksum = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e" dependencies = [ "bytes 1.0.1", "futures-core", @@ -2722,9 +2723,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" dependencies = [ "matches", ] @@ -2792,9 +2793,9 @@ checksum = "c9232eb53352b4442e40d7900465dfc534e8cb2dc8f18656fcb2ac16112b5593" [[package]] name = "utf-8" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" @@ -2813,9 +2814,9 @@ checksum = "f4bf03e0ca70d626ecc4ba6b0763b934b6f2976e8c744088bb3c1d646fbb1ad0" [[package]] name = "vcpkg" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" +checksum = "cbdbff6266a24120518560b5dc983096efb98462e51d0d68169895b237be3e5d" [[package]] name = "version_check" From c19329806036013db25856546fa1ef76cb5c543a Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 18 Apr 2021 17:03:19 +0200 Subject: [PATCH 5/5] Bump version Signed-off-by: trivernis --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79946c1..d261251 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2483,7 +2483,7 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tobi-rs" -version = "0.6.4" +version = "0.6.5" dependencies = [ "aspotify", "bot-coreutils", diff --git a/Cargo.toml b/Cargo.toml index e86aa75..66d7500 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tobi-rs" -version = "0.6.4" +version = "0.6.5" authors = ["trivernis "] edition = "2018"