From 51574e76098c81aedc95d0eb367c850ee49c4223 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Mon, 29 Jul 2024 19:50:38 +0000 Subject: [PATCH 01/95] deps and comments --- Cargo.lock | 82 +---------------------------------------- crack-core/Cargo.toml | 3 +- crack-core/src/utils.rs | 1 - cracktunes/Cargo.toml | 2 +- 4 files changed, 4 insertions(+), 84 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c8f5c2547..9483788b5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -92,12 +92,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anstyle" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" - [[package]] name = "anyhow" version = "1.0.86" @@ -820,7 +814,7 @@ dependencies = [ [[package]] name = "crack-core" -version = "0.3.10" +version = "0.3.11" dependencies = [ "anyhow", "async-trait", @@ -840,7 +834,6 @@ dependencies = [ "itertools 0.13.0", "lazy_static", "lyric_finder", - "mockall", "once_cell", "poise", "prometheus", @@ -906,7 +899,7 @@ dependencies = [ [[package]] name = "cracktunes" -version = "0.3.10" +version = "0.3.11" dependencies = [ "config-file", "crack-core", @@ -1298,12 +1291,6 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" -[[package]] -name = "downcast" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" - [[package]] name = "dtoa" version = "1.0.9" @@ -1519,12 +1506,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fragile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - [[package]] name = "from_map" version = "0.1.0" @@ -2594,33 +2575,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "mockall" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43766c2b5203b10de348ffe19f7e54564b64f3d6018ff7648d1e2d6d3a0f0a48" -dependencies = [ - "cfg-if", - "downcast", - "fragile", - "lazy_static", - "mockall_derive", - "predicates", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cbce79ec385a1d4f54baa90a76401eb15d9cab93685f62e7e9f942aa00ae2" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 2.0.72", -] - [[package]] name = "multer" version = "2.1.0" @@ -3249,32 +3203,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" -[[package]] -name = "predicates" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" -dependencies = [ - "anstyle", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" - -[[package]] -name = "predicates-tree" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" -dependencies = [ - "predicates-core", - "termtree", -] - [[package]] name = "primal-check" version = "0.3.4" @@ -5317,12 +5245,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "termtree" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" - [[package]] name = "thin-vec" version = "0.2.13" diff --git a/crack-core/Cargo.toml b/crack-core/Cargo.toml index 3dd585ef3..b936ccb78 100644 --- a/crack-core/Cargo.toml +++ b/crack-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crack-core" -version = "0.3.10" +version = "0.3.11" authors = ["Cycle Five "] edition = "2021" description = "Core module for the cracking smoking, discord-music-bot Cracktunes." @@ -94,7 +94,6 @@ features = ["client-reqwest", "reqwest-rustls-tls"] [dev-dependencies] ctor = "0.2" -mockall = "0.12" tungstenite = "0.23" async-tungstenite = "0.26" sqlx = { version = "0.7", features = [ diff --git a/crack-core/src/utils.rs b/crack-core/src/utils.rs index de361b46f..2e7b0fde9 100644 --- a/crack-core/src/utils.rs +++ b/crack-core/src/utils.rs @@ -150,7 +150,6 @@ pub async fn send_now_playing( ) -> Result { use crate::messaging::interface::create_now_playing_embed_metadata; - tracing::warn!("locking mutex"); let mutex_guard = call.lock().await; tracing::warn!("mutex locked"); let msg: CreateMessage = match mutex_guard.queue().current() { diff --git a/cracktunes/Cargo.toml b/cracktunes/Cargo.toml index 714a66020..3791cca41 100644 --- a/cracktunes/Cargo.toml +++ b/cracktunes/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["Cycle Five "] name = "cracktunes" -version = "0.3.10" +version = "0.3.11" description = "Cracktunes is a hassle-free, highly performant, host-it-yourself, cracking smoking, discord-music-bot." publish = true edition = "2021" From 33958f5f8806c0e30c31565310581202cf88adf9 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Tue, 30 Jul 2024 13:57:45 +0000 Subject: [PATCH 02/95] move send_now_playing --- crack-core/src/handlers/track_end.rs | 4 +-- crack-core/src/messaging/interface.rs | 42 ++++++++++++++++++++++++ crack-core/src/poise_ext.rs | 3 +- crack-core/src/utils.rs | 47 +-------------------------- 4 files changed, 47 insertions(+), 49 deletions(-) diff --git a/crack-core/src/handlers/track_end.rs b/crack-core/src/handlers/track_end.rs index 837747427..8155b8aef 100644 --- a/crack-core/src/handlers/track_end.rs +++ b/crack-core/src/handlers/track_end.rs @@ -6,11 +6,11 @@ use crate::{ errors::{verify, CrackedError}, guild::operations::GuildSettingsOperations, messaging::{ - interface::{create_nav_btns, create_queue_embed}, + interface::{create_nav_btns, create_queue_embed, send_now_playing}, messages::SPOTIFY_AUTH_FAILED, }, sources::spotify::{Spotify, SPOTIFY}, - utils::{calculate_num_pages, forget_queue_message, send_now_playing}, + utils::{calculate_num_pages, forget_queue_message}, CrackedResult, Data, //, Error, }; diff --git a/crack-core/src/messaging/interface.rs b/crack-core/src/messaging/interface.rs index 921a295e6..14b8ed92f 100644 --- a/crack-core/src/messaging/interface.rs +++ b/crack-core/src/messaging/interface.rs @@ -208,6 +208,48 @@ pub async fn create_queue_embed(tracks: &[TrackHandle], page: usize) -> CreateEm // This is probably the message that the use sees // // the most from the bot. // +use serenity::all::Http; +use songbird::Call; +use std::sync::Arc; +use tokio::sync::Mutex; + +/// Send the current track information as an ebmed to the given channel. +#[cfg(not(tarpaulin_include))] +pub async fn send_now_playing( + channel: ChannelId, + http: Arc, + call: Arc>, + cur_position: Option, + metadata: Option, +) -> Result { + let mutex_guard = call.lock().await; + let msg: CreateMessage = match mutex_guard.queue().current() { + Some(track_handle) => { + drop(mutex_guard); + let requesting_user = get_requesting_user(&track_handle).await; + let embed = if let Some(metadata2) = metadata { + create_now_playing_embed_metadata( + requesting_user.ok(), + cur_position, + MyAuxMetadata(metadata2), + ) + } else { + create_now_playing_embed(&track_handle).await + }; + CreateMessage::new().embed(embed) + }, + None => { + drop(mutex_guard); + CreateMessage::new().content("Nothing playing") + }, + }; + tracing::warn!("sending message: {:?}", msg); + channel + .send_message(Arc::clone(&http), msg) + .await + .map_err(|e| e.into()) +} + /// Creates an embed from a CrackedMessage and sends it as an embed. pub fn create_now_playing_embed_metadata( requesting_user: Option, diff --git a/crack-core/src/poise_ext.rs b/crack-core/src/poise_ext.rs index d2cc2ef9d..e57176008 100644 --- a/crack-core/src/poise_ext.rs +++ b/crack-core/src/poise_ext.rs @@ -22,6 +22,7 @@ use songbird::Call; use std::{future::Future, sync::Arc}; use tokio::sync::Mutex; +use crate::messaging::interface; /// TODO: Separate all the messaging related functions from the other extensions and /// put them into this extension. #[allow(dead_code)] @@ -89,7 +90,7 @@ impl MessageInterfaceCtxExt for crate::Context<'_> { ) -> Result { let call = self.get_call().await?; // We don't add this message to the cache because we shouldn't delete it. - utils::send_now_playing( + interface::send_now_playing( chan_id, self.serenity_context().http.clone(), call, diff --git a/crack-core/src/utils.rs b/crack-core/src/utils.rs index 2e7b0fde9..d528608f3 100644 --- a/crack-core/src/utils.rs +++ b/crack-core/src/utils.rs @@ -7,7 +7,7 @@ use crate::{ commands::{music::doplay::RequestingUser, music::play_utils::QueryType, music::MyAuxMetadata}, db::Playlist, messaging::{ - interface::{create_nav_btns, create_now_playing_embed}, + interface::create_nav_btns, message::CrackedMessage, messages::{ INVITE_LINK_TEXT_SHORT, INVITE_URL, PLAYLISTS, PLAYLIST_EMPTY, PLAYLIST_LIST_EMPTY, @@ -26,7 +26,6 @@ use ::serenity::{ CreateInteractionResponseMessage, EditInteractionResponse, EditMessage, }, futures::StreamExt, - http::Http, model::channel::Message, }; use poise::{ @@ -37,7 +36,6 @@ use poise::{ }; #[allow(deprecated)] use serenity::MessageInteraction; -use songbird::Call; use songbird::{input::AuxMetadata, tracks::TrackHandle}; use std::sync::Arc; use std::{ @@ -47,7 +45,6 @@ use std::{ ops::Add, time::Duration, }; -use tokio::sync::Mutex; use tokio::sync::RwLock; use url::Url; @@ -139,48 +136,6 @@ pub async fn edit_response_text( edit_embed_response(http, interaction, embed).await } -/// Send the current track information as an ebmed to the given channel. -#[cfg(not(tarpaulin_include))] -pub async fn send_now_playing( - channel: ChannelId, - http: Arc, - call: Arc>, - cur_position: Option, - metadata: Option, -) -> Result { - use crate::messaging::interface::create_now_playing_embed_metadata; - - let mutex_guard = call.lock().await; - tracing::warn!("mutex locked"); - let msg: CreateMessage = match mutex_guard.queue().current() { - Some(track_handle) => { - tracing::warn!("track handle found, dropping mutex guard"); - drop(mutex_guard); - let requesting_user = get_requesting_user(&track_handle).await; - let embed = if let Some(metadata2) = metadata { - create_now_playing_embed_metadata( - requesting_user.ok(), - cur_position, - MyAuxMetadata(metadata2), - ) - } else { - create_now_playing_embed(&track_handle).await - }; - CreateMessage::new().embed(embed) - }, - None => { - tracing::warn!("track handle not found, dropping mutex guard"); - drop(mutex_guard); - CreateMessage::new().content("Nothing playing") - }, - }; - tracing::warn!("sending message: {:?}", msg); - channel - .send_message(Arc::clone(&http), msg) - .await - .map_err(|e| e.into()) -} - #[cfg(not(tarpaulin_include))] /// Interactive youtube search and selection. pub async fn yt_search_select( From 030cdcfa872b2bfee0bdb9309666765063b3c998 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Wed, 31 Jul 2024 00:47:00 +0000 Subject: [PATCH 03/95] refactor get_track_metadata --- Cargo.lock | 1 + crack-core/Cargo.toml | 1 + crack-core/src/commands/music/doplay.rs | 38 +++++- .../src/commands/music/play_utils/query.rs | 123 ++++++++---------- crack-core/src/utils.rs | 2 + 5 files changed, 94 insertions(+), 71 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9483788b5..ef2c6a840 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -830,6 +830,7 @@ dependencies = [ "ctor", "dashmap 6.0.1", "either", + "futures", "indexmap", "itertools 0.13.0", "lazy_static", diff --git a/crack-core/Cargo.toml b/crack-core/Cargo.toml index b936ccb78..85f4f75f4 100644 --- a/crack-core/Cargo.toml +++ b/crack-core/Cargo.toml @@ -56,6 +56,7 @@ strsim = "0.11" itertools = "0.13" dashmap = "6.0" indexmap = "2.2" +futures = "0.3" crack-gpt = { path = "../crack-gpt", optional = true } crack-osint = { path = "../crack-osint", optional = true } diff --git a/crack-core/src/commands/music/doplay.rs b/crack-core/src/commands/music/doplay.rs index c9cb0aafd..58f7e1b5d 100644 --- a/crack-core/src/commands/music/doplay.rs +++ b/crack-core/src/commands/music/doplay.rs @@ -543,6 +543,42 @@ impl From<&SpotifyTrack> for MyAuxMetadata { } } +impl From<&SearchResult> for MyAuxMetadata { + fn from(search_result: &SearchResult) -> Self { + let mut metadata = AuxMetadata::default(); + match search_result.clone() { + SearchResult::Video(video) => { + metadata.track = Some(video.title.clone()); + metadata.artist = None; + metadata.album = None; + metadata.date = video.uploaded_at.clone(); + + metadata.channels = Some(2); + metadata.channel = Some(video.channel.name); + metadata.duration = Some(Duration::from_millis(video.duration)); + metadata.sample_rate = Some(48000); + metadata.source_url = Some(video.url); + metadata.title = Some(video.title); + metadata.thumbnail = Some(video.thumbnails.first().unwrap().url.clone()); + }, + SearchResult::Playlist(playlist) => { + metadata.title = Some(playlist.name); + metadata.source_url = Some(playlist.url); + metadata.duration = None; + metadata.thumbnail = Some(playlist.thumbnails.first().unwrap().url.clone()); + }, + _ => {}, + }; + MyAuxMetadata(metadata) + } +} + +impl From for MyAuxMetadata { + fn from(search_result: SearchResult) -> Self { + MyAuxMetadata::from(&search_result) + } +} + /// Build an embed for the cure async fn build_queued_embed( author_title: &str, @@ -586,7 +622,7 @@ async fn build_queued_embed( } use crate::sources::rusty_ytdl::RequestOptionsBuilder; -use rusty_ytdl::search::YouTube; +use rusty_ytdl::search::{SearchResult, YouTube}; /// Add tracks to the queue from aux_metadata. #[cfg(not(tarpaulin_include))] pub async fn queue_aux_metadata( diff --git a/crack-core/src/commands/music/play_utils/query.rs b/crack-core/src/commands/music/play_utils/query.rs index 9ffaf7ec7..0fc2d4556 100644 --- a/crack-core/src/commands/music/play_utils/query.rs +++ b/crack-core/src/commands/music/play_utils/query.rs @@ -24,9 +24,12 @@ use crate::{ }; use ::serenity::all::{Attachment, CreateAttachment, CreateMessage}; use colored::Colorize; +use futures::future; +use itertools::Itertools; use poise::serenity_prelude as serenity; use rusty_ytdl::search::YouTube; use rusty_ytdl::search::{Playlist, SearchOptions, SearchType}; +use rusty_ytdl::{RequestOptions, Video, VideoOptions}; use songbird::{ input::{AuxMetadata, Compose as _, HttpRequest, Input as SongbirdInput, YoutubeDl}, tracks::TrackHandle, @@ -502,98 +505,78 @@ impl QueryType { QueryType::YoutubeSearch(query) => { tracing::error!("In YoutubeSearch"); let search_options = SearchOptions { - limit: 10, + limit: 5, search_type: SearchType::All, ..Default::default() }; - let res = ytclient.search(query, Some(&search_options)).await?; - let mut metadata = Vec::with_capacity(res.len()); - for r in res { - metadata.push(MyAuxMetadata( - RustyYoutubeClient::search_result_to_aux_metadata(&r), - )); - } - Ok(metadata) - // let mut ytdl = YoutubeDl::new_search(client, query.clone()); - // let mut res = Vec::new(); - // let asdf = ytdl.search(None).await?; - // for metadata in asdf { - // let my_metadata = MyAuxMetadata(metadata); - // res.push(my_metadata); - // } - // Ok(res) - }, - QueryType::VideoLink(query) => { - // tracing::warn!("In VideoLink"); - // let vid_info = RustyYoutubeClient::get_video_info(query.clone()).await?; - // let metadata = RustyYoutubeClient::video_info_to_aux_metadata(&vid_info); - let search = get_rusty_search(reqclient.clone(), query.clone()).await?; - let metadata = search - .clone() - .metadata + let search_results = ytclient.search(query, Some(&search_options)).await?; + Ok(search_results .into_iter() - .map(MyAuxMetadata) - .collect::>(); - Ok(metadata) - }, - QueryType::Keywords(query) => { - tracing::warn!("In Keywords"); - // // get_rusty_search(client.clone(), query.clone()).await - // let mut ytdl = YoutubeDl::new_search(client, query.clone()); - let res = ytclient.search_one(query.clone(), None).await?; - // let metadata = ytdl.aux_metadata().await?; - let res = res.unwrap(); - let my_metadata = RustyYoutubeClient::search_result_to_aux_metadata(&res); - let my_metadata = MyAuxMetadata(my_metadata); - // Ok((ytdl.into(), vec![my_metadata])) - Ok(vec![my_metadata]) + .map(MyAuxMetadata::from) + .collect_vec()) }, + QueryType::VideoLink(query) => { + let video_options = VideoOptions { + request_options: RequestOptions { + client: Some(reqclient.clone()), + ..Default::default() + }, + ..Default::default() + }; + let video = Video::new_with_options(query.clone(), video_options)?; + let video_info = video.get_info().await?; + let metadata = RustyYoutubeClient::video_info_to_aux_metadata(&video_info); + + Ok(vec![MyAuxMetadata(metadata)]) + }, + QueryType::Keywords(query) => ytclient + .search_one(query.clone(), None) + .await? + .map(MyAuxMetadata::from) + .map(|metadata| vec![metadata]) + .ok_or(CrackedError::Other("No search results found!")), QueryType::File(_file) => { - Ok(vec![]) - // tracing::warn!("In File"); - // Ok(( - // HttpRequest::new(client, file.url.to_owned()).into(), - // vec![MyAuxMetadata::default()], - // )) + // FIXME: Maybe try to parse some metadata from the file? + Ok(vec![MyAuxMetadata::default()]) }, QueryType::NewYoutubeDl(_data) => { - // let (ytdl, aux_metadata) = data.clone(); - // Ok((ytdl.into(), vec![MyAuxMetadata(aux_metadata)])) + // FIXME: Maybe just throw an error? This doesn't really make since because it's a different yt client... Ok(vec![]) }, QueryType::PlaylistLink(url) => { + // FIXME: What limit should we use? let search_options = SearchOptions { - limit: 100, + limit: 30, search_type: SearchType::Playlist, ..Default::default() }; - let res = ytclient.search(url, Some(&search_options)).await?; - let mut metadata = Vec::with_capacity(res.len()); - for r in res { - metadata.push(MyAuxMetadata( - RustyYoutubeClient::search_result_to_aux_metadata(&r), - )); - } - Ok(metadata) - // let ytdl = YoutubeDl::new(client.clone(), url.clone()); - // tracing::warn!("ytdl: {:?}", ytdl); - // Ok((ytdl.into(), metadata)) + let search_results = ytclient.search(url, Some(&search_options)).await?; + Ok(search_results + .into_iter() + .map(MyAuxMetadata::from) + .collect_vec()) }, QueryType::SpotifyTracks(tracks) => { let keywords_list = tracks .iter() - .map(|x| x.build_query()) - .collect::>(); - let mut metadatas = Vec::with_capacity(keywords_list.len()); - for keyword in keywords_list { - let res = ytclient.search_one(keyword, None).await?.unwrap(); - let my_metadata = RustyYoutubeClient::search_result_to_aux_metadata(&res); - let my_metadata = MyAuxMetadata(my_metadata); - metadatas.push(my_metadata); - } + .map(|x| ytclient.search_one(x.build_query(), None)); + let metadatas = future::join_all(keywords_list) + .await + .into_iter() + .filter_map_ok(|x| x.map(MyAuxMetadata::from)) + .flatten() + .collect_vec(); Ok(metadatas) + + // let mut metadatas = Vec::with_capacity(keywords_list.len()); + // for keyword in keywords_list { + // let res = ytclient.search_one(keyword, None).await?.unwrap(); + // let my_metadata = RustyYoutubeClient::search_result_to_aux_metadata(&res); + // let my_metadata = MyAuxMetadata(my_metadata); + // metadatas.push(my_metadata); + // } }, QueryType::KeywordList(keywords_list) => { let mut metadatas = Vec::with_capacity(keywords_list.len()); diff --git a/crack-core/src/utils.rs b/crack-core/src/utils.rs index d528608f3..ac113b9b5 100644 --- a/crack-core/src/utils.rs +++ b/crack-core/src/utils.rs @@ -115,6 +115,7 @@ pub async fn send_nonembed_reply( Ok(handle.into_message().await?) } +/// Edit an embed response with a CrackedMessage. pub async fn edit_response_poise( ctx: &CrackContext<'_>, message: CrackedMessage, @@ -127,6 +128,7 @@ pub async fn edit_response_poise( } } +/// Edit an embed response from a CommandOrMessageInteraction with a str. pub async fn edit_response_text( http: &impl CacheHttp, interaction: &CommandOrMessageInteraction, From dd8d46c3bb119146421067573a5526b8ce48fe97 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Wed, 31 Jul 2024 02:37:30 +0000 Subject: [PATCH 04/95] update opentelemetry --- Cargo.lock | 23 +++++++---------------- cracktunes/Cargo.toml | 4 ++-- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef2c6a840..9efec6330 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2811,9 +2811,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "opentelemetry" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b69a91d4893e713e06f724597ad630f1fa76057a5e1026c0ca67054a9032a76" +checksum = "4c365a63eec4f55b7efeceb724f1336f26a9cf3427b70e59e2cd2a5b947fba96" dependencies = [ "futures-core", "futures-sink", @@ -2825,20 +2825,20 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" -version = "0.23.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae312d58eaa90a82d2e627fd86e075cf5230b3f11794e2ed74199ebbe572d4fd" +checksum = "692eac490ec80f24a17828d49b40b60f5aeaccdfe6a503f939713afd22bc28df" dependencies = [ "async-trait", "futures-channel", "futures-executor", "futures-util", - "lazy_static", + "glob", "once_cell", "opentelemetry", - "ordered-float 4.2.1", "percent-encoding", "rand", + "serde_json", "thiserror", ] @@ -2851,15 +2851,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-float" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ff2cf528c6c03d9ed653d6c4ce1dc0582dc4af309790ad92f07c1cd551b0be" -dependencies = [ - "num-traits", -] - [[package]] name = "overload" version = "0.1.1" @@ -4238,7 +4229,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" dependencies = [ - "ordered-float 2.10.1", + "ordered-float", "serde", ] diff --git a/cracktunes/Cargo.toml b/cracktunes/Cargo.toml index 3791cca41..54a50f4b3 100644 --- a/cracktunes/Cargo.toml +++ b/cracktunes/Cargo.toml @@ -64,8 +64,8 @@ prometheus = { version = "0.13", features = ["process"], optional = true } warp = { version = "0.3", default-features = false, features = [ "tls", ], optional = true } -opentelemetry = { version = "0.23", optional = true } -opentelemetry_sdk = { version = "0.23", optional = true } +opentelemetry = { version = "0.24", optional = true } +opentelemetry_sdk = { version = "0.24", optional = true } tracing-bunyan-formatter = { version = "0.3", optional = true } crack-core = { workspace = true } From cf7f3fc8581e7ab29b64057031da292b980a8f13 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Wed, 31 Jul 2024 08:46:43 +0000 Subject: [PATCH 05/95] callgraphs --- docs/callgraphs.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 docs/callgraphs.md diff --git a/docs/callgraphs.md b/docs/callgraphs.md new file mode 100644 index 000000000..26abc1b46 --- /dev/null +++ b/docs/callgraphs.md @@ -0,0 +1,14 @@ +These are callgraphs I generated to aide in documenting CrackTunes. +![crack-bf](https://cracktun.es/CallGraphs/callgraph-mod-crack-bf.svg) +![crack-core](https://cracktun.es/CallGraphs/callgraph-mod-crack-core.svg) +![crack-core-comamnds](https://cracktun.es/CallGraphs/callgraph-mod-crack-core-commands.svg) +![crack-core-db](https://cracktun.es/CallGraphs/callgraph-mod-crack-core-db.svg) +![crack-core-guild](https://cracktun.es/CallGraphs/callgraph-mod-crack-core-guild.svg) +![crack-core-handlers](https://cracktun.es/CallGraphs/callgraph-mod-crack-core-handlers.svg) +![crack-core-messaging](https://cracktun.es/CallGraphs/callgraph-mod-crack-core-messaging.svg) +![crack-core-sources](https://cracktun.es/CallGraphs/callgraph-mod-crack-core-sources.svg) +![crack-core-test](https://cracktun.es/CallGraphs/callgraph-mod-crack-core-test.svg) +![crack-gpt](https://cracktun.es/CallGraphs/callgraph-mod-crack-gpt.svg) +![crack-osint](https://cracktun.es/CallGraphs/callgraph-mod-crack-osint.svg) +![crack-voting](https://cracktun.es/CallGraphs/callgraph-mod-crack-voting.svg) +![cracktunes](https://cracktun.es/CallGraphs/callgraph-mod-cracktunes.svg) \ No newline at end of file From e3ffccc69da937c1fc16b7f8eead8a7e8bbe5a4f Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Thu, 1 Aug 2024 21:29:14 +0000 Subject: [PATCH 06/95] cleanup send now playing --- crack-core/src/commands/music/doplay.rs | 18 +++++++ crack-core/src/commands/music/grab.rs | 2 +- .../src/commands/music/play_utils/queue.rs | 52 ++++++++----------- crack-core/src/db/worker_pool.rs | 18 ++++--- crack-core/src/handlers/track_end.rs | 19 ++++--- crack-core/src/messaging/interface.rs | 47 ++++++----------- crack-core/src/poise_ext.rs | 16 +++--- 7 files changed, 88 insertions(+), 84 deletions(-) diff --git a/crack-core/src/commands/music/doplay.rs b/crack-core/src/commands/music/doplay.rs index 58f7e1b5d..d9a77f7af 100644 --- a/crack-core/src/commands/music/doplay.rs +++ b/crack-core/src/commands/music/doplay.rs @@ -459,6 +459,16 @@ pub enum RequestingUser { UserId(UserId), } +/// Convert `[Option]` to `[RequestingUser]`. +impl From> for RequestingUser { + fn from(user_id: Option) -> Self { + match user_id { + Some(user_id) => RequestingUser::UserId(user_id), + None => RequestingUser::default(), + } + } +} + /// We implement TypeMapKey for RequestingUser. impl TypeMapKey for RequestingUser { type Value = RequestingUser; @@ -482,6 +492,14 @@ impl TypeMapKey for MyAuxMetadata { type Value = MyAuxMetadata; } +/// Implement From for MyAuxMetadata. +impl From for AuxMetadata { + fn from(metadata: MyAuxMetadata) -> Self { + let MyAuxMetadata(metadata) = metadata; + metadata + } +} + /// Implement Default for MyAuxMetadata. impl Default for MyAuxMetadata { fn default() -> Self { diff --git a/crack-core/src/commands/music/grab.rs b/crack-core/src/commands/music/grab.rs index 92997ac27..5d1aaafc5 100644 --- a/crack-core/src/commands/music/grab.rs +++ b/crack-core/src/commands/music/grab.rs @@ -28,7 +28,7 @@ pub async fn grab( async fn grab_internal(ctx: Context<'_>) -> Result<(), Error> { let chan_id = ctx.author().create_dm_channel(&ctx).await?.id; - ctx.send_now_playing(chan_id, None, None).await?; + ctx.send_now_playing(chan_id).await?; ctx.send_grabbed_notice().await?; diff --git a/crack-core/src/commands/music/play_utils/queue.rs b/crack-core/src/commands/music/play_utils/queue.rs index 1622f0484..f69ab97f5 100644 --- a/crack-core/src/commands/music/play_utils/queue.rs +++ b/crack-core/src/commands/music/play_utils/queue.rs @@ -8,20 +8,16 @@ use crate::{ Context as CrackContext, Error, }; use serenity::all::{CreateEmbed, EditMessage, Message, UserId}; -use songbird::{ - input::Input as SongbirdInput, - tracks::{Track, TrackHandle}, - Call, -}; -use std::sync::Arc; +use songbird::{input::Input as SongbirdInput, tracks::TrackHandle, Call}; +use std::{pin::Pin, sync::Arc}; use tokio::sync::Mutex; -/// Data structure for a track that is ready to be played. +#[derive(Clone, Debug, Default)] pub struct TrackReadyData { - pub track: Track, + pub source: Box, pub metadata: MyAuxMetadata, - pub user_id: UserId, - pub username: String, + pub user_id: Option, + pub username: Option, } /// Takes a query and returns a track that is ready to be played, along with relevant metadata. @@ -34,13 +30,10 @@ pub async fn ready_query2(query_type: QueryType) -> Result, query_type: QueryType, ) -> Result { - let user_id = ctx.author().id; + let user_id = Some(ctx.author().id); let (source, metadata_vec): (SongbirdInput, Vec) = query_type.get_track_source_and_metadata(None).await?; let metadata = match metadata_vec.first() { @@ -58,12 +51,11 @@ pub async fn ready_query( return Err(CrackedError::Other("metadata.first() failed")); }, }; - let track: Track = source.into(); - let username = ctx.user_id_to_username_or_default(user_id); + let username = user_id.map(|x| ctx.user_id_to_username_or_default(x)); Ok(TrackReadyData { - track, + source: Box::pin(source), metadata, user_id, username, @@ -76,7 +68,7 @@ pub async fn queue_track_ready_front( ready_track: TrackReadyData, ) -> Result, CrackedError> { let mut handler = call.lock().await; - let track_handle = handler.enqueue(ready_track.track).await; + let track_handle = handler.enqueue_input(ready_track.source).await; let new_q = handler.queue().current_queue(); // Zeroth index: Currently playing track // First index: Current next track @@ -92,7 +84,9 @@ pub async fn queue_track_ready_front( drop(handler); let mut map = track_handle.typemap().write().await; map.insert::(ready_track.metadata.clone()); - map.insert::(RequestingUser::UserId(ready_track.user_id)); + map.insert::(RequestingUser::UserId( + ready_track.user_id.unwrap_or(UserId::new(1)), + )); drop(map); Ok(new_q) } @@ -103,12 +97,12 @@ pub async fn queue_track_ready_back( ready_track: TrackReadyData, ) -> Result, CrackedError> { let mut handler = call.lock().await; - let track_handle = handler.enqueue(ready_track.track).await; + let track_handle = handler.enqueue_input(ready_track.source).await; let new_q = handler.queue().current_queue(); drop(handler); let mut map = track_handle.typemap().write().await; map.insert::(ready_track.metadata.clone()); - map.insert::(RequestingUser::UserId(ready_track.user_id)); + map.insert::(RequestingUser::from(ready_track.user_id)); Ok(new_q) } @@ -162,15 +156,15 @@ pub async fn queue_ready_track_list( let mut handler = call.lock().await; for (idx, ready_track) in tracks.into_iter().enumerate() { let TrackReadyData { - track, + source, metadata, user_id, .. } = ready_track; - let track_handle = handler.enqueue(track).await; + let track_handle = handler.enqueue_input(*source).await; let mut map = track_handle.typemap().write().await; map.insert::(metadata); - map.insert::(RequestingUser::UserId(user_id)); + map.insert::(RequestingUser::from(user_id)); if mode == Mode::Next { handler.queue().modify_queue(|queue| { let back = queue.pop_back().unwrap(); @@ -272,15 +266,15 @@ pub async fn queue_query_list_offset<'a>( let mut handler = call.lock().await; for (idx, ready_track) in tracks.into_iter().enumerate() { - let track = ready_track.track; + let track = ready_track.source; let metadata = ready_track.metadata; let user_id = ready_track.user_id; // let mut handler = call.lock().await; - let track_handle = handler.enqueue(track).await; + let track_handle = handler.enqueue_input(*track).await; let mut map = track_handle.typemap().write().await; map.insert::(metadata); - map.insert::(RequestingUser::UserId(user_id)); + map.insert::(RequestingUser::from(user_id)); handler.queue().modify_queue(|q| { let back = q.pop_back().unwrap(); q.insert(idx + offset, back); diff --git a/crack-core/src/db/worker_pool.rs b/crack-core/src/db/worker_pool.rs index dd04ed083..e6f77dc94 100644 --- a/crack-core/src/db/worker_pool.rs +++ b/crack-core/src/db/worker_pool.rs @@ -16,8 +16,8 @@ const CHANNEL_BUF_SIZE: usize = 1024; #[derive(Debug, Clone)] pub struct MetadataMsg { pub aux_metadata: AuxMetadata, - pub user_id: UserId, - pub username: String, + pub user_id: Option, + pub username: Option, pub guild_id: GuildId, pub channel_id: ChannelId, } @@ -65,7 +65,13 @@ pub async fn write_metadata_pg( }, }; - match User::insert_or_update_user(database_pool, user_id.get() as i64, username).await { + match User::insert_or_update_user( + database_pool, + user_id.map(|x| x.get() as i64).unwrap_or(1), + username.unwrap_or_default(), + ) + .await + { Ok(_) => { tracing::info!("Users::insert_or_update"); }, @@ -75,7 +81,7 @@ pub async fn write_metadata_pg( }; match PlayLog::create( database_pool, - user_id.get() as i64, + user_id.map(|x| x.get() as i64).unwrap_or(1), guild_id.get() as i64, updated_metadata.id as i64, ) @@ -129,8 +135,8 @@ mod test { source_url: Some(url.clone()), ..Default::default() }, - user_id: UserId::new(100), - username: "test".to_string(), + user_id: Some(UserId::new(100)), + username: Some("test".to_string()), guild_id: GuildId::new(1), channel_id: ChannelId::new(1), }; diff --git a/crack-core/src/handlers/track_end.rs b/crack-core/src/handlers/track_end.rs index 8155b8aef..8894fac52 100644 --- a/crack-core/src/handlers/track_end.rs +++ b/crack-core/src/handlers/track_end.rs @@ -1,7 +1,5 @@ -use crate::commands::play_utils::queue_track_ready_front; -use crate::commands::play_utils::ready_query2; use crate::{ - commands::{forget_skip_votes, play_utils::QueryType, MyAuxMetadata}, + commands::{forget_skip_votes, play_utils::QueryType}, db::PgPoolExtPlayLog, errors::{verify, CrackedError}, guild::operations::GuildSettingsOperations, @@ -38,6 +36,8 @@ pub struct TrackEndHandler { pub call: Arc>, } +use crate::commands::play_utils::queue_track_ready_front; +use crate::commands::play_utils::ready_query2; pub struct ModifyQueueHandler { pub guild_id: GuildId, pub data: Data, @@ -121,23 +121,22 @@ impl EventHandler for TrackEndHandler { }, }; let track_ready = ready_query2(query).await.ok()?; - let MyAuxMetadata(metadata) = &track_ready.metadata; - let metadata = Some(metadata.clone()); + // let MyAuxMetadata(metadata) = &track_ready.metadata; + // let metadata = Some(metadata.clone()); let track = queue_track_ready_front(&self.call, track_ready) .await .ok()?; let chan_id = channel; - let track_state = track.first().as_ref()?.get_info().await; - let cur_position = track_state.map(|x| x.position).ok(); + //let track_state = track.first().as_ref()?.get_info().await; + //let cur_position = track_state.map(|x| x.position).ok(); match send_now_playing( chan_id, self.http.clone(), - self.call.clone(), - cur_position, - metadata, + self.call.clone(), // cur_position, + // metadata, ) .await { diff --git a/crack-core/src/messaging/interface.rs b/crack-core/src/messaging/interface.rs index 14b8ed92f..a36d5bf1f 100644 --- a/crack-core/src/messaging/interface.rs +++ b/crack-core/src/messaging/interface.rs @@ -219,29 +219,16 @@ pub async fn send_now_playing( channel: ChannelId, http: Arc, call: Arc>, - cur_position: Option, - metadata: Option, + //cur_position: Option, + //metadata: Option, ) -> Result { let mutex_guard = call.lock().await; let msg: CreateMessage = match mutex_guard.queue().current() { Some(track_handle) => { - drop(mutex_guard); - let requesting_user = get_requesting_user(&track_handle).await; - let embed = if let Some(metadata2) = metadata { - create_now_playing_embed_metadata( - requesting_user.ok(), - cur_position, - MyAuxMetadata(metadata2), - ) - } else { - create_now_playing_embed(&track_handle).await - }; + let embed = create_now_playing_embed(&track_handle).await; CreateMessage::new().embed(embed) }, - None => { - drop(mutex_guard); - CreateMessage::new().content("Nothing playing") - }, + None => CreateMessage::new().content("Nothing playing"), }; tracing::warn!("sending message: {:?}", msg); channel @@ -251,13 +238,13 @@ pub async fn send_now_playing( } /// Creates an embed from a CrackedMessage and sends it as an embed. -pub fn create_now_playing_embed_metadata( +pub fn build_now_playing_embed_metadata( requesting_user: Option, cur_position: Option, metadata: MyAuxMetadata, ) -> CreateEmbed { let MyAuxMetadata(metadata) = metadata; - tracing::warn!("metadata: {:?}", metadata); + //tracing::warn!("metadata: {:?}", metadata); let title = metadata.title.clone().unwrap_or_default(); @@ -275,7 +262,7 @@ pub fn create_now_playing_embed_metadata( true, ), None => { - tracing::warn!("No user id"); + tracing::info!("No user id, we're autoplaying"); (REQUESTED_BY, ">>> N/A".to_string(), true) }, }; @@ -303,19 +290,19 @@ pub fn create_now_playing_embed_metadata( .footer(CreateEmbedFooter::new(footer_text).icon_url(footer_icon_url)) } -pub async fn track_handle_to_metadata( - track: &TrackHandle, -) -> Result<(Option, Option, MyAuxMetadata), CrackedError> { - let metadata = get_track_handle_metadata(track).await; - let requesting_user = get_requesting_user(track).await.ok(); - let duration = Some(track.get_info().await.unwrap().position); - Ok((requesting_user, duration, MyAuxMetadata(metadata))) -} +// pub async fn track_handle_to_metadata( +// track: &TrackHandle, +// ) -> Result<(Option, Option, MyAuxMetadata), CrackedError> { +// Ok((requesting_user, duration, MyAuxMetadata(metadata))) +// } /// Creates a now playing embed for the given track. pub async fn create_now_playing_embed(track: &TrackHandle) -> CreateEmbed { - let (requesting_user, duration, metadata) = track_handle_to_metadata(track).await.unwrap(); - create_now_playing_embed_metadata(requesting_user, duration, metadata) + // let (requesting_user, duration, metadata) = track_handle_to_metadata(track).await.unwrap(); + let metadata = get_track_handle_metadata(track).await; + let requesting_user = get_requesting_user(track).await.ok(); + let duration = Some(track.get_info().await.unwrap().position); + build_now_playing_embed_metadata(requesting_user, duration, MyAuxMetadata(metadata)) } // ---------------------- Lyricsd ---------------------------- // diff --git a/crack-core/src/poise_ext.rs b/crack-core/src/poise_ext.rs index e57176008..b62128de2 100644 --- a/crack-core/src/poise_ext.rs +++ b/crack-core/src/poise_ext.rs @@ -49,8 +49,8 @@ pub trait MessageInterfaceCtxExt { fn send_now_playing( &self, chan_id: ChannelId, - cur_pos: Option, - metadata: Option, + // cur_pos: Option, + // metadata: Option, ) -> impl Future>; } @@ -85,8 +85,8 @@ impl MessageInterfaceCtxExt for crate::Context<'_> { async fn send_now_playing( &self, chan_id: ChannelId, - cur_pos: Option, - metadata: Option, + // cur_pos: Option, + // metadata: Option, ) -> Result { let call = self.get_call().await?; // We don't add this message to the cache because we shouldn't delete it. @@ -94,8 +94,8 @@ impl MessageInterfaceCtxExt for crate::Context<'_> { chan_id, self.serenity_context().http.clone(), call, - cur_pos, - metadata, + //cur_pos, + //metadata, ) .await } @@ -195,9 +195,9 @@ impl ContextExt for crate::Context<'_> { } /// Send a message to tell the worker pool to do a db write when it feels like it. - async fn async_send_track_metadata_write_msg( + async fn async_send_track_metadata_write_msg<'_>( &self, - ready_track: &TrackReadyData, + ready_track: &'ctx TrackReadyData, ) -> CrackedResult<()> { let username = ready_track.username.clone(); let MyAuxMetadata(aux_metadata) = ready_track.metadata.clone(); From 6e1174610f8e2b19a2f4a2fc9bb7fa5184bd3774 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Fri, 2 Aug 2024 15:52:32 +0000 Subject: [PATCH 07/95] put send_reply_embed into context extension --- crack-core/src/commands/music/nowplaying.rs | 5 +- .../src/commands/music/play_utils/query.rs | 2 +- .../src/commands/music/play_utils/queue.rs | 20 ++-- crack-core/src/commands/music/voteskip.rs | 14 +-- crack-core/src/commands/music_utils.rs | 10 +- crack-core/src/commands/osint.rs | 4 +- .../src/commands/settings/set/set_premium.rs | 29 +---- crack-core/src/commands/utility/ping.rs | 4 +- crack-core/src/handlers/serenity.rs | 24 +--- crack-core/src/handlers/track_end.rs | 4 +- crack-core/src/handlers/voice_chat_stats.rs | 2 +- crack-core/src/messaging/help.rs | 1 - crack-core/src/messaging/mod.rs | 1 - crack-core/src/poise_ext.rs | 105 ++++++++++++------ crack-core/src/utils.rs | 8 -- 15 files changed, 107 insertions(+), 126 deletions(-) delete mode 100644 crack-core/src/messaging/help.rs diff --git a/crack-core/src/commands/music/nowplaying.rs b/crack-core/src/commands/music/nowplaying.rs index 0ae84eab4..f92b333ab 100644 --- a/crack-core/src/commands/music/nowplaying.rs +++ b/crack-core/src/commands/music/nowplaying.rs @@ -1,9 +1,8 @@ -use crate::poise_ext::ContextExt; +use crate::poise_ext::{ContextExt, PoiseContextExt}; use crate::{ commands::{cmd_check_music, help}, errors::CrackedError, messaging::interface::create_now_playing_embed, - utils::send_embed_response_poise, Context, Error, }; @@ -40,6 +39,6 @@ pub async fn nowplaying_internal(ctx: Context<'_>) -> Result<(), Error> { .ok_or(CrackedError::NothingPlaying)?; let embed = create_now_playing_embed(&track).await; - let _ = send_embed_response_poise(&ctx, embed).await?; + let _ = ctx.send_embed_response(embed).await?; Ok(()) } diff --git a/crack-core/src/commands/music/play_utils/query.rs b/crack-core/src/commands/music/play_utils/query.rs index 0fc2d4556..b6d2760ae 100644 --- a/crack-core/src/commands/music/play_utils/query.rs +++ b/crack-core/src/commands/music/play_utils/query.rs @@ -407,7 +407,7 @@ impl QueryType { Ok(_) => (), Err(e) => { tracing::error!("queue_track_back error: {:?}", e); - return Ok(false); + return Err(e); }, }; Ok(true) diff --git a/crack-core/src/commands/music/play_utils/queue.rs b/crack-core/src/commands/music/play_utils/queue.rs index f69ab97f5..0451a7db2 100644 --- a/crack-core/src/commands/music/play_utils/queue.rs +++ b/crack-core/src/commands/music/play_utils/queue.rs @@ -9,12 +9,13 @@ use crate::{ }; use serenity::all::{CreateEmbed, EditMessage, Message, UserId}; use songbird::{input::Input as SongbirdInput, tracks::TrackHandle, Call}; -use std::{pin::Pin, sync::Arc}; +use std::sync::Arc; use tokio::sync::Mutex; -#[derive(Clone, Debug, Default)] +//#[derive(Clone, Debug, Default)] pub struct TrackReadyData { - pub source: Box, + //pub source: Box, + pub source: SongbirdInput, pub metadata: MyAuxMetadata, pub user_id: Option, pub username: Option, @@ -31,9 +32,10 @@ pub async fn ready_query2(query_type: QueryType) -> Result(metadata); map.insert::(RequestingUser::from(user_id)); @@ -266,12 +268,12 @@ pub async fn queue_query_list_offset<'a>( let mut handler = call.lock().await; for (idx, ready_track) in tracks.into_iter().enumerate() { - let track = ready_track.source; + let input = ready_track.source; let metadata = ready_track.metadata; let user_id = ready_track.user_id; // let mut handler = call.lock().await; - let track_handle = handler.enqueue_input(*track).await; + let track_handle = handler.enqueue_input(input).await; let mut map = track_handle.typemap().write().await; map.insert::(metadata); map.insert::(RequestingUser::from(user_id)); diff --git a/crack-core/src/commands/music/voteskip.rs b/crack-core/src/commands/music/voteskip.rs index dc21f481e..a25b74a5b 100644 --- a/crack-core/src/commands/music/voteskip.rs +++ b/crack-core/src/commands/music/voteskip.rs @@ -7,8 +7,7 @@ use crate::{ errors::{verify, CrackedError}, guild::cache::GuildCacheMap, messaging::message::CrackedMessage, - poise_ext::ContextExt, - utils::send_reply_embed, + poise_ext::{ContextExt, MessageInterfaceCtxExt}, Context, Data, Error, }; use poise::serenity_prelude as serenity; @@ -92,13 +91,10 @@ async fn voteskip_internal(ctx: Context<'_>) -> Result<(), Error> { force_skip_top_track(&handler).await?; create_skip_response(ctx, &handler, 1).await } else { - send_reply_embed( - &ctx, - CrackedMessage::VoteSkip { - mention: ctx.get_user_id().mention(), - missing: skip_threshold - cache.current_skip_votes.len(), - }, - ) + ctx.send_reply_embed(CrackedMessage::VoteSkip { + mention: ctx.get_user_id().mention(), + missing: skip_threshold - cache.current_skip_votes.len(), + }) .await? .into_message() .await diff --git a/crack-core/src/commands/music_utils.rs b/crack-core/src/commands/music_utils.rs index e862a6a86..c0226eedb 100644 --- a/crack-core/src/commands/music_utils.rs +++ b/crack-core/src/commands/music_utils.rs @@ -2,7 +2,7 @@ use crate::connection::get_voice_channel_for_user; use crate::guild::operations::GuildSettingsOperations; use crate::handlers::{IdleHandler, TrackEndHandler}; use crate::messaging::message::CrackedMessage; -use crate::utils::send_reply_embed; +use crate::poise_ext::MessageInterfaceCtxExt; use crate::CrackedError; use crate::{Context, Error}; use poise::serenity_prelude::Mentionable; @@ -122,17 +122,15 @@ pub async fn do_join( let msg = CrackedMessage::Summon { mention: channel_id.mention(), }; - send_reply_embed(&ctx, msg).await?; + ctx.send_reply_embed(msg).await?; Ok(call) }, Err(err) => { // FIXME: Do something smarter here also. - //let embed = CreateEmbed::default().description(format!("{}", err)); - //send_embed_response_poise(&ctx, embed).await?; let str = err.to_string().clone(); let my_err = CrackedError::JoinChannelError(err); - let message = CrackedMessage::CrackedRed(str.clone()); - send_reply_embed(&ctx, message).await?; + let msg = CrackedMessage::CrackedRed(str.clone()); + ctx.send_reply_embed(msg).await?; Err(Box::new(my_err)) }, } diff --git a/crack-core/src/commands/osint.rs b/crack-core/src/commands/osint.rs index 99f5c1f2c..49df4a79a 100644 --- a/crack-core/src/commands/osint.rs +++ b/crack-core/src/commands/osint.rs @@ -2,7 +2,7 @@ use crate::{ commands::sub_help as help, http_utils::{CacheHttpExt, SendMessageParams}, messaging::message::CrackedMessage, - utils::send_reply_embed, + poise_ext::MessageInterfaceCtxExt, Context, Error, }; use crack_osint::{check_password_pwned, VirusTotalClient}; @@ -140,7 +140,7 @@ pub async fn checkpass(ctx: Context<'_>, password: String) -> Result<(), Error> CrackedMessage::PasswordSafe }; - send_reply_embed(&ctx, message).await?; + ctx.send_reply_embed(message).await?; Ok(()) } diff --git a/crack-core/src/commands/settings/set/set_premium.rs b/crack-core/src/commands/settings/set/set_premium.rs index 625a6fc7a..4cf74a8ec 100644 --- a/crack-core/src/commands/settings/set/set_premium.rs +++ b/crack-core/src/commands/settings/set/set_premium.rs @@ -3,39 +3,16 @@ use crate::db::GuildEntity; use crate::messaging::message::CrackedMessage; use crate::utils::send_reply; use crate::{Context, Error}; - -// /// Convenience type for readability. -// type TSGuildSettingsMap = Arc>>; - -// /// Do the actual settings of the premium status internally. -// pub async fn do_set_premium( -// guild_id: serenity::model::id::GuildId, -// guild_name: String, -// prefix: String, -// guild_settings_map: TSGuildSettingsMap, -// premium: bool, -// ) -> Result { -// let mut write_guard = guild_settings_map.write().await; -// let settings = write_guard -// .entry(guild_id) -// .and_modify(|e| { -// e.premium = premium; -// }) -// .or_insert( -// GuildSettings::new(guild_id, Some(&prefix.clone()), Some(guild_name.clone())) -// .with_premium(premium), -// ); -// Ok(settings.clone()) -// } - +use crate::poise_ext::ContextExt; use crate::guild::operations::GuildSettingsOperations; + /// Internal set premium function without #command macro. #[cfg(not(tarpaulin_include))] pub async fn set_premium_internal(ctx: Context<'_>, premium: bool) -> Result<(), CrackedError> { let guild_id = ctx.guild_id().ok_or(CrackedError::NoGuildId)?; ctx.data().set_premium(guild_id, premium).await; - let pool = ctx.data().database_pool.clone().unwrap(); + let pool = ctx.get_db_pool()?; GuildEntity::update_premium(&pool, guild_id.get() as i64, premium) .await .unwrap(); diff --git a/crack-core/src/commands/utility/ping.rs b/crack-core/src/commands/utility/ping.rs index 0d7daff50..bc67febe1 100644 --- a/crack-core/src/commands/utility/ping.rs +++ b/crack-core/src/commands/utility/ping.rs @@ -2,7 +2,7 @@ use poise::CreateReply; use serenity::all::{Color, CreateEmbed}; use crate::messaging::message::CrackedMessage; -use crate::utils::send_reply_embed; +use crate::poise_ext::MessageInterfaceCtxExt; use crate::{Context, Error}; /// Ping the bot @@ -16,7 +16,7 @@ pub async fn ping(ctx: Context<'_>) -> Result<(), Error> { #[cfg(not(tarpaulin_include))] pub async fn ping_internal(ctx: Context<'_>) -> Result<(), Error> { let start = std::time::Instant::now(); - let msg = send_reply_embed(&ctx, CrackedMessage::Pong).await?; + let msg = ctx.send_reply_embed(CrackedMessage::Pong).await?; let end = std::time::Instant::now(); let msg_str = format!("Pong! ({}ms)", (end - start).as_millis()); let edited = CreateReply::default().embed( diff --git a/crack-core/src/handlers/serenity.rs b/crack-core/src/handlers/serenity.rs index 9a0a1a5c2..b8259d1ff 100644 --- a/crack-core/src/handlers/serenity.rs +++ b/crack-core/src/handlers/serenity.rs @@ -194,12 +194,15 @@ impl EventHandler for SerenityHandler { async fn cache_ready(&self, ctx: SerenityContext, guilds: Vec) { tracing::info!("Cache built successfully! {} guilds cached", guilds.len()); + let mut guilds_from_cache = String::new(); for guild_id in guilds.iter() { match guild_id.name(ctx.clone()) { - Some(name) => tracing::info!("Guild: {name}"), - None => tracing::info!("Guild: {guild_id}"), + Some(name) => guilds_from_cache.push_str(&name), + None => guilds_from_cache.push_str(&guild_id.to_string()), } + guilds_from_cache.push_str(", "); } + tracing::info!("Guilds from cache:\n{}", guilds_from_cache.purple()); let config = self.data.bot_settings.clone(); let video_status_poll_interval = config.get_video_status_poll_interval(); @@ -386,15 +389,7 @@ impl SerenityHandler { guild_name.clone() ); - // let default = GuildSettings::new( - // *guild_id, - // Some(&prefix), - // Some(guild_name.clone()), - // ); - - // let guild_entity = GuildEntity::new_guild(guild_id.get() as i64, guild_name.clone()); let guild_id_int = guild_id.get() as i64; - //let guild_name = guild_name.to_ascii_lowercase().clone(); let guild_name = guild_name.clone(); let prefix = prefix.clone(); let pool = self.data.database_pool.clone().unwrap(); @@ -402,17 +397,9 @@ impl SerenityHandler { GuildEntity::get_or_create(&pool, guild_id_int, guild_name, prefix) .await .unwrap(); - // .map_err(Into::into)?; let mut guild_settings_map = self.data.guild_settings_map.write().await; - // let _ = default..map_err(|err| { - // tracing::error!("Failed to load guild {} settings due to {}", guild_id, err); - // }); - - tracing::warn!("GuildSettings: {:?}", settings); - let _ = guild_settings_map.insert(*guild_id, settings); - // tracing::warn!("guild_settings_map: {:?}", guild_settings_map); let guild_settings_opt = guild_settings_map.get_mut(guild_id); @@ -427,6 +414,7 @@ impl SerenityHandler { } } + // TODO: Why was this here? // let pool = self.data.database_pool.clone().unwrap(); // for guild in guild_settings_list.clone() { // guild.save(&pool).await.expect("Guild saves correctly"); diff --git a/crack-core/src/handlers/track_end.rs b/crack-core/src/handlers/track_end.rs index 8894fac52..4c31cd92b 100644 --- a/crack-core/src/handlers/track_end.rs +++ b/crack-core/src/handlers/track_end.rs @@ -124,13 +124,11 @@ impl EventHandler for TrackEndHandler { // let MyAuxMetadata(metadata) = &track_ready.metadata; // let metadata = Some(metadata.clone()); - let track = queue_track_ready_front(&self.call, track_ready) + let _track = queue_track_ready_front(&self.call, track_ready) .await .ok()?; let chan_id = channel; - //let track_state = track.first().as_ref()?.get_info().await; - //let cur_position = track_state.map(|x| x.position).ok(); match send_now_playing( chan_id, diff --git a/crack-core/src/handlers/voice_chat_stats.rs b/crack-core/src/handlers/voice_chat_stats.rs index 848170d35..12ede9670 100644 --- a/crack-core/src/handlers/voice_chat_stats.rs +++ b/crack-core/src/handlers/voice_chat_stats.rs @@ -271,7 +271,7 @@ pub async fn cam_status_loop( tracing::error!("Checking camera status for {} guilds", guilds.len()); // Go through all the guilds we have cached and check the camera status // for all the users we can see in voice channels. - let mut output = String::new(); + let mut output = String::from("\n"); let mut new_cams = vec![]; for guild_id in &guilds { let (add_new_cams, add_output) = diff --git a/crack-core/src/messaging/help.rs b/crack-core/src/messaging/help.rs deleted file mode 100644 index 8b1378917..000000000 --- a/crack-core/src/messaging/help.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/crack-core/src/messaging/mod.rs b/crack-core/src/messaging/mod.rs index 156c69975..257717494 100644 --- a/crack-core/src/messaging/mod.rs +++ b/crack-core/src/messaging/mod.rs @@ -1,4 +1,3 @@ -pub mod help; pub mod interface; pub mod message; pub mod messages; diff --git a/crack-core/src/poise_ext.rs b/crack-core/src/poise_ext.rs index b62128de2..f73dee8ab 100644 --- a/crack-core/src/poise_ext.rs +++ b/crack-core/src/poise_ext.rs @@ -1,7 +1,6 @@ use crate::commands::play_utils::TrackReadyData; use crate::commands::{has_voted_bot_id, MyAuxMetadata}; use crate::db; -use crate::db::write_metadata_pg; use crate::db::{MetadataMsg, PlayLog}; use crate::guild::operations::GuildSettingsOperations; use crate::guild::settings::GuildSettings; @@ -9,14 +8,12 @@ use crate::http_utils; use crate::Error; use crate::{ commands::CrackedError, http_utils::SendMessageParams, messaging::message::CrackedMessage, - utils, utils::OptionTryUnwrap, CrackedResult, Data, + utils::OptionTryUnwrap, CrackedResult, Data, }; use colored::Colorize; -use core::time::Duration; use poise::serenity_prelude as serenity; use poise::{CreateReply, ReplyHandle}; use serenity::all::{ChannelId, CreateEmbed, GuildId, Message, UserId}; -use songbird::input::AuxMetadata; use songbird::tracks::TrackQueue; use songbird::Call; use std::{future::Future, sync::Arc}; @@ -42,6 +39,12 @@ pub trait MessageInterfaceCtxExt { as_embed: bool, ) -> impl Future, CrackedError>>; + /// Creates an embed from a CrackedMessage and sends it. + fn send_reply_embed( + &self, + message: CrackedMessage, + ) -> impl Future, Error>>; + /// Sends a message ecknowledging that the user has grabbed the current track. fn send_grabbed_notice(&self) -> impl Future, Error>>; @@ -57,11 +60,12 @@ pub trait MessageInterfaceCtxExt { impl MessageInterfaceCtxExt for crate::Context<'_> { /// Sends a message notifying the use they found a command. async fn send_found_command(&self, command: String) -> Result { - utils::send_reply_embed(self, CrackedMessage::CommandFound(command)).await + self.send_reply_embed(CrackedMessage::CommandFound(command)) + .await } async fn send_invite_link(&self) -> Result { - utils::send_reply_embed(self, CrackedMessage::InviteLink).await + self.send_reply_embed(CrackedMessage::InviteLink).await } async fn send_reply( @@ -69,17 +73,23 @@ impl MessageInterfaceCtxExt for crate::Context<'_> { message: CrackedMessage, as_embed: bool, ) -> Result { - let color = serenity::Colour::from(&message); - let params = SendMessageParams::new(message) - .with_color(color) - .with_as_embed(as_embed); - let handle = self.send_message(params).await?; - //Ok(handle.into_message().await?) - Ok(handle) + // let color = serenity::Colour::from(&message); + // let params = SendMessageParams::new(message) + // .with_color(color) + // .with_as_embed(as_embed); + // let handle = self.send_message(params).await?; + // Ok(handle) + PoiseContextExt::send_reply(self, message, as_embed).await + } + + async fn send_reply_embed(&self, message: CrackedMessage) -> Result { + PoiseContextExt::send_reply(self, message, true) + .await + .map_err(Into::into) } async fn send_grabbed_notice(&self) -> Result { - utils::send_reply_embed(self, CrackedMessage::GrabbedNotice).await + self.send_reply_embed(CrackedMessage::GrabbedNotice).await } async fn send_now_playing( @@ -194,30 +204,37 @@ impl ContextExt for crate::Context<'_> { .map_err(|e| e.into()) } - /// Send a message to tell the worker pool to do a db write when it feels like it. - async fn async_send_track_metadata_write_msg<'_>( + async fn async_send_track_metadata_write_msg( &self, - ready_track: &'ctx TrackReadyData, + _ready_track: &TrackReadyData, ) -> CrackedResult<()> { - let username = ready_track.username.clone(); - let MyAuxMetadata(aux_metadata) = ready_track.metadata.clone(); - let user_id = ready_track.user_id; - let guild_id = self.guild_id().unwrap(); - let channel_id = self.channel_id(); - - let write_data: MetadataMsg = MetadataMsg { - aux_metadata, - user_id, - username, - guild_id, - channel_id, - }; - - let pool = self.data().get_db_pool().unwrap(); - write_metadata_pg(&pool, write_data).await?; - Ok(()) + todo!() } + // /// Send a message to tell the worker pool to do a db write when it feels like it. + // async fn async_send_track_metadata_write_msg( + // &self, + // ready_track: TrackReadyData, + // ) -> CrackedResult<()> { + // let username = ready_track.username.clone(); + // let MyAuxMetadata(aux_metadata) = ready_track.metadata.clone(); + // let user_id = ready_track.user_id.clone(); + // let guild_id = self.guild_id().unwrap(); + // let channel_id = self.channel_id(); + + // let write_data: MetadataMsg = MetadataMsg { + // aux_metadata, + // user_id, + // username, + // guild_id, + // channel_id, + // }; + + // let pool = self.data().get_db_pool().unwrap(); + // write_metadata_pg(&pool, write_data).await?; + // Ok(()) + // } + /// Send a message to tell the worker pool to do a db write when it feels like it. fn send_track_metadata_write_msg(&self, ready_track: &TrackReadyData) { let username = ready_track.username.clone(); @@ -300,11 +317,12 @@ impl ContextExt for crate::Context<'_> { /// Sends a message notifying the use they found a command. async fn send_found_command(&self, command: String) -> Result { - utils::send_reply_embed(self, CrackedMessage::CommandFound(command)).await + self.send_reply_embed(CrackedMessage::CommandFound(command)) + .await } async fn send_invite_link(&self) -> Result { - utils::send_reply_embed(self, CrackedMessage::InviteLink).await + self.send_reply_embed(CrackedMessage::InviteLink).await } // ----------- DB Write functions ----------- // @@ -355,6 +373,10 @@ pub trait PoiseContextExt<'ctx> { &self, params: SendMessageParams, ) -> impl Future, CrackedError>>; + fn send_embed_response( + &self, + embed: CreateEmbed, + ) -> impl Future>>; } /// Implementation of the extension trait for the poise::Context. @@ -422,6 +444,17 @@ impl<'ctx> PoiseContextExt<'ctx> for crate::Context<'ctx> { Ok(handle) } + async fn send_embed_response(&self, embed: CreateEmbed) -> CrackedResult> { + let is_ephemeral = false; + let is_reply = true; + let params = SendMessageParams::default() + .with_ephemeral(is_ephemeral) + .with_embed(Some(embed)) + .with_reply(is_reply); + + self.send_message(params).await + } + // // async fn neutral_colour(&self) -> u32 { // // if let Some(guild_id) = self.guild_id() { // // let row = self.data().guilds_db.get(guild_id.get() as i64).await; diff --git a/crack-core/src/utils.rs b/crack-core/src/utils.rs index ac113b9b5..b6d71f6f5 100644 --- a/crack-core/src/utils.rs +++ b/crack-core/src/utils.rs @@ -80,14 +80,6 @@ pub async fn get_guild_name(cache_http: impl CacheHttp, guild_id: GuildId) -> Op cache_http.guild_name_from_guild_id(guild_id).await.ok() } -/// Creates an embed from a CrackedMessage and sends it. -pub async fn send_reply_embed<'ctx>( - ctx: &CrackContext<'ctx>, - message: CrackedMessage, -) -> Result, Error> { - ctx.send_reply(message, true).await.map_err(Into::into) -} - /// Sends a reply response, possibly as an embed. #[cfg(not(tarpaulin_include))] pub async fn send_reply<'ctx>( From 02959c7202f18615e82a5b9584887ba745037259 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Fri, 2 Aug 2024 19:22:46 +0000 Subject: [PATCH 08/95] comments --- crack-core/src/db/guild.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crack-core/src/db/guild.rs b/crack-core/src/db/guild.rs index 6b6fefd81..a0ccbbe78 100644 --- a/crack-core/src/db/guild.rs +++ b/crack-core/src/db/guild.rs @@ -409,9 +409,6 @@ impl GuildEntity { .with_welcome_settings(welcome_settings) .with_log_settings(log_settings) .with_command_settings(command_settings); - //(guild_entity, guild_settings) - // }, - //}; Ok((guild_entity, guild_settings)) } @@ -450,6 +447,7 @@ impl GuildEntity { .map_err(|e| e.into()) } + /// Load the command settings for a guild. pub async fn load_command_settings( guild_id: i64, pool: &PgPool, From 0e5de0dd8bc884365c35ddb20aec0dbf2b67b5d7 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Fri, 2 Aug 2024 23:40:59 +0000 Subject: [PATCH 09/95] Remove commented out code. --- crack-core/src/handlers/serenity.rs | 92 ----------------------------- 1 file changed, 92 deletions(-) diff --git a/crack-core/src/handlers/serenity.rs b/crack-core/src/handlers/serenity.rs index b8259d1ff..3d97a2dc6 100644 --- a/crack-core/src/handlers/serenity.rs +++ b/crack-core/src/handlers/serenity.rs @@ -675,95 +675,3 @@ pub async fn voice_state_diff_str( } Ok(result) } - -// /// `ForwardBotTestCommandsHandler` is a handler to check for bot test commands -// /// for cracktunes and forward them to the bot despite being from another bot. -// pub struct ForwardBotTestCommandsHandler<'a> { -// pub poise_ctx: crate::Context<'a>, -// pub options: poise::FrameworkOptions<(), Error>, -// pub cmd_lookup: dashmap::DashMap, -// pub shard_manager: std::sync::Mutex>>, -// } - -// // use serenity::model::channel::Message; - -// #[serenity::async_trait] -// impl serenity::EventHandler for ForwardBotTestCommandsHandler<'_> { -// async fn message(&self, _ctx: SerenityContext, new_message: Message) { -// let allowed_bot_ids = vec![ -// serenity::UserId::new(1111844110597374042), -// serenity::UserId::new(1124707756750934159), -// serenity::UserId::new(1115229568006103122), -// ]; -// if !new_message.author.bot { -// return; -// } -// if !allowed_bot_ids.contains(&new_message.author.id) { -// tracing::error!("Not an allowed bot id"); -// return; -// } -// let id = new_message.author.id; -// // let guard = ctx.data.read().await; -// // let prefix = match guard.get::() { -// // Some(map) => map -// // .get(&new_message.guild_id.unwrap()) -// // .map(|x| x.prefix.clone()), -// // _ => None, -// // }; -// tracing::error!("Allowing bot id {:} to run command...", id); -// let opt_cmd = parse_command(new_message.content.clone()); -// tracing::error!("opt_cmd: {:?}", opt_cmd); -// if !opt_cmd.is_some() { -// tracing::error!("BYE"); -// return; -// } -// tracing::error!("HERE"); -// let cmd = opt_cmd.unwrap(); -// let _ = execute_command_or_err(self.poise_ctx, cmd).await; -// } -// } - -// fn parse_command(content: String) -> Option { -// content -// .clone() -// .split_whitespace() -// .next() -// .map(|cmd| cmd[1..].to_string()) -// } - -// async fn execute_command_or_err(ctx: crate::Context<'_>, command: String) -> CommandResult { -// poise::extract_command_and_run_checks(framework, ctx, interaction, interaction_type, has_sent_initial_response, invocation_data, options, parent_commands) -// match command.as_str() { -// "ping" => crate::commands::ping_internal(ctx).await, -// _ => return Err(Box::new(CrackedError::CommandNotFound(command))), -// } -// // cmd.create_as_slash_command() -// // .unwrap() -// // .execute(cache_http, ctx) -// // .await -// // .map_err(|err| err.into()) -// // .map(|_| ()) -// } - -// #[cfg(test)] -// mod test { -// use super::parse_command; - -// #[test] -// fn test_parse_command() { -// let command_str = "~ping".to_string(); -// let want = "ping".to_string(); -// let got = parse_command(command_str).unwrap(); - -// assert_eq!(want, got); -// } - -// #[test] -// fn test_parse_command_two() { -// let command_str = "!play lalalalal alla".to_string(); -// let want = "play".to_string(); -// let got = parse_command(command_str).unwrap(); - -// assert_eq!(want, got); -// } -// } From f046a7bfd21581e95d3491cc3d965059f5837d04 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 00:58:43 +0000 Subject: [PATCH 10/95] try to fix emoji --- crack-core/src/messaging/messages.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crack-core/src/messaging/messages.rs b/crack-core/src/messaging/messages.rs index f80b173cc..e211948ed 100644 --- a/crack-core/src/messaging/messages.rs +++ b/crack-core/src/messaging/messages.rs @@ -123,7 +123,7 @@ pub const QUEUE_PAGE: &str = "Page"; pub const QUEUE_UP_NEXT: &str = "⌛ Up next"; pub const REMOVED_QUEUE_MULTIPLE: &str = "❌ Removed multiple tracks from queue!"; pub const REMOVED_QUEUE: &str = "❌ Removed from queue"; -pub const RESUMED: &str = "▶️ Resumed!"; +pub const RESUMED: &str = "▶ Resumed!"; pub const REQUESTED_BY: &str = "Requested by"; pub const ROLE_CREATED: &str = "📝 Created role!"; pub const ROLE_DELETED: &str = "🗑️ Deleted role!"; From 3dccf4eebec010928d81b240443640728c368e3e Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 03:51:35 +0000 Subject: [PATCH 11/95] fallback to ytdl and idle handler debugging prints --- crack-core/src/commands/music_utils.rs | 2 +- crack-core/src/handlers/idle.rs | 8 ++++++++ crack-core/src/sources/youtube.rs | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/crack-core/src/commands/music_utils.rs b/crack-core/src/commands/music_utils.rs index c0226eedb..4dff47a65 100644 --- a/crack-core/src/commands/music_utils.rs +++ b/crack-core/src/commands/music_utils.rs @@ -53,7 +53,7 @@ pub async fn set_global_handlers( if timeout > 0 { let premium = guild_settings.premium; handler.add_global_event( - Event::Periodic(Duration::from_secs(5), None), + Event::Periodic(Duration::from_secs(1), None), IdleHandler { http: ctx.serenity_context().http.clone(), manager: manager.clone(), diff --git a/crack-core/src/handlers/idle.rs b/crack-core/src/handlers/idle.rs index 9d22a2f8b..9a399a0e1 100644 --- a/crack-core/src/handlers/idle.rs +++ b/crack-core/src/handlers/idle.rs @@ -28,6 +28,9 @@ impl EventHandler for IdleHandler { return None; }; + tracing::warn!("IdleHandler: {:?}", track_list); + tracing::warn!("Guild ID: {:?}", self.guild_id); + // looks like the track list isn't ordered here, so the first track in the list isn't // guaranteed to be the first track in the actual queue, so search the entire list let bot_is_playing = track_list @@ -39,6 +42,11 @@ impl EventHandler for IdleHandler { self.count.store(0, Ordering::Relaxed); return None; } + tracing::warn!( + "is_playing: {:?}, time_not_playing: {:?}", + self.count, + self.count.load(Ordering::Relaxed) + ); if !self.no_timeout.load(Ordering::Relaxed) && self.limit > 0 diff --git a/crack-core/src/sources/youtube.rs b/crack-core/src/sources/youtube.rs index b8a723270..4b4f8db34 100644 --- a/crack-core/src/sources/youtube.rs +++ b/crack-core/src/sources/youtube.rs @@ -57,7 +57,7 @@ pub async fn search_query_to_source_and_metadata( // FIXME: Fallback to yt-dlp let result = match results { Some(r) => r, - None => return Err(CrackedError::EmptySearchResult), + None => return search_query_to_source_and_metadata_ytdl(client, query).await, //Err(CrackedError::EmptySearchResult), }; let metadata = &RustyYoutubeClient::search_result_to_aux_metadata(&result); metadata.clone() From bea9825e600d4b20be480f250c4ec50475c8c3ce Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 16:09:51 +0000 Subject: [PATCH 12/95] random disconnects... --- crack-core/src/commands/admin/kick.rs | 2 +- crack-core/src/commands/admin/timeout.rs | 3 +-- crack-core/src/commands/mod.rs | 21 +++++++++++++++ .../src/commands/music/play_utils/query.rs | 26 +++++++++---------- .../src/commands/music/play_utils/queue.rs | 13 +++++----- crack-core/src/config.rs | 9 ++++--- crack-core/src/handlers/track_end.rs | 3 +++ 7 files changed, 51 insertions(+), 26 deletions(-) diff --git a/crack-core/src/commands/admin/kick.rs b/crack-core/src/commands/admin/kick.rs index 9eaed6774..54f53c96b 100644 --- a/crack-core/src/commands/admin/kick.rs +++ b/crack-core/src/commands/admin/kick.rs @@ -53,7 +53,7 @@ fn read_lines(filename: &str) -> Vec { result } -/// Kick command to kick all users from the server +/// Changes all nicknames in the server to a random name from a file. #[cfg(not(tarpaulin_include))] #[poise::command(prefix_command, ephemeral, owners_only)] pub async fn changenicks( diff --git a/crack-core/src/commands/admin/timeout.rs b/crack-core/src/commands/admin/timeout.rs index 9041cbb09..0c8443a98 100644 --- a/crack-core/src/commands/admin/timeout.rs +++ b/crack-core/src/commands/admin/timeout.rs @@ -9,8 +9,7 @@ use serenity::all::User; use serenity::builder::EditMember; use std::time::Duration; -/// Timeout a user from the server. -/// FIXME: THIS IS BROKEN FIX +/// Timeout a user from the server. Broken. #[cfg(not(tarpaulin_include))] #[poise::command( category = "Admin", diff --git a/crack-core/src/commands/mod.rs b/crack-core/src/commands/mod.rs index 8c1fa53db..03364b740 100644 --- a/crack-core/src/commands/mod.rs +++ b/crack-core/src/commands/mod.rs @@ -68,6 +68,27 @@ pub fn all_commands() -> Vec { .collect() } +/// Return all the commands that are available in the bot. +pub fn commands_to_register() -> Vec { + vec![ + // register(), + // #[cfg(feature = "crack-bf")] + // bf(), + // #[cfg(feature = "crack-osint")] + // osint(), + // #[cfg(feature = "crack-gpt")] + // chat(), + ] + .into_iter() + .chain(help::help_commands()) + .chain(music::music_commands()) + //.chain(utility::utility_commands()) + .chain(settings::commands()) + //.chain(admin::commands()) + .chain(playlist::commands()) + .collect() +} + pub fn all_command_names() -> Vec { all_commands().into_iter().map(|c| c.name).collect() } diff --git a/crack-core/src/commands/music/play_utils/query.rs b/crack-core/src/commands/music/play_utils/query.rs index b6d2760ae..124777393 100644 --- a/crack-core/src/commands/music/play_utils/query.rs +++ b/crack-core/src/commands/music/play_utils/query.rs @@ -4,7 +4,7 @@ use super::{queue_keyword_list_back, queue_query_list_offset}; use crate::guild::operations::GuildSettingsOperations; use crate::messaging::interface::create_search_response; // use crate::sources::rusty_ytdl::RustyYoutubeSearch; -use crate::sources::youtube::get_rusty_search; +//use crate::sources::youtube::get_rusty_search; use crate::CrackedResult; use crate::{ commands::{check_banned_domains, MyAuxMetadata}, @@ -613,18 +613,18 @@ impl QueryType { }, QueryType::VideoLink(query) => { tracing::warn!("In VideoLink"); - let search = get_rusty_search(client.clone(), query.clone()).await?; - let metadata = search - .clone() - .metadata - .into_iter() - .map(MyAuxMetadata) - .collect::>(); - Ok((search.into(), metadata)) - // let mut ytdl = YoutubeDl::new(client, query.clone()); - // let metadata = ytdl.aux_metadata().await?; - // let my_metadata = MyAuxMetadata(metadata); - // Ok((ytdl.into(), vec![my_metadata])) + // let search = get_rusty_search(client.clone(), query.clone()).await?; + // let metadata = search + // .clone() + // .metadata + // .into_iter() + // .map(MyAuxMetadata) + // .collect::>(); + // Ok((search.into(), metadata)) + let mut ytdl = YoutubeDl::new(client, query.clone()); + let metadata = ytdl.aux_metadata().await?; + let my_metadata = MyAuxMetadata(metadata); + Ok((ytdl.into(), vec![my_metadata])) }, QueryType::Keywords(query) => { tracing::warn!("In Keywords"); diff --git a/crack-core/src/commands/music/play_utils/queue.rs b/crack-core/src/commands/music/play_utils/queue.rs index 0451a7db2..cd94496f0 100644 --- a/crack-core/src/commands/music/play_utils/queue.rs +++ b/crack-core/src/commands/music/play_utils/queue.rs @@ -76,13 +76,14 @@ pub async fn queue_track_ready_front( // First index: Current next track // Second index onward: Tracks to be played, we get in here most likely, // but if we're in one of the first two we don't want to do anything. - if new_q.len() < 3 { - return Ok(new_q); + if new_q.len() >= 3 { + //return Ok(new_q); + handler.queue().modify_queue(|queue| { + let back = queue.pop_back().unwrap(); + queue.insert(1, back); + }); } - handler.queue().modify_queue(|queue| { - let back = queue.pop_back().unwrap(); - queue.insert(1, back); - }); + drop(handler); let mut map = track_handle.typemap().write().await; map.insert::(ready_track.metadata.clone()); diff --git a/crack-core/src/config.rs b/crack-core/src/config.rs index 8d751c777..735d1413b 100644 --- a/crack-core/src/config.rs +++ b/crack-core/src/config.rs @@ -108,8 +108,9 @@ pub async fn poise_framework( let guild_id = match msg.guild_id { Some(id) => id, None => { - tracing::warn!("No guild id found"); - GuildId::new(1) + // tracing::warn!("No guild id found"); + // GuildId::new(1) + return Ok(None); }, }; let guild_settings_map = data.guild_settings_map.read().await.clone(); @@ -242,12 +243,12 @@ pub async fn poise_framework( .discord_token; let data2 = data.clone(); // FIXME: Why can't we use framework.user_data() later in this function? (it hangs) - let framework = poise::Framework::new(options, |ctx, ready, framework| { + let framework = poise::Framework::new(options, |ctx, ready, _framework| { Box::pin(async move { tracing::info!("Logged in as {}", ready.user.name); crate::commands::register::register_globally_cracked( &ctx, - &framework.options().commands, + &crate::commands::commands_to_register(), ) .await?; ctx.data diff --git a/crack-core/src/handlers/track_end.rs b/crack-core/src/handlers/track_end.rs index 4c31cd92b..ac1839816 100644 --- a/crack-core/src/handlers/track_end.rs +++ b/crack-core/src/handlers/track_end.rs @@ -109,6 +109,9 @@ impl EventHandler for TrackEndHandler { }; if next_track.is_some() { + send_now_playing(channel, self.http.clone(), self.call.clone()) + .await + .ok(); return None; } From 7b29da6bfdd25e7af97eb6905e48432b9968d112 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 16:46:10 +0000 Subject: [PATCH 13/95] wtf... --- crack-core/src/commands/music_utils.rs | 20 ++++++++++---------- crack-core/src/handlers/idle.rs | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/crack-core/src/commands/music_utils.rs b/crack-core/src/commands/music_utils.rs index 4dff47a65..e003b28bb 100644 --- a/crack-core/src/commands/music_utils.rs +++ b/crack-core/src/commands/music_utils.rs @@ -22,7 +22,7 @@ pub async fn set_global_handlers( guild_id: GuildId, channel_id: ChannelId, ) -> Result<(), CrackedError> { - use crate::handlers::voice::register_voice_handlers; + // use crate::handlers::voice::register_voice_handlers; let data = ctx.data(); let manager = songbird::get(ctx.serenity_context()) @@ -30,17 +30,17 @@ pub async fn set_global_handlers( .ok_or(CrackedError::NoSongbird)?; // This is the temp buffer to hold voice data for processing - let buffer = { - // // Open the data lock in write mode, so keys can be inserted to it. - // let mut data = ctx.data().write().await; - // data.insert::>(Arc::new(RwLock::new(Vec::new()))); - let data = Arc::new(tokio::sync::RwLock::new(Vec::new())); - data.clone() - }; + // let buffer = { + // // // Open the data lock in write mode, so keys can be inserted to it. + // // let mut data = ctx.data().write().await; + // // data.insert::>(Arc::new(RwLock::new(Vec::new()))); + // let data = Arc::new(tokio::sync::RwLock::new(Vec::new())); + // data.clone() + // }; // unregister existing events and register idle notifier call.lock().await.remove_all_global_events(); - register_voice_handlers(buffer, call.clone(), ctx.serenity_context().clone()).await?; + //register_voice_handlers(buffer, call.clone(), ctx.serenity_context().clone()).await?; let mut handler = call.lock().await; @@ -53,7 +53,7 @@ pub async fn set_global_handlers( if timeout > 0 { let premium = guild_settings.premium; handler.add_global_event( - Event::Periodic(Duration::from_secs(1), None), + Event::Periodic(Duration::from_secs(5), None), IdleHandler { http: ctx.serenity_context().http.clone(), manager: manager.clone(), diff --git a/crack-core/src/handlers/idle.rs b/crack-core/src/handlers/idle.rs index 9a399a0e1..4578bdc91 100644 --- a/crack-core/src/handlers/idle.rs +++ b/crack-core/src/handlers/idle.rs @@ -50,7 +50,7 @@ impl EventHandler for IdleHandler { if !self.no_timeout.load(Ordering::Relaxed) && self.limit > 0 - && self.count.fetch_add(1, Ordering::Relaxed) >= self.limit + && self.count.fetch_add(5, Ordering::Relaxed) >= self.limit { let guild_id = self.guild_id?; From 71c00f435508c91361f32718603bb04e2c36c7e6 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 16:55:56 +0000 Subject: [PATCH 14/95] cargo update --- Cargo.lock | 77 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9efec6330..beca66e82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -549,9 +549,9 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" [[package]] name = "byteorder" @@ -561,9 +561,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "camino" @@ -621,9 +621,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" [[package]] name = "cfg-if" @@ -1472,9 +1472,9 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" dependencies = [ "crc32fast", "miniz_oxide", @@ -2245,9 +2245,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -2420,9 +2420,9 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" dependencies = [ "hashbrown 0.14.5", ] @@ -3185,9 +3185,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "precomputed-hash" @@ -3487,9 +3490,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -3581,7 +3584,7 @@ dependencies = [ "quinn", "rustls 0.23.12", "rustls-native-certs 0.7.1", - "rustls-pemfile 2.1.2", + "rustls-pemfile 2.1.3", "rustls-pki-types", "serde", "serde_json", @@ -3957,7 +3960,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" dependencies = [ "openssl-probe", - "rustls-pemfile 2.1.2", + "rustls-pemfile 2.1.3", "rustls-pki-types", "schannel", "security-framework", @@ -3974,9 +3977,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ "base64 0.22.1", "rustls-pki-types", @@ -4255,11 +4258,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -4301,7 +4305,7 @@ dependencies = [ [[package]] name = "serenity" version = "0.12.2" -source = "git+https://github.com/CycleFive/serenity?branch=current#742a0ceeb51f8b364db01a3c71a6284add524ac5" +source = "git+https://github.com/CycleFive/serenity?branch=current#c6abc8972709d903c6d6c832ff61949996110e87" dependencies = [ "arrayvec", "async-trait", @@ -5216,12 +5220,13 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", "windows-sys 0.52.0", ] @@ -5497,9 +5502,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" @@ -6109,7 +6114,7 @@ dependencies = [ "multer", "percent-encoding", "pin-project", - "rustls-pemfile 2.1.2", + "rustls-pemfile 2.1.3", "scoped-tls", "serde", "serde_json", @@ -6304,11 +6309,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -6363,6 +6368,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -6565,6 +6579,7 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] From 457e01e349650f30e5d2a40d87e0fc4a521efcc7 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 17:01:29 +0000 Subject: [PATCH 15/95] try removing the 5 second timeout on the connect... --- crack-core/src/commands/music_utils.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crack-core/src/commands/music_utils.rs b/crack-core/src/commands/music_utils.rs index e003b28bb..1c2bb7d27 100644 --- a/crack-core/src/commands/music_utils.rs +++ b/crack-core/src/commands/music_utils.rs @@ -112,8 +112,8 @@ pub async fn do_join( guild_id: GuildId, channel_id: ChannelId, ) -> Result>, Error> { - let call = manager.join(guild_id, channel_id); - let call = tokio::time::timeout(Duration::from_secs(5), call).await?; + let call = manager.join(guild_id, channel_id).await?; + //let call = tokio::time::timeout(Duration::from_secs(5), call).await?; match call { // If we successfully joined the channel, set the global handlers. // TODO: This should probably be a separate function. From 342603793d05fa9e526597ce64b4a63145cbc8ae Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 17:08:23 +0000 Subject: [PATCH 16/95] Asdf --- crack-core/src/commands/music_utils.rs | 40 +++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/crack-core/src/commands/music_utils.rs b/crack-core/src/commands/music_utils.rs index 1c2bb7d27..1c9753dd3 100644 --- a/crack-core/src/commands/music_utils.rs +++ b/crack-core/src/commands/music_utils.rs @@ -114,24 +114,24 @@ pub async fn do_join( ) -> Result>, Error> { let call = manager.join(guild_id, channel_id).await?; //let call = tokio::time::timeout(Duration::from_secs(5), call).await?; - match call { - // If we successfully joined the channel, set the global handlers. - // TODO: This should probably be a separate function. - Ok(call) => { - set_global_handlers(ctx, call.clone(), guild_id, channel_id).await?; - let msg = CrackedMessage::Summon { - mention: channel_id.mention(), - }; - ctx.send_reply_embed(msg).await?; - Ok(call) - }, - Err(err) => { - // FIXME: Do something smarter here also. - let str = err.to_string().clone(); - let my_err = CrackedError::JoinChannelError(err); - let msg = CrackedMessage::CrackedRed(str.clone()); - ctx.send_reply_embed(msg).await?; - Err(Box::new(my_err)) - }, - } + // match call { + // // If we successfully joined the channel, set the global handlers. + // // TODO: This should probably be a separate function. + // Ok(call) => { + set_global_handlers(ctx, call.clone(), guild_id, channel_id).await?; + let msg = CrackedMessage::Summon { + mention: channel_id.mention(), + }; + ctx.send_reply_embed(msg).await?; + Ok(call) + // }, + // Err(err) => { + // // FIXME: Do something smarter here also. + // let str = err.to_string().clone(); + // let my_err = CrackedError::JoinChannelError(err); + // let msg = CrackedMessage::CrackedRed(str.clone()); + // ctx.send_reply_embed(msg).await?; + // Err(Box::new(my_err)) + // }, + // } } From 4216950657d69067c2af18eb9f034af3355e171e Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 19:35:33 +0000 Subject: [PATCH 17/95] simplify some stuff --- crack-core/src/commands/music_utils.rs | 8 ++++---- crack-core/src/handlers/idle.rs | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/crack-core/src/commands/music_utils.rs b/crack-core/src/commands/music_utils.rs index 1c9753dd3..8d4b1cfd3 100644 --- a/crack-core/src/commands/music_utils.rs +++ b/crack-core/src/commands/music_utils.rs @@ -25,9 +25,9 @@ pub async fn set_global_handlers( // use crate::handlers::voice::register_voice_handlers; let data = ctx.data(); - let manager = songbird::get(ctx.serenity_context()) - .await - .ok_or(CrackedError::NoSongbird)?; + // let manager = songbird::get(ctx.serenity_context()) + // .await + // .ok_or(CrackedError::NoSongbird)?; // This is the temp buffer to hold voice data for processing // let buffer = { @@ -56,7 +56,7 @@ pub async fn set_global_handlers( Event::Periodic(Duration::from_secs(5), None), IdleHandler { http: ctx.serenity_context().http.clone(), - manager: manager.clone(), + serenity_ctx: Arc::new(ctx.serenity_context().clone()), channel_id, guild_id: Some(guild_id), limit: timeout as usize, diff --git a/crack-core/src/handlers/idle.rs b/crack-core/src/handlers/idle.rs index 4578bdc91..560dc244d 100644 --- a/crack-core/src/handlers/idle.rs +++ b/crack-core/src/handlers/idle.rs @@ -1,6 +1,6 @@ use self::serenity::{async_trait, http::Http}; use poise::serenity_prelude as serenity; -use songbird::{tracks::PlayMode, Event, EventContext, EventHandler, Songbird}; +use songbird::{tracks::PlayMode, Event, EventContext, EventHandler}; use std::sync::{ atomic::{AtomicBool, AtomicUsize, Ordering}, Arc, @@ -11,7 +11,8 @@ use crate::messaging::messages::IDLE_ALERT; /// Handler for the idle event. pub struct IdleHandler { pub http: Arc, - pub manager: Arc, + //pub manager: Arc, + pub serenity_ctx: Arc, pub channel_id: serenity::ChannelId, pub guild_id: Option, pub limit: usize, @@ -24,6 +25,7 @@ pub struct IdleHandler { #[async_trait] impl EventHandler for IdleHandler { async fn act(&self, ctx: &EventContext<'_>) -> Option { + let manager = songbird::get(&self.serenity_ctx).await?; let EventContext::Track(track_list) = ctx else { return None; }; @@ -54,7 +56,7 @@ impl EventHandler for IdleHandler { { let guild_id = self.guild_id?; - if self.manager.remove(guild_id).await.is_ok() { + if manager.remove(guild_id).await.is_ok() { self.channel_id.say(&self.http, IDLE_ALERT).await.unwrap(); return Some(Event::Cancel); } From 0d628f4f8f04bf389266aec40519f0ddc3b3e6d7 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 3 Aug 2024 19:36:14 +0000 Subject: [PATCH 18/95] cargo update --- Cargo.lock | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 176 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index beca66e82..12955f37e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -242,6 +242,33 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "aws-lc-rs" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae74d9bd0a7530e8afd1770739ad34b36838829d6ad61818f9230f683f5ad77" +dependencies = [ + "aws-lc-sys", + "mirai-annotations", + "paste", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0e249228c6ad2d240c2dc94b714d711629d52bad946075d8e9b2f5391f0703" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", + "libc", + "paste", +] + [[package]] name = "backoff" version = "0.4.0" @@ -295,6 +322,29 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bindgen" +version = "0.69.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.72", + "which", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -624,6 +674,19 @@ name = "cc" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] [[package]] name = "cfg-if" @@ -663,6 +726,17 @@ dependencies = [ "zeroize", ] +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "cmake" version = "0.1.50" @@ -1307,6 +1381,12 @@ dependencies = [ "dtoa", ] +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "educe" version = "0.5.11" @@ -1516,6 +1596,12 @@ dependencies = [ "hashmap_derive", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "funty" version = "2.0.0" @@ -2313,6 +2399,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -2328,6 +2423,15 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.69" @@ -2346,12 +2450,28 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libc" version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + [[package]] name = "libm" version = "0.2.8" @@ -2576,6 +2696,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "mirai-annotations" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" + [[package]] name = "multer" version = "2.1.0" @@ -3198,6 +3324,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.72", +] + [[package]] name = "primal-check" version = "0.3.4" @@ -3933,6 +4069,8 @@ version = "0.23.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "ring 0.17.8", "rustls-pki-types", @@ -4007,6 +4145,7 @@ version = "0.102.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" dependencies = [ + "aws-lc-rs", "ring 0.17.8", "rustls-pki-types", "untrusted 0.9.0", @@ -4305,7 +4444,7 @@ dependencies = [ [[package]] name = "serenity" version = "0.12.2" -source = "git+https://github.com/CycleFive/serenity?branch=current#c6abc8972709d903c6d6c832ff61949996110e87" +source = "git+https://github.com/CycleFive/serenity?branch=current#09621998ce7fd69dd466002b69581ac47fb2c99e" dependencies = [ "arrayvec", "async-trait", @@ -4328,7 +4467,7 @@ dependencies = [ "serde_json", "time", "tokio", - "tokio-tungstenite 0.23.1", + "tokio-tungstenite 0.22.0", "tracing", "typemap_rev", "typesize", @@ -4388,6 +4527,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "shorthand" version = "0.1.1" @@ -5464,9 +5609,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.23.1" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +checksum = "d46baf930138837d65e25e3b33be49c9228579a6135dbf756b5cb9e4283e7cef" dependencies = [ "futures-util", "log", @@ -5474,7 +5619,7 @@ dependencies = [ "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", - "tungstenite 0.23.0", + "tungstenite 0.21.0", "webpki-roots 0.26.3", ] @@ -5792,8 +5937,6 @@ dependencies = [ "httparse", "log", "rand", - "rustls 0.23.12", - "rustls-pki-types", "sha1", "thiserror", "utf-8", @@ -6268,6 +6411,18 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "whoami" version = "1.5.1" @@ -6620,6 +6775,20 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] [[package]] name = "zerovec" From a0b3c409494161debe7570b6ef3a9b4d18edac26 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sun, 4 Aug 2024 11:41:13 +0000 Subject: [PATCH 19/95] fuck it use both version of reqwest --- Cargo.lock | 193 ++++++++++++++---- Cargo.toml | 21 +- crack-core/Cargo.toml | 2 + crack-core/src/commands/music/doplay.rs | 4 +- crack-core/src/commands/music/dosearch.rs | 5 +- .../src/commands/music/play_utils/query.rs | 55 ++--- crack-core/src/commands/music_utils.rs | 22 +- crack-core/src/config.rs | 8 + crack-core/src/handlers/idle.rs | 28 +-- crack-core/src/http_utils.rs | 15 ++ crack-core/src/sources/rusty_ytdl.rs | 2 +- crack-core/src/sources/youtube.rs | 7 +- cracktunes/src/main.rs | 4 +- 13 files changed, 261 insertions(+), 105 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 12955f37e..8b8b860a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -143,7 +143,7 @@ dependencies = [ "eventsource-stream", "futures", "rand", - "reqwest", + "reqwest 0.12.5", "reqwest-eventsource", "secrecy", "serde", @@ -826,6 +826,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "cookie" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + [[package]] name = "cookie" version = "0.18.1" @@ -837,13 +848,30 @@ dependencies = [ "version_check", ] +[[package]] +name = "cookie_store" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6" +dependencies = [ + "cookie 0.17.0", + "idna 0.3.0", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "cookie_store" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4934e6b7e8419148b6ef56950d277af8561060b56afd59e2aadf98b59fce6baa" dependencies = [ - "cookie", + "cookie 0.18.1", "idna 0.5.0", "log", "publicsuffix", @@ -914,8 +942,10 @@ dependencies = [ "prometheus", "rand", "regex", - "reqwest", + "reqwest 0.11.27", + "reqwest 0.12.5", "rspotify", + "rustls 0.23.12", "rusty_ytdl", "serde", "serde_json", @@ -949,7 +979,7 @@ name = "crack-osint" version = "0.1.4" dependencies = [ "ipinfo", - "reqwest", + "reqwest 0.12.5", "serde", "serde_json", "sha1", @@ -1221,7 +1251,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19ef31459083b8ac95c1f31be8f88d124a0d23aa11de592895600ff4b0da2e90" dependencies = [ - "reqwest", + "reqwest 0.12.5", "serde", "url", ] @@ -1383,9 +1413,9 @@ dependencies = [ [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "educe" @@ -2115,6 +2145,20 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http 0.2.12", + "hyper 0.14.30", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + [[package]] name = "hyper-rustls" version = "0.27.2" @@ -2369,7 +2413,7 @@ dependencies = [ "ipnetwork", "lazy_static", "lru", - "reqwest", + "reqwest 0.12.5", "serde", "serde_json", "tokio", @@ -2556,7 +2600,7 @@ dependencies = [ "html5ever", "log", "markup5ever_rcdom", - "reqwest", + "reqwest 0.12.5", "serde", ] @@ -3243,7 +3287,7 @@ dependencies = [ [[package]] name = "poise" version = "0.6.1" -source = "git+https://github.com/cycle-five/poise?branch=current#b1c3ec1fd3fc8fcc8d77f3a87bb6b3bd75ab3cd7" +source = "git+https://github.com/serenity-rs/poise?branch=current#575025909b063c3b998659abf9d241c8790404ee" dependencies = [ "async-trait", "derivative", @@ -3261,7 +3305,7 @@ dependencies = [ [[package]] name = "poise_macros" version = "0.6.1" -source = "git+https://github.com/cycle-five/poise?branch=current#b1c3ec1fd3fc8fcc8d77f3a87bb6b3bd75ab3cd7" +source = "git+https://github.com/serenity-rs/poise?branch=current#575025909b063c3b998659abf9d241c8790404ee" dependencies = [ "darling 0.20.10", "proc-macro2", @@ -3687,6 +3731,52 @@ dependencies = [ "bytecheck", ] +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "cookie 0.17.0", + "cookie_store 0.20.0", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration", + "tokio", + "tokio-rustls 0.24.1", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots 0.25.4", + "winreg 0.50.0", +] + [[package]] name = "reqwest" version = "0.12.5" @@ -3696,8 +3786,8 @@ dependencies = [ "async-compression", "base64 0.22.1", "bytes", - "cookie", - "cookie_store", + "cookie 0.18.1", + "cookie_store 0.21.0", "encoding_rs", "futures-channel", "futures-core", @@ -3707,7 +3797,7 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "hyper 1.4.1", - "hyper-rustls", + "hyper-rustls 0.27.2", "hyper-util", "ipnet", "js-sys", @@ -3725,7 +3815,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "system-configuration", "tokio", "tokio-rustls 0.26.0", @@ -3738,7 +3828,7 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots 0.26.3", - "winreg", + "winreg 0.52.0", ] [[package]] @@ -3753,7 +3843,7 @@ dependencies = [ "mime", "nom", "pin-project-lite", - "reqwest", + "reqwest 0.12.5", "thiserror", ] @@ -3766,7 +3856,7 @@ dependencies = [ "anyhow", "async-trait", "http 1.1.0", - "reqwest", + "reqwest 0.12.5", "serde", "thiserror", "tower-service", @@ -3786,7 +3876,7 @@ dependencies = [ "http 1.1.0", "hyper 1.4.1", "parking_lot 0.11.2", - "reqwest", + "reqwest 0.12.5", "reqwest-middleware", "retry-policies", "tokio", @@ -3924,7 +4014,7 @@ dependencies = [ "async-trait", "log", "maybe-async", - "reqwest", + "reqwest 0.12.5", "serde_json", "thiserror", ] @@ -4044,6 +4134,7 @@ version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ + "log", "ring 0.17.8", "rustls-webpki 0.101.7", "sct", @@ -4188,7 +4279,7 @@ dependencies = [ "once_cell", "rand", "regex", - "reqwest", + "reqwest 0.12.5", "reqwest-middleware", "reqwest-retry", "scraper", @@ -4444,7 +4535,8 @@ dependencies = [ [[package]] name = "serenity" version = "0.12.2" -source = "git+https://github.com/CycleFive/serenity?branch=current#09621998ce7fd69dd466002b69581ac47fb2c99e" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "880a04106592d0a8f5bdacb1d935889bfbccb4a14f7074984d9cd857235d34ac" dependencies = [ "arrayvec", "async-trait", @@ -4460,14 +4552,14 @@ dependencies = [ "mini-moka", "parking_lot 0.12.3", "percent-encoding", - "reqwest", + "reqwest 0.11.27", "secrecy", "serde", "serde_cow", "serde_json", "time", "tokio", - "tokio-tungstenite 0.22.0", + "tokio-tungstenite 0.21.0", "tracing", "typemap_rev", "typesize", @@ -4619,7 +4711,8 @@ dependencies = [ [[package]] name = "songbird" version = "0.4.3" -source = "git+https://github.com/cycle-five/songbird?branch=current#a0b2901ba6089054e1fab29ffea26ed377662c43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338dd182f9f084f583c4c0db38588e28a34778ecec288208cf0b61c378ac90d1" dependencies = [ "async-trait", "audiopus", @@ -4636,7 +4729,7 @@ dependencies = [ "parking_lot 0.12.3", "pin-project", "rand", - "reqwest", + "reqwest 0.11.27", "ringbuf", "rubato", "rusty_pool", @@ -4930,16 +5023,16 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stream_lib" -version = "0.5.2" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e106dd009a0dfd2cf57777c39cad08f852debd366df6e841b250d956cec3277e" +checksum = "fa3f10eb5a7054e17abf61d310e4e29108187a847591c63c4c79b6a74898a5a7" dependencies = [ "bytes", "futures-core", "futures-util", "hls_m3u8", "patricia_tree", - "reqwest", + "reqwest 0.11.27", "tokio", "tracing", "url", @@ -5289,6 +5382,12 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "sync_wrapper" version = "1.0.1" @@ -5530,6 +5629,16 @@ dependencies = [ "webpki", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls 0.21.12", + "tokio", +] + [[package]] name = "tokio-rustls" version = "0.25.0" @@ -5607,22 +5716,6 @@ dependencies = [ "webpki-roots 0.26.3", ] -[[package]] -name = "tokio-tungstenite" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d46baf930138837d65e25e3b33be49c9228579a6135dbf756b5cb9e4283e7cef" -dependencies = [ - "futures-util", - "log", - "rustls 0.23.12", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.26.0", - "tungstenite 0.21.0", - "webpki-roots 0.26.3", -] - [[package]] name = "tokio-util" version = "0.7.11" @@ -6662,6 +6755,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "winreg" version = "0.52.0" diff --git a/Cargo.toml b/Cargo.toml index 4ba394351..f4e2ec342 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,9 +30,10 @@ features = [ [workspace.dependencies.serenity] # Broken? try self-host. -git = "https://github.com/CycleFive/serenity" +# git = "https://github.com/CycleFive/serenity" +#git = "https://github.com/serenity-rs/serenity" version = "0.12" -branch = "current" +#branch = "current" default-features = false features = [ "builder", @@ -52,8 +53,8 @@ features = [ [workspace.dependencies.songbird] # Broken? try self-hosted? -git = "https://github.com/cycle-five/songbird" -branch = "current" +#git = "https://github.com/cycle-five/songbird" +#branch = "current" version = "0.4.3" features = ["driver", "serenity", "rustls", "receive", "builtin-queue"] @@ -71,7 +72,16 @@ crack-core = { path = "./crack-core", default-features = true, version = "0.3" } crack-osint = { path = "./crack-osint", default-features = true, version = "0.1" } crack-gpt = { path = "../crack-gpt", default-features = true, version = "0.2" } crack-bf = { path = "../crack-bf", default-features = true, version = "0.1" } -poise = { branch = "current", git = "https://github.com/cycle-five/poise", default-features = true } +# poise = { branch = "current", git = "https://github.com/cycle-five/poise", default-features = true } +reqwest_old = { version = "=0.11", default-features = false, package = "reqwest", features = [ + "blocking", + "json", + "multipart", + "rustls-tls", + "cookies", +] } + +poise = { branch = "current", git = "https://github.com/serenity-rs/poise", default-features = true } vergen = { version = "9", features = ["git", "cargo", "si", "build", "gitcl"] } tracing = "0.1" reqwest = { version = "0.12", default-features = false, features = [ @@ -84,7 +94,6 @@ reqwest = { version = "0.12", default-features = false, features = [ "http2", "macos-system-configuration", ] } - # Config for 'cargo dist' [workspace.metadata.dist] # The preferred cargo-dist version to use in CI (Cargo.toml SemVer syntax) diff --git a/crack-core/Cargo.toml b/crack-core/Cargo.toml index 85f4f75f4..24e674494 100644 --- a/crack-core/Cargo.toml +++ b/crack-core/Cargo.toml @@ -33,6 +33,7 @@ rusty_ytdl = { git = "https://github.com/cycle-five/rusty_ytdl", default-feature "blocking", "ffmpeg", ] } +rustls = "0.23" audiopus = "0.3.0-rc.0" async-trait = "0.1" anyhow = "1.0" @@ -63,6 +64,7 @@ crack-osint = { path = "../crack-osint", optional = true } crack-bf = { path = "../crack-bf", optional = true } reqwest = { workspace = true } +reqwest_old = { workspace = true } tracing = { workspace = true } sqlx = { workspace = true } serenity = { workspace = true } diff --git a/crack-core/src/commands/music/doplay.rs b/crack-core/src/commands/music/doplay.rs index d9a77f7af..08b25a369 100644 --- a/crack-core/src/commands/music/doplay.rs +++ b/crack-core/src/commands/music/doplay.rs @@ -648,6 +648,8 @@ pub async fn queue_aux_metadata( aux_metadata: &[MyAuxMetadata], mut msg: Message, ) -> CrackedResult<()> { + use crate::http_utils; + let guild_id = ctx.guild_id().ok_or(CrackedError::NoGuildId)?; let search_results = aux_metadata; @@ -683,7 +685,7 @@ pub async fn queue_aux_metadata( }; let ytdl = YoutubeDl::new( - client.clone(), + http_utils::get_client_old().clone(), metadata_final.metadata().source_url.clone().unwrap(), ); diff --git a/crack-core/src/commands/music/dosearch.rs b/crack-core/src/commands/music/dosearch.rs index b8e89bb46..b5b886a56 100644 --- a/crack-core/src/commands/music/dosearch.rs +++ b/crack-core/src/commands/music/dosearch.rs @@ -5,7 +5,6 @@ use crate::{ Context, Error, }; use poise::ReplyHandle; -use reqwest::Client; use serenity::builder::CreateEmbed; use songbird::input::YoutubeDl; @@ -38,7 +37,9 @@ async fn do_yt_search_internal( ctx: Context<'_>, search_query: String, ) -> Result { - let mut ytdl = YoutubeDl::new(Client::new(), search_query); + use crate::http_utils; + + let mut ytdl = YoutubeDl::new(http_utils::get_client_old().clone(), search_query); let results = ytdl.search(None).await?; let embeds = results diff --git a/crack-core/src/commands/music/play_utils/query.rs b/crack-core/src/commands/music/play_utils/query.rs index 124777393..3ffb90247 100644 --- a/crack-core/src/commands/music/play_utils/query.rs +++ b/crack-core/src/commands/music/play_utils/query.rs @@ -154,7 +154,7 @@ impl QueryType { // FIXME: Don't hardcode this. let prefix = "/data/downloads"; let extension = if mp3 { "mp3" } else { "webm" }; - let client = http_utils::get_client().clone(); + //let client = http_utils::get_client().clone(); // tracing::warn!("query_type: {:?}", query_type); match self { QueryType::YoutubeSearch(_) => Err(Box::new(CrackedError::Other( @@ -191,7 +191,10 @@ impl QueryType { }, QueryType::Keywords(query) => { tracing::warn!("In Keywords"); - let mut ytdl = YoutubeDl::new(client, format!("ytsearch:{}", query)); + let mut ytdl = YoutubeDl::new( + http_utils::get_client_old().clone(), + format!("ytsearch:{}", query), + ); let metadata = ytdl.aux_metadata().await.unwrap(); let url = metadata.source_url.unwrap(); let (output, metadata) = download_file_ytdlp(&url, mp3).await?; @@ -230,7 +233,7 @@ impl QueryType { .map(|x| x.build_query()) .collect::>(); let url = format!("ytsearch:{}", keywords_list.first().unwrap()); - let mut ytdl = YoutubeDl::new(client, url.clone()); + let mut ytdl = YoutubeDl::new(http_utils::get_client_old().clone(), url.clone()); let metadata = ytdl.aux_metadata().await.unwrap(); let (output, _metadata) = download_file_ytdlp(&url, mp3).await?; let file_name = format!( @@ -246,7 +249,7 @@ impl QueryType { QueryType::KeywordList(keywords_list) => { tracing::warn!("In KeywordList"); let url = format!("ytsearch:{}", keywords_list.join(" ")); - let mut ytdl = YoutubeDl::new(client, url.clone()); + let mut ytdl = YoutubeDl::new(http_utils::get_client_old().clone(), url.clone()); tracing::warn!("ytdl: {:?}", ytdl); let metadata = ytdl.aux_metadata().await.unwrap(); let (output, _metadata) = download_file_ytdlp(&url, mp3).await?; @@ -312,8 +315,8 @@ impl QueryType { call: Arc>, keywords: String, ) -> Result, CrackedError> { - let reqwest_client = ctx.data().http_client.clone(); - let search_results = YoutubeDl::new_search(reqwest_client, keywords) + //let reqwest_client = ctx.data().http_client.clone(); + let search_results = YoutubeDl::new_search(http_utils::get_client_old().clone(), keywords) .search(None) .await?; // let user_id = ctx.author().id; @@ -394,9 +397,10 @@ impl QueryType { QueryType::YoutubeSearch(query) => { tracing::trace!("Mode::End, QueryType::YoutubeSearch"); - let res = YoutubeDl::new_search(http_utils::get_client().clone(), query.clone()) - .search(None) - .await?; + let res = + YoutubeDl::new_search(http_utils::get_client_old().clone(), query.clone()) + .search(None) + .await?; let user_id = ctx.author().id; create_search_response(&ctx, guild_id, user_id, query.clone(), res).await?; Ok(true) @@ -459,7 +463,7 @@ impl QueryType { match self { QueryType::VideoLink(url) | QueryType::PlaylistLink(url) => { // FIXME - let mut src = YoutubeDl::new(http_utils::get_client().clone(), url.clone()); + let mut src = YoutubeDl::new(http_utils::get_client_old().clone(), url.clone()); let metadata = src.aux_metadata().await?; queue_track_back(ctx, &call, &QueryType::NewYoutubeDl((src, metadata))).await?; Ok(true) @@ -598,11 +602,12 @@ impl QueryType { ) -> CrackedResult<(SongbirdInput, Vec)> { use colored::Colorize; let client = client.unwrap_or_else(|| http_utils::get_client().clone()); + let client_old = http_utils::get_client_old().clone(); tracing::warn!("{}", format!("query_type: {:?}", self).red()); match self { QueryType::YoutubeSearch(query) => { tracing::error!("In YoutubeSearch"); - let mut ytdl = YoutubeDl::new_search(client, query.clone()); + let mut ytdl = YoutubeDl::new_search(client_old, query.clone()); let mut res = Vec::new(); let asdf = ytdl.search(None).await?; for metadata in asdf { @@ -621,7 +626,7 @@ impl QueryType { // .map(MyAuxMetadata) // .collect::>(); // Ok((search.into(), metadata)) - let mut ytdl = YoutubeDl::new(client, query.clone()); + let mut ytdl = YoutubeDl::new(client_old, query.clone()); let metadata = ytdl.aux_metadata().await?; let my_metadata = MyAuxMetadata(metadata); Ok((ytdl.into(), vec![my_metadata])) @@ -640,7 +645,7 @@ impl QueryType { QueryType::File(file) => { tracing::warn!("In File"); Ok(( - HttpRequest::new(client, file.url.to_owned()).into(), + HttpRequest::new(client_old, file.url.to_owned()).into(), vec![MyAuxMetadata::default()], )) }, @@ -664,7 +669,7 @@ impl QueryType { RustyYoutubeClient::search_result_to_aux_metadata(&r), )); } - let ytdl = YoutubeDl::new(client.clone(), url.clone()); + let ytdl = YoutubeDl::new(client_old.clone(), url.clone()); tracing::warn!("ytdl: {:?}", ytdl); Ok((ytdl.into(), metadata)) }, @@ -675,7 +680,7 @@ impl QueryType { .map(|x| x.build_query()) .collect::>(); let mut ytdl = YoutubeDl::new( - client, + client_old.clone(), format!("ytsearch:{}", keywords_list.first().unwrap()), ); tracing::warn!("ytdl: {:?}", ytdl); @@ -685,8 +690,10 @@ impl QueryType { }, QueryType::KeywordList(keywords_list) => { tracing::warn!("In KeywordList"); - let mut ytdl = - YoutubeDl::new(client, format!("ytsearch:{}", keywords_list.join(" "))); + let mut ytdl = YoutubeDl::new( + client_old.clone(), + format!("ytsearch:{}", keywords_list.join(" ")), + ); tracing::warn!("ytdl: {:?}", ytdl); let metdata = match ytdl.aux_metadata().await { Ok(metadata) => metadata, @@ -705,12 +712,9 @@ impl QueryType { /// Download a file and upload it as an mp3. async fn download_file_ytdlp_mp3(url: &str) -> Result<(Output, AuxMetadata), Error> { - let metadata = YoutubeDl::new( - reqwest::ClientBuilder::new().use_rustls_tls().build()?, - url.to_string(), - ) - .aux_metadata() - .await?; + let metadata = YoutubeDl::new(http_utils::get_client_old().clone(), url.to_string()) + .aux_metadata() + .await?; let args = [ "--extract-audio", @@ -739,7 +743,7 @@ async fn download_file_ytdlp(url: &str, mp3: bool) -> Result<(Output, AuxMetadat return download_file_ytdlp_mp3(url).await; } - let metadata = YoutubeDl::new(http_utils::get_client().clone(), url.to_string()) + let metadata = YoutubeDl::new(http_utils::get_client_old().clone(), url.to_string()) .aux_metadata() .await?; @@ -821,7 +825,8 @@ pub async fn query_type_from_url( "LINK".blue(), url.underline().blue() ); - let mut ytdl = YoutubeDl::new(ctx.data().http_client.clone(), url.to_string()); + let mut ytdl = + YoutubeDl::new(http_utils::get_client_old().clone(), url.to_string()); // This can fail whenever yt-dlp cannot parse a track from the URL. let metadata = match ytdl.aux_metadata().await { Ok(metadata) => metadata, diff --git a/crack-core/src/commands/music_utils.rs b/crack-core/src/commands/music_utils.rs index 8d4b1cfd3..520f71175 100644 --- a/crack-core/src/commands/music_utils.rs +++ b/crack-core/src/commands/music_utils.rs @@ -39,26 +39,30 @@ pub async fn set_global_handlers( // }; // unregister existing events and register idle notifier - call.lock().await.remove_all_global_events(); + //call.lock().await.remove_all_global_events(); //register_voice_handlers(buffer, call.clone(), ctx.serenity_context().clone()).await?; let mut handler = call.lock().await; - let guild_settings = data - .get_guild_settings(guild_id) - .await - .ok_or(CrackedError::NoGuildSettings)?; + handler.remove_all_global_events(); + + let guild_settings = match data.get_guild_settings(guild_id).await { + Some(settings) => settings, + None => { + drop(handler); + return Err(CrackedError::NoGuildSettings); + }, + }; let timeout = guild_settings.timeout; if timeout > 0 { let premium = guild_settings.premium; handler.add_global_event( - Event::Periodic(Duration::from_secs(5), None), + Event::Periodic(Duration::from_secs(60), None), IdleHandler { - http: ctx.serenity_context().http.clone(), serenity_ctx: Arc::new(ctx.serenity_context().clone()), + guild_id, channel_id, - guild_id: Some(guild_id), limit: timeout as usize, count: Default::default(), no_timeout: Arc::new(AtomicBool::new(premium)), @@ -77,6 +81,8 @@ pub async fn set_global_handlers( }, ); + drop(handler); + Ok(()) } diff --git a/crack-core/src/config.rs b/crack-core/src/config.rs index 735d1413b..78e813c6f 100644 --- a/crack-core/src/config.rs +++ b/crack-core/src/config.rs @@ -55,11 +55,19 @@ async fn on_error(error: poise::FrameworkError<'_, Data, Error>) { } } +/// Installs the AWS LC provider for rustls. +pub fn install_crypto_provider() { + rustls::crypto::aws_lc_rs::default_provider() + .install_default() + .expect("Failed to install AWS LC provider"); +} + /// Create the poise framework from the bot config. pub async fn poise_framework( config: BotConfig, event_log_async: EventLogAsync, ) -> Result { + // install_crypto_provider(); // FrameworkOptions contains all of poise's configuration option in one struct // Every option can be omitted to use its default value diff --git a/crack-core/src/handlers/idle.rs b/crack-core/src/handlers/idle.rs index 560dc244d..54760a961 100644 --- a/crack-core/src/handlers/idle.rs +++ b/crack-core/src/handlers/idle.rs @@ -1,4 +1,4 @@ -use self::serenity::{async_trait, http::Http}; +use self::serenity::async_trait; use poise::serenity_prelude as serenity; use songbird::{tracks::PlayMode, Event, EventContext, EventHandler}; use std::sync::{ @@ -10,11 +10,9 @@ use crate::messaging::messages::IDLE_ALERT; /// Handler for the idle event. pub struct IdleHandler { - pub http: Arc, - //pub manager: Arc, pub serenity_ctx: Arc, + pub guild_id: serenity::GuildId, pub channel_id: serenity::ChannelId, - pub guild_id: Option, pub limit: usize, pub count: Arc, pub no_timeout: Arc, @@ -46,20 +44,26 @@ impl EventHandler for IdleHandler { } tracing::warn!( "is_playing: {:?}, time_not_playing: {:?}", - self.count, + bot_is_playing, self.count.load(Ordering::Relaxed) ); if !self.no_timeout.load(Ordering::Relaxed) && self.limit > 0 - && self.count.fetch_add(5, Ordering::Relaxed) >= self.limit + && self.count.fetch_add(60, Ordering::Relaxed) >= self.limit { - let guild_id = self.guild_id?; - - if manager.remove(guild_id).await.is_ok() { - self.channel_id.say(&self.http, IDLE_ALERT).await.unwrap(); - return Some(Event::Cancel); - } + match manager.remove(self.guild_id).await { + Ok(_) => { + self.channel_id + .say(&self.serenity_ctx, IDLE_ALERT) + .await + .unwrap(); + return Some(Event::Cancel); + }, + Err(e) => { + tracing::error!("Error removing bot from voice channel: {:?}", e); + }, + }; } None } diff --git a/crack-core/src/http_utils.rs b/crack-core/src/http_utils.rs index be6776d3b..06353c360 100644 --- a/crack-core/src/http_utils.rs +++ b/crack-core/src/http_utils.rs @@ -1,5 +1,6 @@ use once_cell::sync::Lazy; use reqwest::Client; +use reqwest_old; use std::future::Future; use crate::errors::CrackedError; @@ -154,6 +155,15 @@ static CLIENT: Lazy = Lazy::new(|| { .expect("Failed to build reqwest client") }); +/// This is a hack to get around the fact that we can't use async in statics. Is it? +static CLIENT_OLD: Lazy = Lazy::new(|| { + println!("Creating a new reqwest client..."); + reqwest_old::ClientBuilder::new() + .use_rustls_tls() + .build() + .expect("Failed to build reqwest client") +}); + /// Build a reqwest client with rustls. pub fn build_client() -> Client { reqwest::ClientBuilder::new() @@ -167,6 +177,11 @@ pub fn get_client() -> &'static Client { &CLIENT } +/// Get a reference to an old version client. +pub fn get_client_old() -> &'static reqwest_old::Client { + &CLIENT_OLD +} + /// Initialize the static, global reqwest client. pub async fn init_http_client() -> Result<(), CrackedError> { let client = get_client().clone(); diff --git a/crack-core/src/sources/rusty_ytdl.rs b/crack-core/src/sources/rusty_ytdl.rs index 6a0fb61df..0ed8d1383 100644 --- a/crack-core/src/sources/rusty_ytdl.rs +++ b/crack-core/src/sources/rusty_ytdl.rs @@ -610,7 +610,7 @@ mod test { "Oh Shit I'm Feeling It", ]; let mut res_all = Vec::with_capacity(searches.len()); - let client = http_utils::get_client(); + let client = http_utils::get_client_old(); for search in searches { let mut ytdl = YoutubeDl::new_search(client.clone(), search.to_string()); let res = ytdl.search(Some(1)).await; diff --git a/crack-core/src/sources/youtube.rs b/crack-core/src/sources/youtube.rs index 4b4f8db34..72e6e2acc 100644 --- a/crack-core/src/sources/youtube.rs +++ b/crack-core/src/sources/youtube.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use crate::commands::play_utils::QueryType; +use crate::http_utils; use crate::sources::rusty_ytdl::RustyYoutubeSearch; use crate::CrackedResult; use crate::{ @@ -67,7 +68,7 @@ pub async fn search_query_to_source_and_metadata( Some(url) => url.clone(), None => "".to_string(), }; - let ytdl = YoutubeDl::new(client, source_url); + let ytdl = YoutubeDl::new(http_utils::get_client_old().clone(), source_url); let my_metadata = MyAuxMetadata(metadata); Ok((ytdl.into(), vec![my_metadata])) @@ -116,7 +117,7 @@ pub async fn search_query_to_source_and_metadata_rusty( /// Search youtube for a query and return the source (playable) /// and metadata using the yt-dlp command line tool. pub async fn search_query_to_source_and_metadata_ytdl( - client: reqwest::Client, + _client: reqwest::Client, query: String, ) -> Result<(SongbirdInput, Vec), CrackedError> { let query = if query.starts_with("ytsearch:") { @@ -124,7 +125,7 @@ pub async fn search_query_to_source_and_metadata_ytdl( } else { format!("ytsearch:{}", query) }; - let mut ytdl = YoutubeDl::new(client, query); + let mut ytdl = YoutubeDl::new(http_utils::get_client_old().clone(), query); let metadata = ytdl.aux_metadata().await?; let my_metadata = MyAuxMetadata(metadata); diff --git a/cracktunes/src/main.rs b/cracktunes/src/main.rs index 44f3e9560..4e5f97e9c 100644 --- a/cracktunes/src/main.rs +++ b/cracktunes/src/main.rs @@ -8,6 +8,7 @@ use crack_core::EventLogAsync; pub use crack_core::PhoneCodeData; use std::collections::HashMap; use std::env; +use tokio::runtime::Handle; #[cfg(feature = "crack-tracing")] use tracing_subscriber::{filter, prelude::*, EnvFilter, Registry}; #[cfg(feature = "crack-metrics")] @@ -36,8 +37,7 @@ type Error = Box; #[cfg(not(tarpaulin_include))] //#[tokio::main] fn main() -> Result<(), Error> { - use tokio::runtime::Handle; - + config::install_crypto_provider(); // let event_log = EventLog::default(); let event_log_async = EventLogAsync::default(); From 021c5e6b2366de7a605a4c08ca869d3a1b427645 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sun, 4 Aug 2024 14:16:45 +0000 Subject: [PATCH 20/95] try it this way... --- Cargo.lock | 133 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 15 ++++- crack-core/src/config.rs | 4 +- 3 files changed, 149 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b8b860a7..76c469374 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1590,6 +1590,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + [[package]] name = "flume" version = "0.11.0" @@ -1869,6 +1878,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "halfbrown" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" +dependencies = [ + "hashbrown 0.14.5", + "serde", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2500,6 +2519,70 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lexical-core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +dependencies = [ + "lexical-util", + "static_assertions", +] + [[package]] name = "libc" version = "0.2.155" @@ -3668,6 +3751,26 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "regex" version = "1.10.6" @@ -4656,6 +4759,22 @@ dependencies = [ "rand_core", ] +[[package]] +name = "simd-json" +version = "0.13.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "570c430b3d902ea083097e853263ae782dfe40857d93db019a12356c8e8143fa" +dependencies = [ + "getrandom", + "halfbrown", + "lexical-core", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", +] + [[package]] name = "simdutf8" version = "0.1.4" @@ -4738,6 +4857,7 @@ dependencies = [ "serde_json", "serenity", "serenity-voice-model", + "simd-json", "socket2", "stream_lib", "streamcatcher", @@ -5263,6 +5383,7 @@ dependencies = [ "bytemuck", "lazy_static", "log", + "rustfft", ] [[package]] @@ -6286,6 +6407,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "value-trait" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad8db98c1e677797df21ba03fca7d3bf9bec3ca38db930954e4fe6e1ea27eb4" +dependencies = [ + "float-cmp", + "halfbrown", + "itoa", + "ryu", +] + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index f4e2ec342..cdb92aec4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,11 +56,22 @@ features = [ #git = "https://github.com/cycle-five/songbird" #branch = "current" version = "0.4.3" -features = ["driver", "serenity", "rustls", "receive", "builtin-queue"] +features = [ + "driver", + "gateway", + "serenity", + "rustls", + "receive", + "builtin-queue", + "simd-json", +] [workspace.dependencies.symphonia] version = "0.5.4" -features = ["all-formats", "all-codecs"] +features = ["all-formats", "all-codecs", "opt-simd"] + +[workspace.dependencies.symphonia-metadata] +version = "0.5.4" [workspace.dependencies.tokio] version = "1.38" diff --git a/crack-core/src/config.rs b/crack-core/src/config.rs index 78e813c6f..296f62a02 100644 --- a/crack-core/src/config.rs +++ b/crack-core/src/config.rs @@ -14,6 +14,7 @@ use crate::{ }; use colored::Colorize; use poise::serenity_prelude::{Client, FullEvent, GatewayIntents, GuildId, UserId}; +use songbird::driver::DecodeMode; use songbird::serenity::SerenityInit; use std::{collections::HashMap, process::exit, sync::Arc, time::Duration}; use tokio::sync::RwLock; @@ -271,6 +272,7 @@ pub async fn poise_framework( data: data2.clone(), }; + let songbird_config = songbird::Config::default().decode_mode(DecodeMode::Decode); // let bot_test_handler = Arc::new(ForwardBotTestCommandsHandler { // options: Default::default(), @@ -279,7 +281,7 @@ pub async fn poise_framework( // }); let client = Client::builder(token, intents) .framework(framework) - .register_songbird() + .register_songbird_from_config(songbird_config) .event_handler(serenity_handler) //.event_handler_arc(bot_test_handler.clone()) .await From 9c3c52f4f759cf10010ca9e9351142cf819d63b4 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Mon, 5 Aug 2024 12:21:27 +0000 Subject: [PATCH 21/95] update for changes from dbj --- Cargo.lock | 33 ++++++++++++++++++++------------- Cargo.toml | 8 +++++--- crack-core/src/handlers/idle.rs | 2 +- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76c469374..bd0b93a97 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -339,7 +339,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", "syn 2.0.72", "which", @@ -401,7 +401,7 @@ dependencies = [ "boa_macros", "indexmap", "num-bigint", - "rustc-hash", + "rustc-hash 1.1.0", ] [[package]] @@ -432,7 +432,7 @@ dependencies = [ "pollster", "rand", "regress", - "rustc-hash", + "rustc-hash 1.1.0", "ryu-js", "serde", "serde_json", @@ -481,7 +481,7 @@ dependencies = [ "indexmap", "once_cell", "phf 0.11.2", - "rustc-hash", + "rustc-hash 1.1.0", "static_assertions", ] @@ -518,7 +518,7 @@ dependencies = [ "num-traits", "once_cell", "regress", - "rustc-hash", + "rustc-hash 1.1.0", "tinystr", ] @@ -3616,16 +3616,17 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +checksum = "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.0.0", "rustls 0.23.12", + "socket2", "thiserror", "tokio", "tracing", @@ -3633,14 +3634,14 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" dependencies = [ "bytes", "rand", "ring 0.17.8", - "rustc-hash", + "rustc-hash 2.0.0", "rustls 0.23.12", "slab", "thiserror", @@ -3657,6 +3658,7 @@ dependencies = [ "libc", "once_cell", "socket2", + "tracing", "windows-sys 0.52.0", ] @@ -4182,6 +4184,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc_version" version = "0.4.0" @@ -4830,8 +4838,7 @@ dependencies = [ [[package]] name = "songbird" version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338dd182f9f084f583c4c0db38588e28a34778ecec288208cf0b61c378ac90d1" +source = "git+https://github.com/serenity-rs/songbird?branch=current#2d7dc29fd68826fb6998eb748be05387ea2fe91b" dependencies = [ "async-trait", "audiopus", diff --git a/Cargo.toml b/Cargo.toml index cdb92aec4..f05136dd8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,9 +53,11 @@ features = [ [workspace.dependencies.songbird] # Broken? try self-hosted? -#git = "https://github.com/cycle-five/songbird" -#branch = "current" -version = "0.4.3" +# git = "https://github.com/cycle-five/songbird" +git = "https://github.com/serenity-rs/songbird" +branch = "current" +version = "0.4.2" +# path = "/home/lothrop/src/songbird" features = [ "driver", "gateway", diff --git a/crack-core/src/handlers/idle.rs b/crack-core/src/handlers/idle.rs index 54760a961..3ba240302 100644 --- a/crack-core/src/handlers/idle.rs +++ b/crack-core/src/handlers/idle.rs @@ -23,7 +23,7 @@ pub struct IdleHandler { #[async_trait] impl EventHandler for IdleHandler { async fn act(&self, ctx: &EventContext<'_>) -> Option { - let manager = songbird::get(&self.serenity_ctx).await?; + let manager = songbird::get(&self.serenity_ctx.to_owned()).await?; let EventContext::Track(track_list) = ctx else { return None; }; From 75681eb3cda143cfbef5bfd9974224b0397bdb2e Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Mon, 5 Aug 2024 12:29:35 +0000 Subject: [PATCH 22/95] asdf: --- crack-core/src/commands/settings/set/set_premium.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crack-core/src/commands/settings/set/set_premium.rs b/crack-core/src/commands/settings/set/set_premium.rs index 4cf74a8ec..3eb6fef31 100644 --- a/crack-core/src/commands/settings/set/set_premium.rs +++ b/crack-core/src/commands/settings/set/set_premium.rs @@ -1,10 +1,10 @@ use crate::commands::CrackedError; use crate::db::GuildEntity; +use crate::guild::operations::GuildSettingsOperations; use crate::messaging::message::CrackedMessage; +use crate::poise_ext::ContextExt; use crate::utils::send_reply; use crate::{Context, Error}; -use crate::poise_ext::ContextExt; -use crate::guild::operations::GuildSettingsOperations; /// Internal set premium function without #command macro. #[cfg(not(tarpaulin_include))] From 6af22cabed949f76ba020a46c3e3e91b50dc5cd9 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Mon, 5 Aug 2024 14:43:50 +0000 Subject: [PATCH 23/95] patch for DCs --- Cargo.lock | 3 +-- Cargo.toml | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd0b93a97..056cb123c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4680,8 +4680,7 @@ dependencies = [ [[package]] name = "serenity-voice-model" version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "593682f6155d07c8b331b3d1060f5aab7e6796caca9f2f66bd9e6855c880e06b" +source = "git+https://github.com/serenity-rs/serenity?branch=current#658b6a7261fbde7cf59f84613f870ef7a48735c6" dependencies = [ "bitflags 2.6.0", "num-traits", diff --git a/Cargo.toml b/Cargo.toml index f05136dd8..4ae26bcde 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ features = [ # git = "https://github.com/CycleFive/serenity" #git = "https://github.com/serenity-rs/serenity" version = "0.12" -#branch = "current" +# branch = "current" default-features = false features = [ "builder", @@ -130,6 +130,10 @@ npm-scope = "@cracktunes" # The archive format to use for windows builds (defaults .zip) windows-archive = ".tar.gz" +[patch.crates-io.serenity-voice-model] +git = "https://github.com/serenity-rs/serenity" +branch = "current" + [profile.release] incremental = true # Set this to 1 or 2 to get more useful backtraces in debugger. From f8fb04df8a08b897971e439adc5678a192ebdc08 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Tue, 6 Aug 2024 14:33:49 +0000 Subject: [PATCH 24/95] Refactor the crack-voting module --- .github/workflows/coverage.yml | 2 + .vscode/tasks.json | 4 +- crack-voting/Cargo.toml | 3 + crack-voting/src/lib.rs | 124 +++++++++++++++++++++++---------- crack-voting/src/main.rs | 3 +- 5 files changed, 99 insertions(+), 37 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 32964010e..021960d3c 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -56,6 +56,7 @@ jobs: PG_USER: postgres PG_PASSWORD: mysecretpassword VIRUSTOTAL_API_KEY: ${{secrets.VIRUSTOTAL_API_KEY}} + WEBHOOK_SECRET: ${{secrets.WEBHOOK_SECRET}} run: | sqlx database create sqlx migrate run --source migrations/ @@ -67,6 +68,7 @@ jobs: PG_USER: postgres PG_PASSWORD: mysecretpassword VIRUSTOTAL_API_KEY: ${{secrets.VIRUSTOTAL_API_KEY}} + WEBHOOK_SECRET: ${{secrets.WEBHOOK_SECRET}} run: | cargo tarpaulin --verbose --all --timeout 120 --out xml diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 06aff576f..2c7ad3449 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -38,7 +38,9 @@ "--profile=release", "--", "--exact", - "--show-output" + "--show-output", + "--threads", + "1" ], "problemMatcher": [ "$rustc" diff --git a/crack-voting/Cargo.toml b/crack-voting/Cargo.toml index e4fdd0ecc..863628851 100644 --- a/crack-voting/Cargo.toml +++ b/crack-voting/Cargo.toml @@ -36,3 +36,6 @@ sqlx = { workspace = true } [dev-dependencies] sqlx = { workspace = true } + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(tarpaulin_include)'] } diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index 756299db6..ac364c024 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -1,9 +1,9 @@ use dbl::types::Webhook; use lazy_static::lazy_static; +use sqlx::PgPool; use std::env; +use std::sync::Arc; use warp::{body::BodyDeserializeError, http::StatusCode, path, reject, Filter, Rejection, Reply}; -// #[cfg(test)] -// pub mod test; const WEBHOOK_SECRET_DEFAULT: &str = "my-secret"; const DATABASE_URL_DEFAULT: &str = "postgresql://postgres:postgres@localhost:5432/postgres"; @@ -18,8 +18,8 @@ lazy_static! { /// Struct to hold the context for the voting server. #[derive(Debug, Clone)] pub struct VotingContext { - pool: sqlx::PgPool, - secret: String, + pool: Arc, + secret: &'static str, } /// Implement the `VotingContext`. @@ -28,13 +28,19 @@ impl VotingContext { let pool = sqlx::PgPool::connect(&DATABASE_URL) .await .expect("failed to connect to database"); - let secret = get_secret().to_string(); - VotingContext { pool, secret } + let secret = get_secret(); + VotingContext { + pool: Arc::new(pool), + secret, + } } pub async fn new_with_pool(pool: sqlx::PgPool) -> Self { - let secret = get_secret().to_string(); - VotingContext { pool, secret } + let secret = get_secret(); + VotingContext { + pool: Arc::new(pool), + secret, + } } } @@ -78,11 +84,9 @@ fn get_secret() -> &'static str { } /// Write the received webhook to the database. -async fn write_webhook_to_db( - ctx: &'static VotingContext, - webhook: Webhook, -) -> Result<(), sqlx::Error> { +async fn write_webhook_to_db(ctx: VotingContext, webhook: Webhook) -> Result<(), sqlx::Error> { println!("write_webhook_to_db"); + //let executor = ctx.pool.clone(); let res = sqlx::query!( r#"INSERT INTO vote_webhook (bot_id, user_id, kind, is_weekend, query, created_at) @@ -95,7 +99,7 @@ async fn write_webhook_to_db( webhook.is_weekend, webhook.query, ) - .execute(&ctx.pool) + .execute(ctx.pool.as_ref()) .await; match res { Ok(_) => println!("Webhook written to database"), @@ -119,47 +123,58 @@ fn header(secret: &str) -> impl Filter + Clone .untuple_one() } +#[derive(serde::Serialize, serde::Deserialize)] +struct ReplyBody { + body: String, +} + /// Async function to process the received webhook. -async fn process_webhook( - ctx: &'static VotingContext, - hook: Webhook, -) -> Result { +async fn process_webhook(ctx: VotingContext, hook: Webhook) -> Result { println!("process_webhook"); write_webhook_to_db(ctx, hook.clone()).await.map_err(Sqlx)?; - Ok(warp::reply::html("Success.")) + let body = ReplyBody { + body: "Success.".to_string(), + }; + Ok(warp::reply::json(&body)) } + /// Create a filter that handles the webhook. -async fn get_webhook( - ctx: &'static VotingContext, +async fn get_app( + ctx: VotingContext, ) -> impl Filter + Clone { println!("get_webhook"); + let secret = ctx.secret; + let context = warp::any().map(move || ctx.clone()); warp::post() .and(path!("dbl" / "webhook")) - .and(header(&ctx.secret)) + .and(header(&secret)) .and(warp::body::json()) - .and_then(move |hook: Webhook| async move { process_webhook(ctx, hook).await }) + .and(context) + .and_then( + |hook: Webhook, ctx: VotingContext| async move { process_webhook(ctx, hook).await }, + ) .recover(custom_error) } /// Get the routes for the server. async fn get_routes( - ctx: &'static VotingContext, + ctx: VotingContext, ) -> impl Filter + Clone { println!("get_routes"); - let webhook = get_webhook(ctx).await; + let webhook = get_app(ctx).await; let health = warp::path!("health").map(|| "Hello, world!"); webhook.or(health) } /// Run the server. -pub async fn run() -> &'static VotingContext { - let ctx = Box::leak(Box::new(VotingContext::new().await)); - warp::serve(get_routes(ctx).await) - //.run(([127, 0, 0, 1], 3030)) - .run(([0, 0, 0, 0], 3030)) - .await; - ctx +pub async fn run() -> Result<(), Box> { + let ctx = VotingContext::new().await; //Box::leak(Box::new(VotingContext::new().await)); + let routes = get_routes(ctx).await; + + warp::serve(routes).run(([0, 0, 0, 0], 3030)).await; + + Ok(()) } /// Custom error handling for the server. @@ -183,22 +198,61 @@ async fn custom_error(err: Rejection) -> Result { mod test { use sqlx::{Pool, Postgres}; - use crate::{get_secret, get_webhook}; + use crate::get_secret; use crate::{StatusCode, VotingContext, Webhook}; pub static MIGRATOR: sqlx::migrate::Migrator = sqlx::migrate!("./test_migrations"); + use super::*; + + #[sqlx::test(migrator = "MIGRATOR")] + async fn test_voting_context_creation(pool: PgPool) { + let secret = "test_secret"; + std::env::set_var("WEBHOOK_SECRET", secret); + + let context = VotingContext::new_with_pool(pool).await; + + assert_eq!(context.secret, secret); + // We can't directly compare PgPools, but we can check if it's initialized + assert!(context.pool.acquire().await.is_ok()); + } + + // #[sqlx::test(migrator = "MIGRATOR")] + // async fn test_handle_vote(pool: PgPool) { + // let secret = "test_secret"; + // let context = VotingContext { + // pool: Arc::new(pool), + // secret, + // }; + + // // Mock request data + // let vote_data = VoteData { + // candidate: "Candidate A".to_string(), + // voter_id: "voter123".to_string(), + // }; + + // // Call your handler + // let result = handle_vote(context, vote_data).await; + + // // Assert the result + // assert!(result.is_ok()); + // // Add more specific assertions based on your expected behavior + // } + #[sqlx::test(migrator = "MIGRATOR")] //#[sqlx::test] async fn test_bad_req(_pool: Pool) { - let ctx = Box::leak(Box::new(VotingContext::new().await)); + let ctx = VotingContext::new().await; let secret = get_secret(); println!("Secret {}", secret); + let app = get_app(ctx).await; + let res = warp::test::request() .method("POST") .path("/dbl/webhook") .header("authorization", secret) - .reply(&get_webhook(ctx).await) + .body("bad json") + .reply(&app) .await; assert_eq!(res.status(), StatusCode::BAD_REQUEST); } @@ -220,7 +274,7 @@ mod test { is_weekend: false, query: Some("test".to_string()), }) - .reply(&get_webhook(ctx).await) + .reply(&get_app(ctx.clone()).await) .await; assert_eq!(res.status(), StatusCode::OK); } diff --git a/crack-voting/src/main.rs b/crack-voting/src/main.rs index f66c17d70..0c882ee6a 100644 --- a/crack-voting/src/main.rs +++ b/crack-voting/src/main.rs @@ -2,7 +2,8 @@ use crack_voting::run; /// Main function #[tokio::main] +#[cfg(not(tarpaulin_include))] async fn main() { println!("Starting server"); - run().await; + let _ = run().await; } From 710c966c802dbb136587cdc7eea57f95a71e7dde Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Tue, 6 Aug 2024 15:49:55 +0000 Subject: [PATCH 25/95] asdf --- crack-voting/src/lib.rs | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index ac364c024..d80f1ac0f 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -139,7 +139,7 @@ async fn process_webhook(ctx: VotingContext, hook: Webhook) -> Result impl Filter + Clone { println!("get_webhook"); @@ -158,11 +158,11 @@ async fn get_app( } /// Get the routes for the server. -async fn get_routes( +async fn get_app( ctx: VotingContext, ) -> impl Filter + Clone { - println!("get_routes"); - let webhook = get_app(ctx).await; + println!("get_app"); + let webhook = get_webhook(ctx).await; let health = warp::path!("health").map(|| "Hello, world!"); webhook.or(health) } @@ -170,9 +170,9 @@ async fn get_routes( /// Run the server. pub async fn run() -> Result<(), Box> { let ctx = VotingContext::new().await; //Box::leak(Box::new(VotingContext::new().await)); - let routes = get_routes(ctx).await; + let app = get_app(ctx).await; - warp::serve(routes).run(([0, 0, 0, 0], 3030)).await; + warp::serve(app).run(([0, 0, 0, 0], 3030)).await; Ok(()) } @@ -217,28 +217,6 @@ mod test { assert!(context.pool.acquire().await.is_ok()); } - // #[sqlx::test(migrator = "MIGRATOR")] - // async fn test_handle_vote(pool: PgPool) { - // let secret = "test_secret"; - // let context = VotingContext { - // pool: Arc::new(pool), - // secret, - // }; - - // // Mock request data - // let vote_data = VoteData { - // candidate: "Candidate A".to_string(), - // voter_id: "voter123".to_string(), - // }; - - // // Call your handler - // let result = handle_vote(context, vote_data).await; - - // // Assert the result - // assert!(result.is_ok()); - // // Add more specific assertions based on your expected behavior - // } - #[sqlx::test(migrator = "MIGRATOR")] //#[sqlx::test] async fn test_bad_req(_pool: Pool) { From 3069b00bf6322055479041b4b1040d3e146268ec Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Wed, 7 Aug 2024 17:58:50 +0000 Subject: [PATCH 26/95] fix query in crack-voting --- ...9e16e6e69b5f5d548042ef39dcc342ff4975a.json | 28 ------------------- Cargo.lock | 1 + .../src/commands/music/play_utils/query.rs | 5 +++- .../src/commands/playlist/loadspotify.rs | 6 ++-- crack-core/src/handlers/idle.rs | 25 ++++++++++++----- crack-core/src/http_utils.rs | 2 +- crack-voting/Cargo.toml | 1 + crack-voting/src/lib.rs | 15 ++++++++-- scripts/run_one_test.sh | 7 +++++ 9 files changed, 49 insertions(+), 41 deletions(-) delete mode 100644 .sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json diff --git a/.sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json b/.sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json deleted file mode 100644 index d49fef2dc..000000000 --- a/.sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "INSERT INTO vote_webhook\n (bot_id, user_id, kind, is_weekend, query, created_at)\n VALUES\n ($1, $2, $3, $4, $5, now())\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8", - "Int8", - { - "Custom": { - "name": "webhook_kind", - "kind": { - "Enum": [ - "upvote", - "test" - ] - } - } - }, - "Bool", - "Text" - ] - }, - "nullable": [] - }, - "hash": "ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a" -} diff --git a/Cargo.lock b/Cargo.lock index 056cb123c..2e111a66c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -996,6 +996,7 @@ dependencies = [ "dbl-rs", "lazy_static", "serde", + "serde_json", "sqlx", "tokio", "tracing", diff --git a/crack-core/src/commands/music/play_utils/query.rs b/crack-core/src/commands/music/play_utils/query.rs index 3ffb90247..efcd69437 100644 --- a/crack-core/src/commands/music/play_utils/query.rs +++ b/crack-core/src/commands/music/play_utils/query.rs @@ -772,7 +772,10 @@ pub async fn query_type_from_url( let query_type = match Url::parse(url) { Ok(url_data) => match url_data.host_str() { Some("open.spotify.com") | Some("spotify.link") => { - let final_url = http_utils::resolve_final_url(url).await?; + // We don't want to give up as long as we have a url. + let final_url = http_utils::resolve_final_url(url) + .await + .unwrap_or(url.to_string()); tracing::info!( "spotify: {} -> {}", url.underline().blue(), diff --git a/crack-core/src/commands/playlist/loadspotify.rs b/crack-core/src/commands/playlist/loadspotify.rs index a273dfbc4..6b390a88f 100644 --- a/crack-core/src/commands/playlist/loadspotify.rs +++ b/crack-core/src/commands/playlist/loadspotify.rs @@ -26,7 +26,9 @@ macro_rules! get_db_or_err { pub async fn get_spotify_playlist(url: &str) -> Result, CrackedError> { let url_clean = Url::parse(url)?; - let final_url = http_utils::resolve_final_url(url_clean.as_ref()).await?; + let final_url = http_utils::resolve_final_url(url_clean.as_ref()) + .await + .unwrap_or_else(|_| url_clean.to_string()); tracing::warn!("spotify: {} -> {}", url_clean, final_url); let spotify = SPOTIFY.lock().await; let spotify = verify(spotify.as_ref(), CrackedError::SpotifyAuth)?; @@ -48,7 +50,7 @@ pub async fn loadspotify_( let playlist_tracks = get_spotify_playlist(&spotifyurl).await?; - tracing::warn!("Got playlist tracks: {:?}", playlist_tracks); + tracing::info!("Got playlist tracks: {:?}", playlist_tracks); let metadata = playlist_tracks .iter() diff --git a/crack-core/src/handlers/idle.rs b/crack-core/src/handlers/idle.rs index 3ba240302..9989c98ab 100644 --- a/crack-core/src/handlers/idle.rs +++ b/crack-core/src/handlers/idle.rs @@ -17,7 +17,9 @@ pub struct IdleHandler { pub count: Arc, pub no_timeout: Arc, } +use songbird::error::JoinError; +/// TODO: Add metrics /// Implement handler for the idle event. #[cfg(not(tarpaulin_include))] #[async_trait] @@ -28,8 +30,13 @@ impl EventHandler for IdleHandler { return None; }; - tracing::warn!("IdleHandler: {:?}", track_list); - tracing::warn!("Guild ID: {:?}", self.guild_id); + // tracing::warn!("IdleHandler: {:?}", len(track_list)); + // tracing::warn!("Guild ID: {:?}", self.guild_id); + + // let handler = match manager.get(self.guild_id) { + // Some(call) => call, + // None => return Some(Event::Cancel), + // }; // looks like the track list isn't ordered here, so the first track in the list isn't // guaranteed to be the first track in the actual queue, so search the entire list @@ -42,11 +49,11 @@ impl EventHandler for IdleHandler { self.count.store(0, Ordering::Relaxed); return None; } - tracing::warn!( - "is_playing: {:?}, time_not_playing: {:?}", - bot_is_playing, - self.count.load(Ordering::Relaxed) - ); + // tracing::warn!( + // "is_playing: {:?}, time_not_playing: {:?}", + // bot_is_playing, + // self.count.load(Ordering::Relaxed) + // ); if !self.no_timeout.load(Ordering::Relaxed) && self.limit > 0 @@ -60,6 +67,10 @@ impl EventHandler for IdleHandler { .unwrap(); return Some(Event::Cancel); }, + Err(JoinError::NoCall) => { + tracing::warn!("No call found for guild: {:?}", self.guild_id); + return Some(Event::Cancel); + }, Err(e) => { tracing::error!("Error removing bot from voice channel: {:?}", e); }, diff --git a/crack-core/src/http_utils.rs b/crack-core/src/http_utils.rs index 06353c360..15032b484 100644 --- a/crack-core/src/http_utils.rs +++ b/crack-core/src/http_utils.rs @@ -242,7 +242,7 @@ pub async fn resolve_final_url(url: &str) -> Result { // Extract the final URL after following all redirects let final_url = response.url().clone(); - Ok(final_url.as_str().to_string()) + Ok(final_url.into()) } /// Gets the guild_name for a channel_id. diff --git a/crack-voting/Cargo.toml b/crack-voting/Cargo.toml index 863628851..da9b6a58b 100644 --- a/crack-voting/Cargo.toml +++ b/crack-voting/Cargo.toml @@ -28,6 +28,7 @@ lazy_static = "1.5" dbl-rs = "0.4" warp = "0.3" serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" chrono = { version = "0.4", features = ["serde"] } tokio = { workspace = true } tracing = { workspace = true } diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index d80f1ac0f..c6f115bb3 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -95,7 +95,8 @@ async fn write_webhook_to_db(ctx: VotingContext, webhook: Webhook) -> Result<(), "#, webhook.bot.0 as i64, webhook.user.0 as i64, - webhook.kind as i16, + //webhook.kind.to_string() as _, + "test" as _, webhook.is_weekend, webhook.query, ) @@ -148,7 +149,7 @@ async fn get_webhook( warp::post() .and(path!("dbl" / "webhook")) - .and(header(&secret)) + .and(header(secret)) .and(warp::body::json()) .and(context) .and_then( @@ -196,6 +197,7 @@ async fn custom_error(err: Rejection) -> Result { #[cfg(test)] mod test { + use serde_json; use sqlx::{Pool, Postgres}; use crate::get_secret; @@ -240,7 +242,16 @@ mod test { async fn test_authorized(pool: Pool) { let ctx = Box::leak(Box::new(VotingContext::new_with_pool(pool).await)); let secret = get_secret(); + let webhook = &Webhook { + bot: dbl::types::BotId(11), + user: dbl::types::UserId(31), + kind: dbl::types::WebhookType::Test, + is_weekend: false, + query: Some("test".to_string()), + }; + let json_str = serde_json::to_string(webhook).unwrap(); println!("Secret {}", secret); + println!("Webhook {}", json_str); let res = warp::test::request() .method("POST") .path("/dbl/webhook") diff --git a/scripts/run_one_test.sh b/scripts/run_one_test.sh index be6a0d212..d2785ceb0 100644 --- a/scripts/run_one_test.sh +++ b/scripts/run_one_test.sh @@ -5,3 +5,10 @@ cargo test \ -- db::guild::test::test_update_prefix \ --exact \ --show-output + +cargo test \ + --package crack-voting \ + --lib \ + -- test::test_authorized \ + --exact \ + --show-output From 9d60a612ad4ea9cde2c3cec78417880af3e605bd Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Wed, 7 Aug 2024 19:00:46 +0000 Subject: [PATCH 27/95] asdf --- ...9e16e6e69b5f5d548042ef39dcc342ff4975a.json | 28 +++++++++++++++++++ crack-voting/src/lib.rs | 12 ++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 .sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json diff --git a/.sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json b/.sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json new file mode 100644 index 000000000..d49fef2dc --- /dev/null +++ b/.sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO vote_webhook\n (bot_id, user_id, kind, is_weekend, query, created_at)\n VALUES\n ($1, $2, $3, $4, $5, now())\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Int8", + { + "Custom": { + "name": "webhook_kind", + "kind": { + "Enum": [ + "upvote", + "test" + ] + } + } + }, + "Bool", + "Text" + ] + }, + "nullable": [] + }, + "hash": "ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a" +} diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index c6f115bb3..579889b2e 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -5,7 +5,7 @@ use std::env; use std::sync::Arc; use warp::{body::BodyDeserializeError, http::StatusCode, path, reject, Filter, Rejection, Reply}; -const WEBHOOK_SECRET_DEFAULT: &str = "my-secret"; +const WEBHOOK_SECRET_DEFAULT: &str = "test_secret"; const DATABASE_URL_DEFAULT: &str = "postgresql://postgres:postgres@localhost:5432/postgres"; lazy_static! { @@ -83,6 +83,13 @@ fn get_secret() -> &'static str { &WEBHOOK_SECRET } +fn webhook_type_to_string(kind: dbl::types::WebhookType) -> String { + match kind { + dbl::types::WebhookType::Upvote => "upvote".to_string(), + dbl::types::WebhookType::Test => "test".to_string(), + } +} + /// Write the received webhook to the database. async fn write_webhook_to_db(ctx: VotingContext, webhook: Webhook) -> Result<(), sqlx::Error> { println!("write_webhook_to_db"); @@ -95,8 +102,7 @@ async fn write_webhook_to_db(ctx: VotingContext, webhook: Webhook) -> Result<(), "#, webhook.bot.0 as i64, webhook.user.0 as i64, - //webhook.kind.to_string() as _, - "test" as _, + webhook_type_to_string(webhook.kind) as _, webhook.is_weekend, webhook.query, ) From 4398b9f68a71c946a1b023082a60c3f85d4e4eef Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Wed, 7 Aug 2024 22:26:30 +0000 Subject: [PATCH 28/95] cleanup and linting --- ...fea131f204f282930980876bd314dbb07295.json} | 4 ++-- ...52f795b2f4e442460c201884a49a9f80f3929.json | 14 ++++++++++++ crack-voting/src/lib.rs | 22 +++++++++++++++++-- 3 files changed, 36 insertions(+), 4 deletions(-) rename .sqlx/{query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json => query-1fe3321e4ac433824b7d385ef25cfea131f204f282930980876bd314dbb07295.json} (80%) create mode 100644 .sqlx/query-3b2f8f67be96d16797b4ede3b6052f795b2f4e442460c201884a49a9f80f3929.json diff --git a/.sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json b/.sqlx/query-1fe3321e4ac433824b7d385ef25cfea131f204f282930980876bd314dbb07295.json similarity index 80% rename from .sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json rename to .sqlx/query-1fe3321e4ac433824b7d385ef25cfea131f204f282930980876bd314dbb07295.json index d49fef2dc..cc7ee1501 100644 --- a/.sqlx/query-ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a.json +++ b/.sqlx/query-1fe3321e4ac433824b7d385ef25cfea131f204f282930980876bd314dbb07295.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO vote_webhook\n (bot_id, user_id, kind, is_weekend, query, created_at)\n VALUES\n ($1, $2, $3, $4, $5, now())\n ", + "query": "INSERT INTO vote_webhook\n (bot_id, user_id, kind, is_weekend, query, created_at)\n VALUES\n ($1, $2, $3::WEBHOOK_KIND, $4, $5, now())\n ", "describe": { "columns": [], "parameters": { @@ -24,5 +24,5 @@ }, "nullable": [] }, - "hash": "ad509ae3e59c771c771a7b5262f9e16e6e69b5f5d548042ef39dcc342ff4975a" + "hash": "1fe3321e4ac433824b7d385ef25cfea131f204f282930980876bd314dbb07295" } diff --git a/.sqlx/query-3b2f8f67be96d16797b4ede3b6052f795b2f4e442460c201884a49a9f80f3929.json b/.sqlx/query-3b2f8f67be96d16797b4ede3b6052f795b2f4e442460c201884a49a9f80f3929.json new file mode 100644 index 000000000..d5ebc80fe --- /dev/null +++ b/.sqlx/query-3b2f8f67be96d16797b4ede3b6052f795b2f4e442460c201884a49a9f80f3929.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO \"user\"\n (id, username, discriminator, avatar_url, bot, created_at, updated_at, last_seen)\n VALUES\n ($1, 'NULL', 0, 'NULL', false, now(), now(), now())\n ON CONFLICT (id)\n DO UPDATE SET last_seen = now()\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8" + ] + }, + "nullable": [] + }, + "hash": "3b2f8f67be96d16797b4ede3b6052f795b2f4e442460c201884a49a9f80f3929" +} diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index 579889b2e..102ca1883 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -93,12 +93,29 @@ fn webhook_type_to_string(kind: dbl::types::WebhookType) -> String { /// Write the received webhook to the database. async fn write_webhook_to_db(ctx: VotingContext, webhook: Webhook) -> Result<(), sqlx::Error> { println!("write_webhook_to_db"); + // Check for the user in the database, since we have a foreign key constraint. + // Create the user if they don't exist. + let res = sqlx::query!( + r#"INSERT INTO "user" + (id, username, discriminator, avatar_url, bot, created_at, updated_at, last_seen) + VALUES + ($1, 'NULL', 0, 'NULL', false, now(), now(), now()) + ON CONFLICT (id) + DO UPDATE SET last_seen = now() + "#, + webhook.user.0 as i64, + ) + .execute(ctx.pool.as_ref()) + .await; + if let Err(e) = res { + eprintln!("Failed to insert / update user: {}", e); + } //let executor = ctx.pool.clone(); let res = sqlx::query!( r#"INSERT INTO vote_webhook (bot_id, user_id, kind, is_weekend, query, created_at) VALUES - ($1, $2, $3, $4, $5, now()) + ($1, $2, $3::WEBHOOK_KIND, $4, $5, now()) "#, webhook.bot.0 as i64, webhook.user.0 as i64, @@ -186,6 +203,7 @@ pub async fn run() -> Result<(), Box> { /// Custom error handling for the server. async fn custom_error(err: Rejection) -> Result { + eprintln!("Error: {:?}", err); if err.find::().is_some() { Ok(warp::reply::with_status( warp::reply(), @@ -264,7 +282,7 @@ mod test { .header("authorization", secret) .json(&Webhook { bot: dbl::types::BotId(11), - user: dbl::types::UserId(31), + user: dbl::types::UserId(1), kind: dbl::types::WebhookType::Test, is_weekend: false, query: Some("test".to_string()), From bb832bffaf7f76f7f9e69b095dbe10e3ee9675db Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Thu, 8 Aug 2024 02:42:24 +0000 Subject: [PATCH 29/95] cleanup --- crack-voting/src/lib.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index 102ca1883..cbc0bc340 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -92,7 +92,6 @@ fn webhook_type_to_string(kind: dbl::types::WebhookType) -> String { /// Write the received webhook to the database. async fn write_webhook_to_db(ctx: VotingContext, webhook: Webhook) -> Result<(), sqlx::Error> { - println!("write_webhook_to_db"); // Check for the user in the database, since we have a foreign key constraint. // Create the user if they don't exist. let res = sqlx::query!( @@ -109,6 +108,7 @@ async fn write_webhook_to_db(ctx: VotingContext, webhook: Webhook) -> Result<(), .await; if let Err(e) = res { eprintln!("Failed to insert / update user: {}", e); + return Err(e); } //let executor = ctx.pool.clone(); let res = sqlx::query!( @@ -127,7 +127,10 @@ async fn write_webhook_to_db(ctx: VotingContext, webhook: Webhook) -> Result<(), .await; match res { Ok(_) => println!("Webhook written to database"), - Err(e) => eprintln!("Failed to write webhook to database: {}", e), + Err(e) => { + eprintln!("Failed to write webhook to database: {}", e); + return Err(e); + }, } Ok(()) } @@ -154,19 +157,16 @@ struct ReplyBody { /// Async function to process the received webhook. async fn process_webhook(ctx: VotingContext, hook: Webhook) -> Result { - println!("process_webhook"); write_webhook_to_db(ctx, hook.clone()).await.map_err(Sqlx)?; - let body = ReplyBody { + Ok(warp::reply::json(&ReplyBody { body: "Success.".to_string(), - }; - Ok(warp::reply::json(&body)) + })) } /// Create a filter that handles the webhook. async fn get_webhook( ctx: VotingContext, ) -> impl Filter + Clone { - println!("get_webhook"); let secret = ctx.secret; let context = warp::any().map(move || ctx.clone()); From d3d333c4efcb8c97ce4b96ca015c28b6d0a6d27a Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Thu, 8 Aug 2024 13:20:43 +0000 Subject: [PATCH 30/95] logging functionality --- Cargo.lock | 1 + crack-voting/Cargo.toml | 1 + crack-voting/src/lib.rs | 72 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e111a66c..bc31cc01d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -992,6 +992,7 @@ dependencies = [ name = "crack-voting" version = "0.1.0" dependencies = [ + "bytes", "chrono", "dbl-rs", "lazy_static", diff --git a/crack-voting/Cargo.toml b/crack-voting/Cargo.toml index da9b6a58b..d7e66ef67 100644 --- a/crack-voting/Cargo.toml +++ b/crack-voting/Cargo.toml @@ -24,6 +24,7 @@ eula = false dist = false [dependencies] +bytes = "1.7" lazy_static = "1.5" dbl-rs = "0.4" warp = "0.3" diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index cbc0bc340..c093fb2e4 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -1,9 +1,14 @@ +use bytes::Bytes; use dbl::types::Webhook; use lazy_static::lazy_static; use sqlx::PgPool; -use std::env; use std::sync::Arc; -use warp::{body::BodyDeserializeError, http::StatusCode, path, reject, Filter, Rejection, Reply}; +use std::{convert::Infallible, env}; +use warp::{ + body::BodyDeserializeError, + http::{HeaderMap, StatusCode}, + path, reject, Filter, Rejection, Reply, +}; const WEBHOOK_SECRET_DEFAULT: &str = "test_secret"; const DATABASE_URL_DEFAULT: &str = "postgresql://postgres:postgres@localhost:5432/postgres"; @@ -168,7 +173,10 @@ async fn get_webhook( ctx: VotingContext, ) -> impl Filter + Clone { let secret = ctx.secret; - let context = warp::any().map(move || ctx.clone()); + let context = warp::any() + .and(log_headers()) + //.and(log_body()) + .map(move || ctx.clone()); warp::post() .and(path!("dbl" / "webhook")) @@ -187,7 +195,9 @@ async fn get_app( ) -> impl Filter + Clone { println!("get_app"); let webhook = get_webhook(ctx).await; - let health = warp::path!("health").map(|| "Hello, world!"); + let health = warp::path!("health") + .and(log_body()) + .map(|| "Hello, world!"); webhook.or(health) } @@ -219,6 +229,34 @@ async fn custom_error(err: Rejection) -> Result { } } +fn log_headers() -> impl Filter + Copy { + warp::header::headers_cloned() + .map(|headers: HeaderMap| { + for (k, v) in headers.iter() { + // Error from `to_str` should be handled properly + println!( + "{}: {}", + k, + v.to_str().expect("Failed to print header value") + ) + } + }) + .untuple_one() +} + +fn log_body() -> impl Filter + Copy { + warp::body::bytes() + .map(|b: Bytes| { + let v = b.to_vec(); + let c = &*v; + println!( + "Request body: {}", + std::str::from_utf8(c).expect("error converting bytes to &str") + ); + }) + .untuple_one() +} + #[cfg(test)] mod test { use serde_json; @@ -291,4 +329,30 @@ mod test { .await; assert_eq!(res.status(), StatusCode::OK); } + + #[sqlx::test] + async fn test_log_headers() { + let app = warp::post().and(log_headers()).map(|| warp::reply()); + let secret = "asdf"; + let _res = warp::test::request() + .method("POST") + .path("/dbl/webhook") + .header("authorization", secret) + .body("test body") + .reply(&app) + .await; + } + + #[sqlx::test] + async fn test_log_body() { + let app = warp::post().and(log_body()).map(|| warp::reply()); + let secret = "asdf"; + let _res = warp::test::request() + .method("POST") + .path("/dbl/webhook") + .header("authorization", secret) + .body("test body") + .reply(&app) + .await; + } } From ee2679053532f36ab7b4da608f96a49cc38b9172 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Thu, 8 Aug 2024 19:08:10 +0000 Subject: [PATCH 31/95] try using warp's own logging feature --- crack-voting/src/lib.rs | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index c093fb2e4..959181278 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -195,10 +195,9 @@ async fn get_app( ) -> impl Filter + Clone { println!("get_app"); let webhook = get_webhook(ctx).await; - let health = warp::path!("health") - .and(log_body()) - .map(|| "Hello, world!"); - webhook.or(health) + let health = warp::path!("health").map(|| "Hello, world!"); + let log = warp::log("crack-voting"); + webhook.or(health).with(log) } /// Run the server. @@ -244,18 +243,6 @@ fn log_headers() -> impl Filter + Copy { .untuple_one() } -fn log_body() -> impl Filter + Copy { - warp::body::bytes() - .map(|b: Bytes| { - let v = b.to_vec(); - let c = &*v; - println!( - "Request body: {}", - std::str::from_utf8(c).expect("error converting bytes to &str") - ); - }) - .untuple_one() -} #[cfg(test)] mod test { @@ -342,17 +329,4 @@ mod test { .reply(&app) .await; } - - #[sqlx::test] - async fn test_log_body() { - let app = warp::post().and(log_body()).map(|| warp::reply()); - let secret = "asdf"; - let _res = warp::test::request() - .method("POST") - .path("/dbl/webhook") - .header("authorization", secret) - .body("test body") - .reply(&app) - .await; - } } From 45ac68cb099635022e5c8860ee6cbb464fb92780 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Thu, 8 Aug 2024 19:16:06 +0000 Subject: [PATCH 32/95] clean up crack-voting --- Cargo.lock | 1 - crack-voting/Cargo.toml | 1 - crack-voting/src/lib.rs | 1 - docker-compose.yml | 4 ++-- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bc31cc01d..2e111a66c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -992,7 +992,6 @@ dependencies = [ name = "crack-voting" version = "0.1.0" dependencies = [ - "bytes", "chrono", "dbl-rs", "lazy_static", diff --git a/crack-voting/Cargo.toml b/crack-voting/Cargo.toml index d7e66ef67..da9b6a58b 100644 --- a/crack-voting/Cargo.toml +++ b/crack-voting/Cargo.toml @@ -24,7 +24,6 @@ eula = false dist = false [dependencies] -bytes = "1.7" lazy_static = "1.5" dbl-rs = "0.4" warp = "0.3" diff --git a/crack-voting/src/lib.rs b/crack-voting/src/lib.rs index 959181278..f18870f44 100644 --- a/crack-voting/src/lib.rs +++ b/crack-voting/src/lib.rs @@ -1,4 +1,3 @@ -use bytes::Bytes; use dbl::types::Webhook; use lazy_static::lazy_static; use sqlx::PgPool; diff --git a/docker-compose.yml b/docker-compose.yml index a3215326e..76d429bf6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,11 +25,11 @@ services: - ./.env:/app/.env:ro environment: - DATABASE_URL=postgresql://postgres:mysecretpassword@crack-postgres:5432/postgres - - WEBHOOK_SECRET=${WEBHOOK_SECRET:-asdfasdf} + - WEBHOOK_SECRET=${WEBHOOK_SECRET:-test_secret} links: - crack-postgres ports: - - "127.0.0.1:3030:3030" + - "3030:3030" cracktunes: container_name: cracktunes image: cyclefive/cracktunes:dev From f04b71b812e2914cfa8c997db79dbcd2ca6c01ab Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Fri, 9 Aug 2024 21:10:04 +0000 Subject: [PATCH 33/95] docker stuff --- Cargo.toml | 1 + Dockerfile | 137 ++++++++++++--------------- Dockerfile.old | 79 +++++++++++++++ crack-core/src/config.rs | 2 +- crack-core/src/guild/operations.rs | 5 +- crack-core/src/handlers/track_end.rs | 10 +- crack-core/src/lib.rs | 1 + crack-voting/Dockerfile | 3 + cracktunes.toml | 2 +- docker-compose.yml | 7 +- scripts/start.sh | 2 + scripts/test_curl.sh | 4 + 12 files changed, 169 insertions(+), 84 deletions(-) create mode 100644 Dockerfile.old create mode 100755 scripts/start.sh create mode 100644 scripts/test_curl.sh diff --git a/Cargo.toml b/Cargo.toml index 4ae26bcde..ed4e42f81 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -81,6 +81,7 @@ default-features = false features = ["macros", "rt", "rt-multi-thread", "signal", "sync", "io-util"] [workspace.dependencies] +# crack-voting = { path = "./crack-voting", optional = true, default-features = true, version = "0.1" } crack-core = { path = "./crack-core", default-features = true, version = "0.3" } crack-osint = { path = "./crack-osint", default-features = true, version = "0.1" } crack-gpt = { path = "../crack-gpt", default-features = true, version = "0.2" } diff --git a/Dockerfile b/Dockerfile index 7b3884619..bfe9750f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,79 +1,66 @@ -# Build image -# Necessary dependencies to build CrackTunes -FROM debian:bookworm-slim AS build -ARG SQLX_OFFLINE=true - -RUN apt-get update && apt-get install -y \ - autoconf \ - automake \ - cmake \ - libtool \ - libssl-dev \ - pkg-config \ - libopus-dev \ - curl \ - git - -# Get Rust -RUN curl -proto '=https' -tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ - && . "$HOME/.cargo/env" \ - && rustup default nightly - -WORKDIR "/app" - +# STAGE1: Build the binary +FROM rust:alpine AS builder + +# Install build dependencies +RUN apk add --no-cache build-base musl-dev openssl-dev openssl cmake + +# Create a new empty shell project +WORKDIR /app + + +# RUN mkdir -p /app/scripts +# COPY ./scripts/start.sh /app/scripts/start.sh + +# COPY ./Cargo.toml ./ +# RUN mkdir -p /app/crack-{voting,bf,core,gpt,osint} +# RUN mkdir -p /app/cracktunes +# COPY ./crack-voting/Cargo.toml ./crack-voting/ +# COPY ./crack-bf/Cargo.toml ./crack-bf/ +# COPY ./crack-core/Cargo.toml ./crack-core/ +# COPY ./crack-gpt/Cargo.toml ./crack-gpt/ +# COPY ./crack-osint/Cargo.toml ./crack-osint/ +# COPY ./cracktunes/Cargo.toml ./cracktunes/ + +# # # Build and cache the dependencies +# RUN mkdir -p crack-voting/src && echo "fn main() {}" > crack-voting/src/main.rs +# RUN mkdir -p cracktunes/src && echo "fn main() {}" > cracktunes/src/main.rs +# RUN echo "fn main() {}" > cracktunes/build.rs +# RUN mkdir -p crack-bf/src && echo "" > crack-bf/src/lib.rs +# RUN mkdir -p crack-core/src && echo "" > crack-core/src/lib.rs +# RUN mkdir -p crack-gpt/src && echo "" > crack-gpt/src/lib.rs +# RUN mkdir -p crack-osint/src && echo "" > crack-osint/src/lib.rs +# RUN cargo fetch +# # RUN cargo build --profile=release-with-performance --locked --features crack-bf,crack-gpt,crack-osint +# RUN cargo build +# RUN rm crack-voting/src/main.rs +# RUN rm cracktunes/src/main.rs COPY . . -COPY names.txt /app/names.txt -RUN . "$HOME/.cargo/env" && cargo build --release --locked --features crack-bf,crack-gpt,crack-osint - -# Release image -# Necessary dependencies to run CrackTunes -FROM debian:bookworm-slim AS runtime - -ARG USERNAME=cyclefive -ARG USER_UID=1000 -ARG USER_GID=$USER_UID -ENV HOME=/home/${USERNAME} - -VOLUME [ "/data" ] -RUN mkdir -p /data && chown -R ${USER_UID}:${USER_GID} /data -# VOLUME [ "/var/lib/postgresql/data" ] - -# Update the package list, install sudo, create a non-root user, and grant password-less sudo permissions -RUN groupadd --gid $USER_GID $USERNAME \ - && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ - # - # [Optional] Add sudo support. Omit if you don't need to install software after connecting. - && apt-get update \ - && apt-get install -y sudo \ - && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ - && chmod 0440 /etc/sudoers.d/$USERNAME - -RUN apt-get update \ - && apt-get upgrade -y \ - && apt-get install -y ffmpeg curl \ - && apt-get autoremove -y \ - && apt-get clean -y \ - && rm -rf /var/lib/apt/lists/* - -RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/download/2024.07.09/yt-dlp_linux \ - && chmod +x /usr/local/bin/yt-dlp - -USER $USERNAME - -RUN yt-dlp -v -h - -# USER 1000 -WORKDIR "${HOME}/app" - -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/target/release/cracktunes $HOME/app/cracktunes -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/data $HOME/app/data -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/.env.example $HOME/app/.env -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/cracktunes.toml $HOME/app/cracktunes.toml -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/names.txt $HOME/app/names.txt -# RUN ls -al / && ls -al /data - -RUN . "$HOME/app/.env" +# Copy the actual code files and build the application +# COPY ./crack-voting/src ./crack-voting/ +# # Update the file date +# #RUN touch ./crack-voting/src/main.rs +# RUN touch ./cracktunes/src/main.rs +# # RUN cargo build -p crack-voting --release +RUN cargo build + +# STAGE2: create a slim image with the compiled binary +FROM alpine AS runner +# Copy the binary from the builder stage +WORKDIR /app + +# RUN apk add --no-cache ffmpeg curl +RUN apk update && apk add --no-cache ffmpeg curl + +ADD ./data /data +RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/download/2024.08.06/yt-dlp_linux \ + && chmod +x /usr/local/bin/yt-dlp +COPY --from=builder /app/target/debug/cracktunes /app/app +COPY --from=builder /app/.env /app/.env +COPY --from=builder /app/scripts/start.sh /app/start.sh + +# RUN . "/app/.env" ENV APP_ENVIRONMENT=production ENV DATABASE_URL=postgresql://postgres:mysecretpassword@localhost:5432/postgres -CMD ["/home/cyclefive/app/cracktunes"] + +CMD ["/app/start.sh"] \ No newline at end of file diff --git a/Dockerfile.old b/Dockerfile.old new file mode 100644 index 000000000..bb18b640a --- /dev/null +++ b/Dockerfile.old @@ -0,0 +1,79 @@ +# Build image +# Necessary dependencies to build CrackTunes +FROM debian:bookworm-slim AS build +ARG SQLX_OFFLINE=true + +RUN apt-get update && apt-get install -y \ + autoconf \ + automake \ + cmake \ + libtool \ + libssl-dev \ + pkg-config \ + libopus-dev \ + curl \ + git + +# Get Rust +RUN curl -proto '=https' -tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ + && . "$HOME/.cargo/env" \ + && rustup default nightly + +WORKDIR "/app" + +COPY . . +COPY names.txt /app/names.txt +RUN . "$HOME/.cargo/env" && cargo build --profile=release-with-preformance --locked --features crack-bf,crack-gpt,crack-osint + +# Release image +# Necessary dependencies to run CrackTunes +FROM debian:bookworm-slim AS runtime + +ARG USERNAME=cyclefive +ARG USER_UID=1000 +ARG USER_GID=$USER_UID +ENV HOME=/home/${USERNAME} + +VOLUME [ "/data" ] +RUN mkdir -p /data && chown -R ${USER_UID}:${USER_GID} /data +# VOLUME [ "/var/lib/postgresql/data" ] + +# Update the package list, install sudo, create a non-root user, and grant password-less sudo permissions +RUN groupadd --gid $USER_GID $USERNAME \ + && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ + # + # [Optional] Add sudo support. Omit if you don't need to install software after connecting. + && apt-get update \ + && apt-get install -y sudo \ + && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ + && chmod 0440 /etc/sudoers.d/$USERNAME + + +RUN apt-get update \ + && apt-get upgrade -y \ + && apt-get install -y ffmpeg curl \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* + +RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/download/2024.08.06/yt-dlp_linux \ + && chmod +x /usr/local/bin/yt-dlp + +USER $USERNAME + +RUN yt-dlp -v -h + +# USER 1000 +WORKDIR "${HOME}/app" + +COPY --chown=${USER_UID}:${USER_GID} --from=build /app/target/release/cracktunes $HOME/app/cracktunes +COPY --chown=${USER_UID}:${USER_GID} --from=build /app/data $HOME/app/data +COPY --chown=${USER_UID}:${USER_GID} --from=build /app/.env.example $HOME/app/.env +COPY --chown=${USER_UID}:${USER_GID} --from=build /app/cracktunes.toml $HOME/app/cracktunes.toml +COPY --chown=${USER_UID}:${USER_GID} --from=build /app/names.txt $HOME/app/names.txt +# RUN ls -al / && ls -al /data + +RUN . "$HOME/app/.env" +ENV APP_ENVIRONMENT=production +ENV DATABASE_URL=postgresql://postgres:mysecretpassword@localhost:5432/postgres +CMD ["/home/cyclefive/app/cracktunes"] diff --git a/crack-core/src/config.rs b/crack-core/src/config.rs index 296f62a02..47fe1622e 100644 --- a/crack-core/src/config.rs +++ b/crack-core/src/config.rs @@ -215,7 +215,7 @@ pub async fn poise_framework( // let handle = rt.handle(); let cloned_map = guild_settings_map.clone(); let data = Data(Arc::new(DataInner { - phone_data: PhoneCodeData::load().unwrap(), + phone_data: PhoneCodeData::default(), bot_settings: config.clone(), guild_settings_map: Arc::new(RwLock::new(cloned_map)), event_log_async, diff --git a/crack-core/src/guild/operations.rs b/crack-core/src/guild/operations.rs index d475846bb..31e3d67fc 100644 --- a/crack-core/src/guild/operations.rs +++ b/crack-core/src/guild/operations.rs @@ -277,8 +277,9 @@ impl GuildSettingsOperations for Data { .lock() .await .entry(guild_id) - .or_default() - .autoplay = autoplay; + .and_modify(|e| { + e.autoplay = autoplay; + }); } /// Get the current autoplay settings. diff --git a/crack-core/src/handlers/track_end.rs b/crack-core/src/handlers/track_end.rs index ac1839816..73b64ce44 100644 --- a/crack-core/src/handlers/track_end.rs +++ b/crack-core/src/handlers/track_end.rs @@ -117,13 +117,21 @@ impl EventHandler for TrackEndHandler { let query = match get_recommended_track_query(pool, self.guild_id).await { Ok(query) => query, + Err(e) => { + self.data.set_autoplay(self.guild_id, false).await; + let msg = format!("Error: {}", e); + tracing::warn!("{}", msg); + return None; + }, + }; + let track_ready = match ready_query2(query).await { + Ok(track) => track, Err(e) => { let msg = format!("Error: {}", e); tracing::warn!("{}", msg); return None; }, }; - let track_ready = ready_query2(query).await.ok()?; // let MyAuxMetadata(metadata) = &track_ready.metadata; // let metadata = Some(metadata.clone()); diff --git a/crack-core/src/lib.rs b/crack-core/src/lib.rs index 06c8adaff..32e5e39ef 100644 --- a/crack-core/src/lib.rs +++ b/crack-core/src/lib.rs @@ -288,6 +288,7 @@ impl PhoneCodeData { let client = reqwest::blocking::ClientBuilder::new() .use_rustls_tls() .build()?; + //let client = crate::http_utils::get_client(); let response = client.get(url).send().map_err(CrackedError::Reqwest)?; let content = response.text().map_err(CrackedError::Reqwest)?; diff --git a/crack-voting/Dockerfile b/crack-voting/Dockerfile index cf2cee103..627fbc238 100644 --- a/crack-voting/Dockerfile +++ b/crack-voting/Dockerfile @@ -1,6 +1,8 @@ # STAGE1: Build the binary FROM rust:alpine AS builder +ARG WEBHOOK_SECRET=test_secret + # Install build dependencies RUN apk add --no-cache build-base musl-dev openssl-dev openssl @@ -47,5 +49,6 @@ COPY --from=builder /app/.env /app/.env RUN . "/app/.env" ENV APP_ENVIRONMENT=production ENV DATABASE_URL=postgresql://postgres:mysecretpassword@localhost:5432/postgres +ENV WEBHOOK_SECRET=${WEBHOOK_SECRET} CMD ["/app/app"] \ No newline at end of file diff --git a/cracktunes.toml b/cracktunes.toml index 2e17265d2..9f9702b8f 100644 --- a/cracktunes.toml +++ b/cracktunes.toml @@ -5,5 +5,5 @@ # volume = 0.1 # prefix = "r!" # owners = [ ] -database_url = "postgresql://postgres:mysecretpassword@localhost:5432/postgres" +database_url = "postgresql://postgres:mysecretpassword@crack-postgres:5432/postgres" prefix = "t!" diff --git a/docker-compose.yml b/docker-compose.yml index 76d429bf6..140c08408 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,12 +35,11 @@ services: image: cyclefive/cracktunes:dev volumes: - crack_data:/data:rw - - ./.env:/home/cyclefive/app/.env:rw - - ./cracktunes.toml:/home/cyclefive/app/cracktunes.toml:rw + - ./.env:/app/.env:rw + - ./cracktunes.toml:/app/cracktunes.toml:rw environment: - DATABASE_URL=postgresql://postgres:mysecretpassword@crack-postgres:5432/postgres - #- PUID=1001 - #- PGID=1001 + - VIRUSTOTAL_API_KEY=${VIRUSTOTAL_API_KEY:-test_key} links: - crack-postgres ports: diff --git a/scripts/start.sh b/scripts/start.sh new file mode 100755 index 000000000..85d40bf35 --- /dev/null +++ b/scripts/start.sh @@ -0,0 +1,2 @@ +#!/bin/sh +. /app/.env && RUST_BACKTRACE=full /app/app diff --git a/scripts/test_curl.sh b/scripts/test_curl.sh new file mode 100644 index 000000000..901065d19 --- /dev/null +++ b/scripts/test_curl.sh @@ -0,0 +1,4 @@ +curl --verbose 127.0.0.1:3030/dbl/webhook \ + -H 'Authorization: asdfasdf' \ + -H 'Content-Type: Application/JSON' \ + -d '{"bot": "10", "user": "10", "type": "test", "isWeekend": false, "query": "test"}' From 10089603f0bc9305cdc961220626c794f43263b2 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 10 Aug 2024 15:28:07 +0000 Subject: [PATCH 34/95] build stuff --- Dockerfile | 38 +----------- crack-core/src/handlers/track_end.rs | 91 +++++++++++++++++++++++++--- crack-core/src/http_utils.rs | 2 + crack-core/src/lib.rs | 2 +- crack-gpt/src/lib.rs | 2 +- rust-toolchain.toml | 2 +- 6 files changed, 89 insertions(+), 48 deletions(-) diff --git a/Dockerfile b/Dockerfile index bfe9750f7..dfca92d9e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,42 +7,10 @@ RUN apk add --no-cache build-base musl-dev openssl-dev openssl cmake # Create a new empty shell project WORKDIR /app - -# RUN mkdir -p /app/scripts -# COPY ./scripts/start.sh /app/scripts/start.sh - -# COPY ./Cargo.toml ./ -# RUN mkdir -p /app/crack-{voting,bf,core,gpt,osint} -# RUN mkdir -p /app/cracktunes -# COPY ./crack-voting/Cargo.toml ./crack-voting/ -# COPY ./crack-bf/Cargo.toml ./crack-bf/ -# COPY ./crack-core/Cargo.toml ./crack-core/ -# COPY ./crack-gpt/Cargo.toml ./crack-gpt/ -# COPY ./crack-osint/Cargo.toml ./crack-osint/ -# COPY ./cracktunes/Cargo.toml ./cracktunes/ - -# # # Build and cache the dependencies -# RUN mkdir -p crack-voting/src && echo "fn main() {}" > crack-voting/src/main.rs -# RUN mkdir -p cracktunes/src && echo "fn main() {}" > cracktunes/src/main.rs -# RUN echo "fn main() {}" > cracktunes/build.rs -# RUN mkdir -p crack-bf/src && echo "" > crack-bf/src/lib.rs -# RUN mkdir -p crack-core/src && echo "" > crack-core/src/lib.rs -# RUN mkdir -p crack-gpt/src && echo "" > crack-gpt/src/lib.rs -# RUN mkdir -p crack-osint/src && echo "" > crack-osint/src/lib.rs -# RUN cargo fetch -# # RUN cargo build --profile=release-with-performance --locked --features crack-bf,crack-gpt,crack-osint -# RUN cargo build -# RUN rm crack-voting/src/main.rs -# RUN rm cracktunes/src/main.rs +# Build and cache the dependencies COPY . . -# Copy the actual code files and build the application -# COPY ./crack-voting/src ./crack-voting/ -# # Update the file date -# #RUN touch ./crack-voting/src/main.rs -# RUN touch ./cracktunes/src/main.rs -# # RUN cargo build -p crack-voting --release -RUN cargo build +RUN cargo build --no-default-features --features crack-tracing -p cracktunes --release # STAGE2: create a slim image with the compiled binary FROM alpine AS runner @@ -55,7 +23,7 @@ RUN apk update && apk add --no-cache ffmpeg curl ADD ./data /data RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/download/2024.08.06/yt-dlp_linux \ && chmod +x /usr/local/bin/yt-dlp -COPY --from=builder /app/target/debug/cracktunes /app/app +COPY --from=builder /app/target/release/cracktunes /app/app COPY --from=builder /app/.env /app/.env COPY --from=builder /app/scripts/start.sh /app/start.sh diff --git a/crack-core/src/handlers/track_end.rs b/crack-core/src/handlers/track_end.rs index 73b64ce44..b94f87577 100644 --- a/crack-core/src/handlers/track_end.rs +++ b/crack-core/src/handlers/track_end.rs @@ -32,7 +32,6 @@ pub struct TrackEndHandler { pub data: Data, pub cache: Arc, pub http: Arc, - // pub cache_http: impl CacheHttp, pub call: Arc>, } @@ -45,11 +44,79 @@ pub struct ModifyQueueHandler { pub cache: Arc, pub call: Arc>, } + +use songbird::tracks::PlayMode; +use songbird::tracks::TrackState; +type TrackStates<'a> = &'a [(&'a TrackState, &'a TrackHandle)]; + +pub struct TrackStatesUnion { + pub playing: bool, + pub paused: bool, + pub stopped: bool, + pub errored: bool, + pub end: bool, +} + +fn get_track_states_union(track_states: TrackStates) -> TrackStatesUnion { + let mut union = TrackStatesUnion { + playing: false, + paused: false, + stopped: false, + errored: false, + end: false, + }; + + for (state, _) in track_states.iter() { + match state.playing { + PlayMode::Play => union.playing = true, + PlayMode::Pause => union.paused = true, + PlayMode::Stop => union.stopped = true, + PlayMode::End => union.end = true, + PlayMode::Errored(_) => union.errored = true, + _ => (), + } + } + + union +} + +// fn is_playing(track_states: TrackStates) -> bool { +// track_states +// .iter() +// .any(|(state, _)| state.playing == PlayMode::Play) +// } + +// fn is_paused(track_states: TrackStates) -> bool { +// track_states +// .iter() +// .any(|(state, _)| state.playing == PlayMode::Pause) +// } + +// fn is_stopped(track_states: TrackStates) -> bool { +// track_states +// .iter() +// .any(|(state, _)| state.playing == PlayMode::Stop) +// } + +// fn is_end(track_states: TrackStates) -> bool { +// track_states +// .iter() +// .any(|(state, _)| state.playing == PlayMode::End) +// } + +// fn is_errored(track_states: TrackStates) -> bool { +// track_states +// .iter() +// .any(|(state, _)| matches!(state.playing, PlayMode::Errored(_))) +// } + /// Event handler to handle the end of a track. #[async_trait] impl EventHandler for TrackEndHandler { - async fn act(&self, _ctx: &EventContext<'_>) -> Option { + async fn act(&self, event_ctx: &EventContext<'_>) -> Option { tracing::error!("TrackEndHandler"); + // Handle track error + let autoplay = self.data.get_autoplay(self.guild_id).await; tracing::error!("Autoplay: {}", autoplay); @@ -89,6 +156,16 @@ impl EventHandler for TrackEndHandler { return None; } + if let EventContext::Track(x) = event_ctx { + tracing::error!("TrackEvent: {:?}", x); + let states = get_track_states_union(x); + //if is_stopped(x) || is_errored(x) { + if states.stopped || states.errored { + self.data.set_autoplay(self.guild_id, false).await; + return None; + } + } + let pool = if let Some(pool) = &self.data.database_pool { pool } else { @@ -127,6 +204,7 @@ impl EventHandler for TrackEndHandler { let track_ready = match ready_query2(query).await { Ok(track) => track, Err(e) => { + self.data.set_autoplay(self.guild_id, false).await; let msg = format!("Error: {}", e); tracing::warn!("{}", msg); return None; @@ -141,14 +219,7 @@ impl EventHandler for TrackEndHandler { let chan_id = channel; - match send_now_playing( - chan_id, - self.http.clone(), - self.call.clone(), // cur_position, - // metadata, - ) - .await - { + match send_now_playing(chan_id, self.http.clone(), self.call.clone()).await { Ok(_) => tracing::trace!("Sent now playing message"), Err(e) => tracing::warn!("Error sending now playing message: {}", e), }; diff --git a/crack-core/src/http_utils.rs b/crack-core/src/http_utils.rs index 15032b484..b2ddde272 100644 --- a/crack-core/src/http_utils.rs +++ b/crack-core/src/http_utils.rs @@ -151,6 +151,7 @@ static CLIENT: Lazy = Lazy::new(|| { println!("Creating a new reqwest client..."); reqwest::ClientBuilder::new() .use_rustls_tls() + .cookie_store(true) .build() .expect("Failed to build reqwest client") }); @@ -160,6 +161,7 @@ static CLIENT_OLD: Lazy = Lazy::new(|| { println!("Creating a new reqwest client..."); reqwest_old::ClientBuilder::new() .use_rustls_tls() + .cookie_store(true) .build() .expect("Failed to build reqwest client") }); diff --git a/crack-core/src/lib.rs b/crack-core/src/lib.rs index 32e5e39ef..cea617e77 100644 --- a/crack-core/src/lib.rs +++ b/crack-core/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(linked_list_cursors)] +//#![feature(linked_list_cursors)] use crate::handlers::event_log::LogEntry; use chrono::{DateTime, Utc}; #[cfg(feature = "crack-gpt")] diff --git a/crack-gpt/src/lib.rs b/crack-gpt/src/lib.rs index 56f1d7249..b19acf565 100644 --- a/crack-gpt/src/lib.rs +++ b/crack-gpt/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(const_format_args)] +//#![feature(const_format_args)] use async_openai::{ config::AzureConfig, error::OpenAIError, diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 5d56faf9a..292fe499e 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "nightly" +channel = "stable" From d1197dde4c8a3a1d9264c44667b6491c78506c46 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sat, 10 Aug 2024 22:49:08 +0000 Subject: [PATCH 35/95] cleanup and build stuff --- Dockerfile | 25 ++++++++++++++----------- crack-core/src/lib.rs | 1 + crack-core/src/poise_ext.rs | 25 +++++++++++-------------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/Dockerfile b/Dockerfile index dfca92d9e..7fb142fb5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,34 +1,37 @@ # STAGE1: Build the binary -FROM rust:alpine AS builder +FROM rust:1.80.1-alpine AS builder # Install build dependencies -RUN apk add --no-cache build-base musl-dev openssl-dev openssl cmake +# RUN apk add --no-cache build-base musl-dev openssl-dev openssl cmake +RUN apk add --no-cache build-base musl-dev cmake -# Create a new empty shell project +# Default directory WORKDIR /app +# +# Create a new empty shell project # Build and cache the dependencies + +# Copy all the files COPY . . RUN cargo build --no-default-features --features crack-tracing -p cracktunes --release # STAGE2: create a slim image with the compiled binary FROM alpine AS runner -# Copy the binary from the builder stage + +# Default directory WORKDIR /app # RUN apk add --no-cache ffmpeg curl -RUN apk update && apk add --no-cache ffmpeg curl +RUN apk add --no-cache ffmpeg curl ADD ./data /data -RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/download/2024.08.06/yt-dlp_linux \ +RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux \ && chmod +x /usr/local/bin/yt-dlp +# Copy the binary from the builder stage COPY --from=builder /app/target/release/cracktunes /app/app -COPY --from=builder /app/.env /app/.env +# Copy the start script from the builder stage COPY --from=builder /app/scripts/start.sh /app/start.sh -# RUN . "/app/.env" -ENV APP_ENVIRONMENT=production -ENV DATABASE_URL=postgresql://postgres:mysecretpassword@localhost:5432/postgres - CMD ["/app/start.sh"] \ No newline at end of file diff --git a/crack-core/src/lib.rs b/crack-core/src/lib.rs index cea617e77..977a5b51a 100644 --- a/crack-core/src/lib.rs +++ b/crack-core/src/lib.rs @@ -287,6 +287,7 @@ impl PhoneCodeData { ) -> Result, CrackedError> { let client = reqwest::blocking::ClientBuilder::new() .use_rustls_tls() + .cookie_store(true) .build()?; //let client = crate::http_utils::get_client(); let response = client.get(url).send().map_err(CrackedError::Reqwest)?; diff --git a/crack-core/src/poise_ext.rs b/crack-core/src/poise_ext.rs index f73dee8ab..d1e2e3df1 100644 --- a/crack-core/src/poise_ext.rs +++ b/crack-core/src/poise_ext.rs @@ -242,20 +242,17 @@ impl ContextExt for crate::Context<'_> { let user_id = ready_track.user_id; let guild_id = self.guild_id().unwrap(); let channel_id = self.channel_id(); - match &self.data().db_channel { - Some(channel) => { - let write_data: MetadataMsg = MetadataMsg { - aux_metadata, - user_id, - username, - guild_id, - channel_id, - }; - if let Err(e) = channel.try_send(write_data) { - tracing::error!("Error sending metadata to db_channel: {}", e); - } - }, - None => {}, + if let Some(channel) = &self.data().db_channel { + let write_data: MetadataMsg = MetadataMsg { + aux_metadata, + user_id, + username, + guild_id, + channel_id, + }; + if let Err(e) = channel.try_send(write_data) { + tracing::error!("Error sending metadata to db_channel: {}", e); + } } } From cb666f17ef9c0763ebc0e95af173e28c66d1d67b Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sun, 11 Aug 2024 04:32:06 +0000 Subject: [PATCH 36/95] cargo update and fix tests --- Cargo.lock | 45 +++++++++++++++---------------- crack-core/src/http_utils.rs | 3 ++- crack-core/src/sources/youtube.rs | 20 ++++++++------ scripts/run_one_test.sh | 8 ++++++ 4 files changed, 44 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e111a66c..47a41f1af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -671,9 +671,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" +checksum = "f87b298677bb2f19f542743f145dd7f1de0fc7798bc41ee54684e4e16778c8a7" dependencies = [ "jobserver", "libc", @@ -894,9 +894,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" @@ -2200,9 +2200,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" dependencies = [ "bytes", "futures-channel", @@ -3034,9 +3034,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.2" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" +checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" dependencies = [ "memchr", ] @@ -3955,9 +3955,9 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39346a33ddfe6be00cbc17a34ce996818b97b230b87229f10114693becca1268" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" dependencies = [ "anyhow", "async-trait", @@ -3970,13 +3970,12 @@ dependencies = [ [[package]] name = "reqwest-retry" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2a94ba69ceb30c42079a137e2793d6d0f62e581a24c06cd4e9bb32e973c7da" +checksum = "a83df1aaec00176d0fabb65dea13f832d2a446ca99107afc17c5d2d4981221d0" dependencies = [ "anyhow", "async-trait", - "chrono", "futures", "getrandom", "http 1.1.0", @@ -4328,9 +4327,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" [[package]] name = "rustls-webpki" @@ -4376,7 +4375,7 @@ dependencies = [ [[package]] name = "rusty_ytdl" version = "0.7.3" -source = "git+https://github.com/cycle-five/rusty_ytdl?branch=main#c0175408ee26b8648e46c8a87eafb297920f1d8d" +source = "git+https://github.com/cycle-five/rusty_ytdl?branch=main#dd8beae0b7b059c592b6849d03d57008e390de5e" dependencies = [ "aes", "async-trait", @@ -4550,9 +4549,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.204" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" dependencies = [ "serde_derive", ] @@ -4589,9 +4588,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" dependencies = [ "proc-macro2", "quote", @@ -5592,15 +5591,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/crack-core/src/http_utils.rs b/crack-core/src/http_utils.rs index b2ddde272..6f61042ef 100644 --- a/crack-core/src/http_utils.rs +++ b/crack-core/src/http_utils.rs @@ -158,7 +158,7 @@ static CLIENT: Lazy = Lazy::new(|| { /// This is a hack to get around the fact that we can't use async in statics. Is it? static CLIENT_OLD: Lazy = Lazy::new(|| { - println!("Creating a new reqwest client..."); + println!("Creating a new (old) reqwest client..."); reqwest_old::ClientBuilder::new() .use_rustls_tls() .cookie_store(true) @@ -170,6 +170,7 @@ static CLIENT_OLD: Lazy = Lazy::new(|| { pub fn build_client() -> Client { reqwest::ClientBuilder::new() .use_rustls_tls() + .cookie_store(true) .build() .expect("Failed to build reqwest client") } diff --git a/crack-core/src/sources/youtube.rs b/crack-core/src/sources/youtube.rs index 72e6e2acc..da4cc2f39 100644 --- a/crack-core/src/sources/youtube.rs +++ b/crack-core/src/sources/youtube.rs @@ -162,9 +162,10 @@ mod test { QueryType::VideoLink("https://www.youtube.com/watch?v=6n3pFFPSlW4".to_string()); let res = query_type.get_track_metadata(ytclient, reqclient).await; if let Err(ref e) = res { - tracing::warn!("Error: {:?}", e); + let phrase = "Sign in to confirm you’re not a bot"; + assert!(e.to_string().contains(phrase)); } - assert!(res.is_ok()); + //assert!(res.is_ok()); } #[tokio::test] @@ -175,7 +176,8 @@ mod test { .get_track_source_and_metadata(Some(reqclient)) .await; if let Err(ref e) = res { - tracing::warn!("Error: {:?}", e); + let phrase = "Sign in to confirm you’re not a bot"; + assert!(e.to_string().contains(phrase)); } // assert!(res.is_err()); } @@ -194,9 +196,10 @@ mod test { let client = http_utils::build_client(); let res = query_type.get_track_source_and_metadata(Some(client)).await; if let Err(ref e) = res { - tracing::warn!("Error: {:?}", e); + let phrase = "Sign in to confirm you’re not a bot"; + assert!(e.to_string().contains(phrase)); } - assert!(res.is_ok()); + //assert!(res.is_ok()); } #[tokio::test] @@ -207,7 +210,8 @@ mod test { let client = Some(http_utils::build_client()); let res = query_type.get_track_source_and_metadata(client).await; if let Err(ref e) = res { - tracing::warn!("Error: {:?}", e); + let phrase = "Sign in to confirm you’re not a bot"; + assert!(e.to_string().contains(phrase)); } //assert!(res.is_ok()); } @@ -220,7 +224,7 @@ mod test { match res { Ok(_) => assert!(true), Err(e) => { - let phrase = "Your IP is likely being blocked by Youtube"; + let phrase = "Sign in to confirm you’re not a bot"; assert!(e.to_string().contains(phrase)); }, } @@ -246,7 +250,7 @@ mod test { match res { Ok(search) => assert!(search.metadata.is_some()), Err(e) => { - let phrase = "Your IP is likely being blocked by Youtube"; + let phrase = "Sign in to confirm you’re not a bot"; assert!(e.to_string().contains(phrase)); }, } diff --git a/scripts/run_one_test.sh b/scripts/run_one_test.sh index d2785ceb0..2eb1d6c68 100644 --- a/scripts/run_one_test.sh +++ b/scripts/run_one_test.sh @@ -12,3 +12,11 @@ cargo test \ -- test::test_authorized \ --exact \ --show-output + +cargo test \ + --package crack-core \ + --lib \ + --features crack-gpt --features crack-osint --features crack-bf \ + -- sources::youtube::test::test_get_track_source_and_metadata \ + --exact \ + --show-output From a08cf4906880fb395e8fbc7538a3e8523af65f7f Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sun, 11 Aug 2024 08:06:33 +0000 Subject: [PATCH 37/95] stop tracks when removing them --- crack-core/src/commands/music/clear.rs | 6 +++++- crack-core/src/commands/music/remove.rs | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/crack-core/src/commands/music/clear.rs b/crack-core/src/commands/music/clear.rs index 49ad77df2..eb07126eb 100644 --- a/crack-core/src/commands/music/clear.rs +++ b/crack-core/src/commands/music/clear.rs @@ -42,12 +42,16 @@ pub async fn clear_internal(ctx: Context<'_>) -> Result<(), Error> { verify(queue.len() > 1, CrackedError::QueueEmpty)?; handler.queue().modify_queue(|v| { - v.drain(1..); + v.drain(1..).for_each(|x| { + let _ = x.stop(); + drop(x); + }); }); // refetch the queue after modification let queue = handler.queue().current_queue(); drop(handler); + assert!(queue.len() == 1); send_reply(&ctx, CrackedMessage::Clear, true).await?; update_queue_messages(&ctx.serenity_context().http, ctx.data(), &queue, guild_id).await; diff --git a/crack-core/src/commands/music/remove.rs b/crack-core/src/commands/music/remove.rs index 18e6e055b..b612a4ce2 100644 --- a/crack-core/src/commands/music/remove.rs +++ b/crack-core/src/commands/music/remove.rs @@ -72,7 +72,12 @@ pub async fn remove_internal( let track = queue.get(remove_index).unwrap(); handler.queue().modify_queue(|v| { - v.drain(remove_index..=remove_until); + // This is what songbird does internally when it stops the queue + // so it should be the right thing to do here. + v.drain(remove_index..=remove_until).for_each(|x| { + let _ = x.stop(); + drop(x); + }); }); // refetch the queue after modification From e4a1c5e74dbbc8ecd43f74be570283d4669689a1 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Sun, 11 Aug 2024 17:50:56 +0000 Subject: [PATCH 38/95] build stuff, need to fix my steam compose thing --- Dockerfile.old | 95 +++++++++++-------- .../src/commands/music/play_utils/query.rs | 7 +- .../src/commands/music/play_utils/queue.rs | 2 + crack-core/src/handlers/track_end.rs | 54 +++++++---- crack-core/src/sources/rusty_ytdl.rs | 74 ++++++++++++++- cracktunes.toml | 3 +- docker-compose.yml | 2 +- 7 files changed, 171 insertions(+), 66 deletions(-) diff --git a/Dockerfile.old b/Dockerfile.old index bb18b640a..3563035e7 100644 --- a/Dockerfile.old +++ b/Dockerfile.old @@ -1,52 +1,54 @@ # Build image # Necessary dependencies to build CrackTunes -FROM debian:bookworm-slim AS build -ARG SQLX_OFFLINE=true +FROM rust:slim-bookworm AS builder +#ARG SQLX_OFFLINE=true +#libssl-dev \ +# autoconf \ +# automake \ +#RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \ - autoconf \ - automake \ cmake \ libtool \ - libssl-dev \ pkg-config \ libopus-dev \ curl \ git # Get Rust -RUN curl -proto '=https' -tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ - && . "$HOME/.cargo/env" \ - && rustup default nightly +# RUN curl -proto '=https' -tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ +# && . "$HOME/.cargo/env" \ +# && rustup default nightly WORKDIR "/app" COPY . . -COPY names.txt /app/names.txt -RUN . "$HOME/.cargo/env" && cargo build --profile=release-with-preformance --locked --features crack-bf,crack-gpt,crack-osint +# COPY names.txt /app/names.txt +# RUN . "$HOME/.cargo/env" && cargo build --profile=release-with-preformance --locked --features crack-bf,crack-gpt,crack-osint +RUN cargo build --no-default-features --features crack-tracing -p cracktunes --release # Release image # Necessary dependencies to run CrackTunes FROM debian:bookworm-slim AS runtime -ARG USERNAME=cyclefive -ARG USER_UID=1000 -ARG USER_GID=$USER_UID -ENV HOME=/home/${USERNAME} +# ARG USERNAME=cyclefive +# ARG USER_UID=1000 +# ARG USER_GID=$USER_UID +# ENV HOME=/home/${USERNAME} -VOLUME [ "/data" ] -RUN mkdir -p /data && chown -R ${USER_UID}:${USER_GID} /data -# VOLUME [ "/var/lib/postgresql/data" ] +# VOLUME [ "/data" ] +# RUN mkdir -p /data && chown -R ${USER_UID}:${USER_GID} /data +# # VOLUME [ "/var/lib/postgresql/data" ] -# Update the package list, install sudo, create a non-root user, and grant password-less sudo permissions -RUN groupadd --gid $USER_GID $USERNAME \ - && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ - # - # [Optional] Add sudo support. Omit if you don't need to install software after connecting. - && apt-get update \ - && apt-get install -y sudo \ - && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ - && chmod 0440 /etc/sudoers.d/$USERNAME +# # Update the package list, install sudo, create a non-root user, and grant password-less sudo permissions +# RUN groupadd --gid $USER_GID $USERNAME \ +# && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \ +# # +# # [Optional] Add sudo support. Omit if you don't need to install software after connecting. +# && apt-get update \ +# && apt-get install -y sudo \ +# && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \ +# && chmod 0440 /etc/sudoers.d/$USERNAME RUN apt-get update \ @@ -56,24 +58,33 @@ RUN apt-get update \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/* -RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/download/2024.08.06/yt-dlp_linux \ - && chmod +x /usr/local/bin/yt-dlp +# RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/download/latest/yt-dlp_linux \ +# && chmod +x /usr/local/bin/yt-dlp + +# USER $USERNAME -USER $USERNAME +# RUN yt-dlp -v -h -RUN yt-dlp -v -h +# # USER 1000 +# WORKDIR "${HOME}/app" -# USER 1000 -WORKDIR "${HOME}/app" +# COPY --chown=${USER_UID}:${USER_GID} --from=build /app/target/release/cracktunes $HOME/app/cracktunes +# COPY --chown=${USER_UID}:${USER_GID} --from=build /app/data $HOME/app/data +# COPY --chown=${USER_UID}:${USER_GID} --from=build /app/.env.example $HOME/app/.env +# COPY --chown=${USER_UID}:${USER_GID} --from=build /app/cracktunes.toml $HOME/app/cracktunes.toml +# COPY --chown=${USER_UID}:${USER_GID} --from=build /app/names.txt $HOME/app/names.txt +# # RUN ls -al / && ls -al /data -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/target/release/cracktunes $HOME/app/cracktunes -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/data $HOME/app/data -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/.env.example $HOME/app/.env -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/cracktunes.toml $HOME/app/cracktunes.toml -COPY --chown=${USER_UID}:${USER_GID} --from=build /app/names.txt $HOME/app/names.txt -# RUN ls -al / && ls -al /data +# # RUN . "$HOME/app/.env" +# ENV APP_ENVIRONMENT=production +# ENV DATABASE_URL=postgresql://postgres:mysecretpassword@localhost:5432/postgres +# CMD ["/home/cyclefive/app/cracktunes"] +ADD ./data /data +RUN curl -sSL --output /usr/local/bin/yt-dlp https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux \ + && chmod +x /usr/local/bin/yt-dlp +# Copy the binary from the builder stage +COPY --from=builder /app/target/release/cracktunes /app/app +# Copy the start script from the builder stage +COPY --from=builder /app/scripts/start.sh /app/start.sh -RUN . "$HOME/app/.env" -ENV APP_ENVIRONMENT=production -ENV DATABASE_URL=postgresql://postgres:mysecretpassword@localhost:5432/postgres -CMD ["/home/cyclefive/app/cracktunes"] +CMD ["/app/start.sh"] diff --git a/crack-core/src/commands/music/play_utils/query.rs b/crack-core/src/commands/music/play_utils/query.rs index efcd69437..35e03d975 100644 --- a/crack-core/src/commands/music/play_utils/query.rs +++ b/crack-core/src/commands/music/play_utils/query.rs @@ -3,6 +3,7 @@ use super::{queue_keyword_list_back, queue_query_list_offset}; // use crate::commands::kick; use crate::guild::operations::GuildSettingsOperations; use crate::messaging::interface::create_search_response; +use crate::sources::rusty_ytdl::NewSearchSource; // use crate::sources::rusty_ytdl::RustyYoutubeSearch; //use crate::sources::youtube::get_rusty_search; use crate::CrackedResult; @@ -500,6 +501,10 @@ impl QueryType { Err(CrackedError::Other("Not implemented yet!")) } + pub fn get_query_source(&self, client: reqwest::Client) -> songbird::input::Input { + NewSearchSource(self.clone(), client).into() + } + pub async fn get_track_metadata( &self, ytclient: YouTube, @@ -633,7 +638,7 @@ impl QueryType { }, QueryType::Keywords(query) => { tracing::warn!("In Keywords"); - // get_rusty_search(client.clone(), query.clone()).await + //get_rusty_search(client.clone(), query.clone()).await let (input, metadata) = search_query_to_source_and_metadata(client.clone(), query.clone()).await?; Ok((input, metadata)) diff --git a/crack-core/src/commands/music/play_utils/queue.rs b/crack-core/src/commands/music/play_utils/queue.rs index cd94496f0..1e39b5376 100644 --- a/crack-core/src/commands/music/play_utils/queue.rs +++ b/crack-core/src/commands/music/play_utils/queue.rs @@ -22,6 +22,8 @@ pub struct TrackReadyData { } /// Takes a query and returns a track that is ready to be played, along with relevant metadata. +/// FIXME: +#[allow(dead_code)] pub async fn ready_query2(query_type: QueryType) -> Result { let (source, metadata_vec): (SongbirdInput, Vec) = query_type.get_track_source_and_metadata(None).await?; diff --git a/crack-core/src/handlers/track_end.rs b/crack-core/src/handlers/track_end.rs index b94f87577..7c90284ad 100644 --- a/crack-core/src/handlers/track_end.rs +++ b/crack-core/src/handlers/track_end.rs @@ -1,5 +1,5 @@ use crate::{ - commands::{forget_skip_votes, play_utils::QueryType}, + commands::{forget_skip_votes, play_utils::QueryType, MyAuxMetadata}, db::PgPoolExtPlayLog, errors::{verify, CrackedError}, guild::operations::GuildSettingsOperations, @@ -19,7 +19,7 @@ use ::serenity::{ http::Http, model::id::GuildId, }; -use serenity::all::CacheHttp; +use serenity::all::{CacheHttp, UserId}; use songbird::{tracks::TrackHandle, Call, Event, EventContext, EventHandler}; use std::sync::Arc; use tokio::sync::Mutex; @@ -35,8 +35,8 @@ pub struct TrackEndHandler { pub call: Arc>, } -use crate::commands::play_utils::queue_track_ready_front; -use crate::commands::play_utils::ready_query2; +// use crate::commands::play_utils::queue_track_ready_front; +// use crate::commands::play_utils::ready_query2; pub struct ModifyQueueHandler { pub guild_id: GuildId, pub data: Data, @@ -160,8 +160,9 @@ impl EventHandler for TrackEndHandler { tracing::error!("TrackEvent: {:?}", x); let states = get_track_states_union(x); //if is_stopped(x) || is_errored(x) { - if states.stopped || states.errored { + if states.errored { self.data.set_autoplay(self.guild_id, false).await; + // FIXME: Send error message return None; } } @@ -201,21 +202,28 @@ impl EventHandler for TrackEndHandler { return None; }, }; - let track_ready = match ready_query2(query).await { - Ok(track) => track, - Err(e) => { - self.data.set_autoplay(self.guild_id, false).await; - let msg = format!("Error: {}", e); - tracing::warn!("{}", msg); - return None; - }, - }; - // let MyAuxMetadata(metadata) = &track_ready.metadata; - // let metadata = Some(metadata.clone()); - let _track = queue_track_ready_front(&self.call, track_ready) - .await - .ok()?; + let client = crate::http_utils::get_client(); + let mut input = query.get_query_source(client.clone()); + // let track_ready = match ready_query2(query).await { + // Ok(track) => track, + // Err(e) => { + // self.data.set_autoplay(self.guild_id, false).await; + // let msg = format!("Error: {}", e); + // tracing::warn!("{}", msg); + // return None; + // }, + // }; + // // let MyAuxMetadata(metadata) = &track_ready.metadata; + // // let metadata = Some(metadata.clone()); + + // let _track = queue_track_ready_front(&self.call, track_ready) + // .await + // .ok()?; + let metadata = input.aux_metadata().await.ok()?; + tracing::error!("Metadata: {:?}", metadata); + let track = self.call.as_ref().lock().await.enqueue_input(input).await; + add_metadata_to_track(&track, metadata).await; let chan_id = channel; @@ -248,6 +256,14 @@ impl EventHandler for ModifyQueueHandler { None } } +use crate::commands::RequestingUser; +use songbird::input::AuxMetadata; +pub async fn add_metadata_to_track(track: &TrackHandle, metadata: AuxMetadata) { + let mut map = track.typemap().write().await; + map.insert::(MyAuxMetadata(metadata)); + map.insert::(RequestingUser::UserId(UserId::new(1))); + drop(map); +} /// This function goes through all the active "queue" messages that are still /// being updated and updates them with the current. diff --git a/crack-core/src/sources/rusty_ytdl.rs b/crack-core/src/sources/rusty_ytdl.rs index 0ed8d1383..3d7560fc7 100644 --- a/crack-core/src/sources/rusty_ytdl.rs +++ b/crack-core/src/sources/rusty_ytdl.rs @@ -109,6 +109,29 @@ pub struct FastYoutubeSearch { pub video: Option>, } +impl FastYoutubeSearch { + pub fn new(query: QueryType, client: reqwest::Client) -> Result { + let req_opts = RequestOptionsBuilder::new() + .set_client(client.clone()) + .build(); + let ytdl_client = YouTube::new_with_options(&req_opts)?; + Ok(Self { + query, + reqwest_client: client, + ytdl_client: either::Left(ytdl_client), + url: None, + metadata: None, + video: None, + }) + } + + pub fn reset_search(&mut self) { + self.metadata = None; + self.url = None; + self.video = None; + } +} + impl Display for FastYoutubeSearch { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( @@ -519,13 +542,60 @@ impl MediaSource for MediaSourceStream { } } +pub struct NewSearchSource(pub QueryType, pub reqwest::Client); + +impl Into for NewSearchSource { + fn into(self) -> Input { + let search = RustyYoutubeSearch::new(self.0, self.1).unwrap(); + search.into() + } +} + #[cfg(test)] mod test { - use crate::{http_utils, sources::youtube::search_query_to_source_and_metadata_rusty}; + use crate::{ + commands::play_utils::QueryType, + http_utils, + sources::{ + rusty_ytdl::{NewSearchSource, RustyYoutubeSearch}, + youtube::search_query_to_source_and_metadata_rusty, + }, + }; use rusty_ytdl::search::YouTube; - use songbird::input::YoutubeDl; + use songbird::input::{Input, YoutubeDl}; use std::sync::Arc; + #[tokio::test] + async fn test_rusty_youtube_search() { + let search_term = "The Night Chicago Died"; + let query = QueryType::Keywords(search_term.to_string()); + let reqwest_client = http_utils::get_client().clone(); + let rusty_search = RustyYoutubeSearch::new(query, reqwest_client).unwrap(); + // let rusty_search = FastYoutubeSearch { + // reqwest_client, + // ytdl_client: either::Left(rusty_ytdl), + // metadata: None, + // url: None, + // video: None, + // }; + + let mut media_source: Input = rusty_search.into(); + let metadata = media_source.aux_metadata().await.unwrap(); + println!("{:?}", metadata); + assert!(metadata.title.is_some()); + } + + #[test] + fn test_new_search_source() { + let search_term = "The Night Chicago Died"; + let query = QueryType::Keywords(search_term.to_string()); + let reqwest_client = http_utils::get_client().clone(); + let new_search = NewSearchSource(query, reqwest_client); + let input: Input = new_search.into(); + println!("{:?}", input.live().is_none()); + assert!(!input.is_playable()); + } + #[tokio::test] async fn test_ytdl() { // let url = "https://www.youtube.com/watch?v=6n3pFFPSlW4".to_string(); diff --git a/cracktunes.toml b/cracktunes.toml index 9f9702b8f..9d5a70f65 100644 --- a/cracktunes.toml +++ b/cracktunes.toml @@ -5,5 +5,6 @@ # volume = 0.1 # prefix = "r!" # owners = [ ] -database_url = "postgresql://postgres:mysecretpassword@crack-postgres:5432/postgres" +# database_url = "postgresql://postgres:mysecretpassword@crack-postgres:5432/postgres" +database_url = "postgresql://postgres:mysecretpassword@localhost:5432/postgres" prefix = "t!" diff --git a/docker-compose.yml b/docker-compose.yml index 140c08408..082c09758 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,7 +32,7 @@ services: - "3030:3030" cracktunes: container_name: cracktunes - image: cyclefive/cracktunes:dev + image: cyclefive/cracktunes:dev-debian volumes: - crack_data:/data:rw - ./.env:/app/.env:rw From f40a05199b7e7778ed89d537856ca691a703fc32 Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Mon, 12 Aug 2024 19:28:44 +0000 Subject: [PATCH 39/95] Remove redunded abstractions --- crack-core/src/commands/music/doplay.rs | 10 +- .../src/commands/music/play_utils/query.rs | 60 ++-- crack-core/src/sources/rusty_ytdl.rs | 275 +++++++----------- crack-core/src/sources/youtube.rs | 57 ++-- scripts/run_one_test.sh | 3 +- 5 files changed, 157 insertions(+), 248 deletions(-) diff --git a/crack-core/src/commands/music/doplay.rs b/crack-core/src/commands/music/doplay.rs index 08b25a369..7d9970d14 100644 --- a/crack-core/src/commands/music/doplay.rs +++ b/crack-core/src/commands/music/doplay.rs @@ -2,12 +2,10 @@ use super::play_utils::query::QueryType; use super::play_utils::queue::{get_mode, get_msg, queue_track_back}; use crate::commands::play_utils::query::query_type_from_url; use crate::commands::{cmd_check_music, help}; -use crate::sources::rusty_ytdl::RustyYoutubeClient; +use crate::sources::rusty_ytdl::search_result_to_aux_metadata; +use crate::utils::edit_embed_response2; use crate::CrackedResult; use crate::{commands::get_call_or_join_author, http_utils::SendMessageParams}; -use ::serenity::all::CommandInteraction; -//FIXME -use crate::utils::edit_embed_response2; use crate::{ errors::{verify, CrackedError}, guild::settings::GuildSettings, @@ -24,6 +22,7 @@ use crate::{ utils::{get_human_readable_timestamp, get_track_handle_metadata}, Context, Error, }; +use ::serenity::all::CommandInteraction; use ::serenity::{ all::{Message, UserId}, builder::{CreateEmbed, CreateEmbedAuthor, CreateEmbedFooter, EditMessage}, @@ -674,10 +673,9 @@ pub async fn queue_aux_metadata( ) .await; - //let ytdl = RustyYoutubeClient::new_with_client(client.clone())?; let res = rusty_ytdl.search_one(search_query, None).await?; let res = res.ok_or(CrackedError::Other("No results found"))?; - let new_aux_metadata = RustyYoutubeClient::search_result_to_aux_metadata(&res); + let new_aux_metadata = search_result_to_aux_metadata(&res); MyAuxMetadata(new_aux_metadata) } else { diff --git a/crack-core/src/commands/music/play_utils/query.rs b/crack-core/src/commands/music/play_utils/query.rs index 35e03d975..b07225431 100644 --- a/crack-core/src/commands/music/play_utils/query.rs +++ b/crack-core/src/commands/music/play_utils/query.rs @@ -1,12 +1,10 @@ use super::queue::{queue_track_back, queue_track_front}; use super::{queue_keyword_list_back, queue_query_list_offset}; -// use crate::commands::kick; use crate::guild::operations::GuildSettingsOperations; use crate::messaging::interface::create_search_response; -use crate::sources::rusty_ytdl::NewSearchSource; -// use crate::sources::rusty_ytdl::RustyYoutubeSearch; -//use crate::sources::youtube::get_rusty_search; -use crate::CrackedResult; +use crate::sources::rusty_ytdl::{ + search_result_to_aux_metadata, video_info_to_aux_metadata, NewSearchSource, +}; use crate::{ commands::{check_banned_domains, MyAuxMetadata}, errors::{verify, CrackedError}, @@ -16,20 +14,16 @@ use crate::{ message::CrackedMessage, messages::SPOTIFY_AUTH_FAILED, }, - sources::{ - rusty_ytdl::RustyYoutubeClient, - spotify::{Spotify, SpotifyTrack, SPOTIFY}, - }, + sources::spotify::{Spotify, SpotifyTrack, SPOTIFY}, utils::{edit_response_poise, yt_search_select}, - Context, Error, + Context, CrackedResult, Error, }; use ::serenity::all::{Attachment, CreateAttachment, CreateMessage}; use colored::Colorize; use futures::future; use itertools::Itertools; use poise::serenity_prelude as serenity; -use rusty_ytdl::search::YouTube; -use rusty_ytdl::search::{Playlist, SearchOptions, SearchType}; +use rusty_ytdl::search::{Playlist, SearchOptions, SearchType, YouTube}; use rusty_ytdl::{RequestOptions, Video, VideoOptions}; use songbird::{ input::{AuxMetadata, Compose as _, HttpRequest, Input as SongbirdInput, YoutubeDl}, @@ -45,6 +39,8 @@ use std::{ use tokio::{process::Command, sync::Mutex}; use url::Url; +pub const PLAYLIST_SEARCH_LIMIT: u64 = 30; + #[derive(Clone, Debug)] /// Enum for type of possible queries we have to handle pub enum QueryType { @@ -348,8 +344,8 @@ impl QueryType { // FIXME QueryType::PlaylistLink(url) => { let _guild_id = ctx.guild_id().ok_or(CrackedError::NoGuildId)?; - let rusty_ytdl = RustyYoutubeClient::new()?; - let playlist: Playlist = rusty_ytdl.get_playlist(url.clone()).await?; + let playlist: Playlist = + rusty_ytdl::search::Playlist::get(url.clone(), None).await?; queue_query_list_offset(ctx, call, Queries::from(playlist).to_vec(), 1, search_msg) .await?; }, @@ -421,8 +417,8 @@ impl QueryType { QueryType::PlaylistLink(url) => { tracing::trace!("Mode::End, QueryType::PlaylistLink"); // Let's use the new YouTube rust library for this - let rusty_ytdl = RustyYoutubeClient::new()?; - let playlist: Playlist = rusty_ytdl.get_playlist(url.clone()).await?; + let playlist: Playlist = + rusty_ytdl::search::Playlist::get(url.clone(), None).await?; queue_keyword_list_back(ctx, call, Queries::from(playlist).to_vec(), search_msg) .await?; // queue_yt_playlist(ctx, call, guild_id, playlist, search_msg).await?; @@ -535,7 +531,7 @@ impl QueryType { }; let video = Video::new_with_options(query.clone(), video_options)?; let video_info = video.get_info().await?; - let metadata = RustyYoutubeClient::video_info_to_aux_metadata(&video_info); + let metadata = video_info_to_aux_metadata(&video_info); Ok(vec![MyAuxMetadata(metadata)]) }, @@ -578,20 +574,12 @@ impl QueryType { .flatten() .collect_vec(); Ok(metadatas) - - // let mut metadatas = Vec::with_capacity(keywords_list.len()); - // for keyword in keywords_list { - // let res = ytclient.search_one(keyword, None).await?.unwrap(); - // let my_metadata = RustyYoutubeClient::search_result_to_aux_metadata(&res); - // let my_metadata = MyAuxMetadata(my_metadata); - // metadatas.push(my_metadata); - // } }, QueryType::KeywordList(keywords_list) => { let mut metadatas = Vec::with_capacity(keywords_list.len()); for keyword in keywords_list { let res = ytclient.search_one(keyword, None).await?.unwrap(); - let my_metadata = RustyYoutubeClient::search_result_to_aux_metadata(&res); + let my_metadata = search_result_to_aux_metadata(&res); let my_metadata = MyAuxMetadata(my_metadata); metadatas.push(my_metadata); } @@ -660,19 +648,21 @@ impl QueryType { }, QueryType::PlaylistLink(url) => { tracing::warn!("In PlaylistLink"); - let rytdl = RustyYoutubeClient::new_with_client(client.clone()).unwrap(); + let req_options = RequestOptions { + client: Some(client.clone()), + ..Default::default() + }; + let rusty_ytdl = YouTube::new_with_options(&req_options)?; let search_options = SearchOptions { - limit: 100, + limit: PLAYLIST_SEARCH_LIMIT, search_type: SearchType::Playlist, ..Default::default() }; - let res = rytdl.rusty_ytdl.search(url, Some(&search_options)).await?; + let res = rusty_ytdl.search(url, Some(&search_options)).await?; let mut metadata = Vec::with_capacity(res.len()); for r in res { - metadata.push(MyAuxMetadata( - RustyYoutubeClient::search_result_to_aux_metadata(&r), - )); + metadata.push(MyAuxMetadata(search_result_to_aux_metadata(&r))); } let ytdl = YoutubeDl::new(client_old.clone(), url.clone()); tracing::warn!("ytdl: {:?}", ytdl); @@ -818,12 +808,6 @@ pub async fn query_type_from_url( Some(QueryType::VideoLink(url.to_string())) }, } - // if url.contains("playlist") || url.contains("list") { - // tracing::warn!("{}: {}", "youtube playlist".blue(), url.underline().blue()); - // Some(QueryType::PlaylistLink(url.to_string())) - // } else { - // Some(QueryType::VideoLink(url.to_string())) - // } }, // For all other domains fall back to yt-dlp. Some(other) => { diff --git a/crack-core/src/sources/rusty_ytdl.rs b/crack-core/src/sources/rusty_ytdl.rs index 3d7560fc7..60a52ee22 100644 --- a/crack-core/src/sources/rusty_ytdl.rs +++ b/crack-core/src/sources/rusty_ytdl.rs @@ -1,10 +1,10 @@ -use crate::{commands::play_utils::QueryType, errors::CrackedError, http_utils}; +use crate::{commands::play_utils::QueryType, errors::CrackedError}; use bytes::Buf; use bytes::BytesMut; use rusty_ytdl::stream::Stream; use rusty_ytdl::RequestOptions; use rusty_ytdl::{ - search::{Playlist, SearchOptions, SearchResult, YouTube}, + search::{Playlist, SearchResult, YouTube}, Video, VideoInfo, }; use serenity::async_trait; @@ -61,34 +61,9 @@ impl AsString for YoutubeDl { } } -/// Implement the `AsString` trait for the `RustyYoutubeClient` struct. -impl AsString for RustyYoutubeClient { - fn as_string(&self) -> String { - self.to_string() - } -} - -#[derive(Clone, Debug)] -/// Our strucut to wrap the rusty-ytdl search instance -//TODO expand to go beyond search -pub struct RustyYoutubeClient { - pub rusty_ytdl: YouTube, - pub client: reqwest::Client, -} - -impl Display for RustyYoutubeClient { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "RustyYoutubeClient({:?}, {:?})", - self.rusty_ytdl, self.client - ) - } -} - #[derive(Clone, Debug)] pub struct RustyYoutubeSearch { - pub rusty_ytdl: RustyYoutubeClient, + pub rusty_ytdl: YouTube, pub metadata: Option, pub url: Option, pub video: Option>, @@ -205,128 +180,80 @@ impl RequestOptionsBuilder { } } -/// Implementation of the [`RustyYoutubeClient`] struct. -impl RustyYoutubeClient { - // Create a new `RustyYoutubeClient`. - pub fn new() -> Result { - let client = http_utils::get_client(); - RustyYoutubeClient::new_with_client(client.clone()) - } - - /// Creates a new instance of `RustyYoutubeClient`. Requires a `reqwest::Client` instance, preferably reused. - pub fn new_with_client(client: reqwest::Client) -> Result { - // TODO: Is this the best, or even correct block to use? - - let req = RequestOptionsBuilder::new() - .set_client(client.clone()) - .build(); - - let rusty_ytdl = YouTube::new_with_options(&req)?; - - Ok(Self { rusty_ytdl, client }) - } - - /// Get a Playlist from a URL. - pub async fn get_playlist(&self, url: String) -> Result { - let playlist = Playlist::get(&url, None).await?; - Ok(playlist) - } - - /// Convert a `SearchResult` to `AuxMetadata`. - pub fn search_result_to_aux_metadata(res: &SearchResult) -> AuxMetadata { - let mut metadata = AuxMetadata::default(); - match res.clone() { - SearchResult::Video(video) => { - metadata.track = Some(video.title.clone()); - metadata.artist = None; - metadata.album = None; - metadata.date = video.uploaded_at.clone(); - - metadata.channels = Some(2); - metadata.channel = Some(video.channel.name); - metadata.duration = Some(Duration::from_millis(video.duration)); - metadata.sample_rate = Some(48000); - metadata.source_url = Some(video.url); - metadata.title = Some(video.title); - metadata.thumbnail = Some(video.thumbnails.first().unwrap().url.clone()); - }, - SearchResult::Playlist(playlist) => { - metadata.title = Some(playlist.name); - metadata.source_url = Some(playlist.url); - metadata.duration = None; - metadata.thumbnail = Some(playlist.thumbnails.first().unwrap().url.clone()); - }, - _ => {}, - }; - metadata - } +/// Convert a `SearchResult` to `AuxMetadata`. +pub fn search_result_to_aux_metadata(res: &SearchResult) -> AuxMetadata { + let mut metadata = AuxMetadata::default(); + match res.clone() { + SearchResult::Video(video) => { + metadata.track = Some(video.title.clone()); + metadata.artist = None; + metadata.album = None; + metadata.date = video.uploaded_at.clone(); + + metadata.channels = Some(2); + metadata.channel = Some(video.channel.name); + metadata.duration = Some(Duration::from_millis(video.duration)); + metadata.sample_rate = Some(48000); + metadata.source_url = Some(video.url); + metadata.title = Some(video.title); + metadata.thumbnail = Some(video.thumbnails.first().unwrap().url.clone()); + }, + SearchResult::Playlist(playlist) => { + metadata.title = Some(playlist.name); + metadata.source_url = Some(playlist.url); + metadata.duration = None; + metadata.thumbnail = Some(playlist.thumbnails.first().unwrap().url.clone()); + }, + _ => {}, + }; + metadata +} - pub fn video_info_to_aux_metadata(video: &VideoInfo) -> AuxMetadata { - let mut metadata = AuxMetadata::default(); - tracing::info!( - "video_info_to_aux_metadata: {:?}", - video.video_details.title - ); - let details = &video.video_details; - metadata.artist = None; - metadata.album = None; - metadata.date = Some(details.publish_date.clone()); - - metadata.channels = Some(2); - metadata.channel = Some(details.owner_channel_name.clone()); - metadata.duration = Some(Duration::from_secs( - details.length_seconds.parse::().unwrap_or_default(), - )); - metadata.sample_rate = Some(48000); - metadata.source_url = Some(details.video_url.clone()); - metadata.title = Some(details.title.clone()); - metadata.thumbnail = Some(details.thumbnails.first().unwrap().url.clone()); - - metadata - } - - /// Get a video from a URL. - pub async fn get_video_info(url: String) -> Result { - // let vid_options = VideoOptions { - // request_options: RequestOptions { - // client: Some(self.client.clone()), - // ..Default::default() - // }, - // ..Default::default() - // }; - // let video = Video::new_with_options(&url, vid_options)?; - let video = Video::new(&url)?; - video.get_basic_info().await.map_err(|e| e.into()) - } - - // Search youtube - pub async fn search( - &self, - query: String, - limit: u64, - ) -> Result, CrackedError> { - let opts = SearchOptions { - limit, - ..Default::default() - }; - tracing::warn!("{:?}", query); - let search_results = self.rusty_ytdl.search(&query, Some(&opts)).await?; - println!("{:?}", search_results); - Ok(search_results) - } +pub fn video_info_to_aux_metadata(video: &VideoInfo) -> AuxMetadata { + let mut metadata = AuxMetadata::default(); + tracing::info!( + "video_info_to_aux_metadata: {:?}", + video.video_details.title + ); + let details = &video.video_details; + metadata.artist = None; + metadata.album = None; + metadata.date = Some(details.publish_date.clone()); + + metadata.channels = Some(2); + metadata.channel = Some(details.owner_channel_name.clone()); + metadata.duration = Some(Duration::from_secs( + details.length_seconds.parse::().unwrap_or_default(), + )); + metadata.sample_rate = Some(48000); + metadata.source_url = Some(details.video_url.clone()); + metadata.title = Some(details.title.clone()); + metadata.thumbnail = Some(details.thumbnails.first().unwrap().url.clone()); + + metadata +} - // Wraps rusty_ytdl search_one - pub async fn search_one(&self, query: String) -> Result, CrackedError> { - self.rusty_ytdl - .search_one(&query, None) - .await - .map_err(|e| e.into()) - } +/// Get a video from a URL. +pub async fn get_video_info(url: String) -> Result { + // let vid_options = VideoOptions { + // request_options: RequestOptions { + // client: Some(self.client.clone()), + // ..Default::default() + // }, + // ..Default::default() + // }; + // let video = Video::new_with_options(&url, vid_options)?; + let video = Video::new(&url)?; + video.get_basic_info().await.map_err(|e| e.into()) } impl RustyYoutubeSearch { pub fn new(query: QueryType, client: reqwest::Client) -> Result { - let rusty_ytdl = RustyYoutubeClient::new_with_client(client)?; + let request_options = RequestOptions { + client: Some(client.clone()), + ..Default::default() + }; + let rusty_ytdl = rusty_ytdl::search::YouTube::new_with_options(&request_options)?; Ok(Self { rusty_ytdl, metadata: None, @@ -350,6 +277,8 @@ impl From for Input { } } +use rusty_ytdl::VideoError; + #[async_trait] impl Compose for RustyYoutubeSearch { fn create(&mut self) -> Result>, AudioStreamError> { @@ -365,8 +294,13 @@ impl Compose for RustyYoutubeSearch { .unwrap_or("Rick Astley Never Gonna Give You Up".to_string()); let search_res = self .rusty_ytdl - .search_one(query_str) - .await? + .search_one(query_str, None) + .await + .map_err(|e| { + >::into( + >::into(e), + ) + })? .ok_or_else(|| CrackedError::AudioStreamRustyYtdlMetadata)?; let search_video = match search_res { SearchResult::Video(video) => video, @@ -406,10 +340,15 @@ impl Compose for RustyYoutubeSearch { let res: SearchResult = self .rusty_ytdl - .search_one(self.query.build_query().unwrap()) - .await? + .search_one(self.query.build_query().unwrap(), None) + .await + .map_err(|e| { + >::into( + >::into(e), + ) + })? .ok_or_else(|| AudioStreamError::from(CrackedError::AudioStreamRustyYtdlMetadata))?; - let metadata = RustyYoutubeClient::search_result_to_aux_metadata(&res); + let metadata = search_result_to_aux_metadata(&res); self.metadata = Some(metadata.clone()); @@ -544,9 +483,9 @@ impl MediaSource for MediaSourceStream { pub struct NewSearchSource(pub QueryType, pub reqwest::Client); -impl Into for NewSearchSource { - fn into(self) -> Input { - let search = RustyYoutubeSearch::new(self.0, self.1).unwrap(); +impl From for Input { + fn from(val: NewSearchSource) -> Self { + let search = RustyYoutubeSearch::new(val.0, val.1).unwrap(); search.into() } } @@ -562,8 +501,8 @@ mod test { }, }; use rusty_ytdl::search::YouTube; + use rusty_ytdl::RequestOptions; use songbird::input::{Input, YoutubeDl}; - use std::sync::Arc; #[tokio::test] async fn test_rusty_youtube_search() { @@ -598,20 +537,12 @@ mod test { #[tokio::test] async fn test_ytdl() { - // let url = "https://www.youtube.com/watch?v=6n3pFFPSlW4".to_string(); - // let client = http_utils::get_client().clone(); - // let ytdl = crate::sources::rusty_ytdl::RustyYoutubeClient::new_with_client(client).unwrap(); - // let ytdl = Arc::new(ytdl); - // let playlist = ytdl.one_shot("The Night Chicago Died".to_string()).await; let search = "The Night Chicago Died"; let rusty_ytdl = YouTube::new().unwrap(); let playlist = rusty_ytdl.search_one(search.to_string(), None).await; match playlist { Ok(Some(playlist)) => { - let metadata = - crate::sources::rusty_ytdl::RustyYoutubeClient::search_result_to_aux_metadata( - &playlist, - ); + let metadata = crate::sources::rusty_ytdl::search_result_to_aux_metadata(&playlist); println!("{:?}", metadata); }, Ok(None) => { @@ -655,12 +586,16 @@ mod test { let client = reqwest::ClientBuilder::new() .use_rustls_tls() + .cookie_store(true) .build() .unwrap(); - let ytdl = crate::sources::rusty_ytdl::RustyYoutubeClient::new_with_client(client).unwrap(); - let ytdl = Arc::new(ytdl); + let req_opts = RequestOptions { + client: Some(client), + ..Default::default() + }; + let rusty_yt = rusty_ytdl::search::YouTube::new_with_options(&req_opts).unwrap(); for search in searches { - let res = ytdl.search_one(search.to_string()).await; + let res = rusty_yt.search_one(search.to_string(), None).await; assert!( res.is_ok() || { println!("{}", res.unwrap_err().to_string()); @@ -713,16 +648,6 @@ mod test { println!("{:?}", metadata); println!("{:?}", input.is_playable()); - // let rusty_search = crate::sources::rusty_ytdl::RustyYoutubeSearch { - // rusty_ytdl: crate::sources::rusty_ytdl::RustyYoutubeClient::new_with_client(client) - // .unwrap(), - // metadata: None, - // query: QueryType::Keywords("The Night Chicago Died".to_string()), - // }; - - // let live_input = LiveInput::Wrapped(rusty_search.into_media_source()); - // assert!(live_input.is_playable()); - let mut driver = songbird::driver::Driver::default(); let handle = driver.play_input(input); diff --git a/crack-core/src/sources/youtube.rs b/crack-core/src/sources/youtube.rs index da4cc2f39..a6e990592 100644 --- a/crack-core/src/sources/youtube.rs +++ b/crack-core/src/sources/youtube.rs @@ -2,11 +2,11 @@ use std::sync::Arc; use crate::commands::play_utils::QueryType; use crate::http_utils; -use crate::sources::rusty_ytdl::RustyYoutubeSearch; -use crate::CrackedResult; -use crate::{ - commands::MyAuxMetadata, errors::CrackedError, sources::rusty_ytdl::RustyYoutubeClient, +use crate::sources::rusty_ytdl::{ + search_result_to_aux_metadata, video_info_to_aux_metadata, RustyYoutubeSearch, }; +use crate::CrackedResult; +use crate::{commands::MyAuxMetadata, errors::CrackedError}; use rusty_ytdl::{RequestOptions, Video, VideoOptions}; use songbird::input::{AuxMetadata, Compose, Input as SongbirdInput, YoutubeDl}; @@ -17,17 +17,18 @@ pub async fn get_rusty_search( client: reqwest::Client, url: String, ) -> CrackedResult { + let request_options = RequestOptions { + client: Some(client.clone()), + ..Default::default() + }; let video_options = VideoOptions { - request_options: RequestOptions { - client: Some(client.clone()), - ..Default::default() - }, + request_options: request_options.clone(), ..Default::default() }; let video = Video::new_with_options(url.clone(), video_options)?; let video_info = video.get_info().await?; - let rytdl = RustyYoutubeClient::new_with_client(client.clone())?; - let metadata = RustyYoutubeClient::video_info_to_aux_metadata(&video_info); + let rytdl = rusty_ytdl::search::YouTube::new_with_options(&request_options)?; + let metadata = video_info_to_aux_metadata(&video_info); let rusty_search = RustyYoutubeSearch { rusty_ytdl: rytdl, @@ -48,11 +49,15 @@ pub async fn search_query_to_source_and_metadata( tracing::warn!("search_query_to_source_and_metadata: {:?}", query); let metadata = { - let rytdl = RustyYoutubeClient::new_with_client(client.clone())?; + let req_options = RequestOptions { + client: Some(client.clone()), + ..Default::default() + }; + let rytdl = rusty_ytdl::search::YouTube::new_with_options(&req_options)?; tracing::warn!("search_query_to_source_and_metadata: {:?}", rytdl); - let results = rytdl.search_one(query.clone()).await?; + let results = rytdl.search_one(query.clone(), None).await?; tracing::warn!("search_query_to_source_and_metadata: {:?}", results); // FIXME: Fallback to yt-dlp @@ -60,7 +65,7 @@ pub async fn search_query_to_source_and_metadata( Some(r) => r, None => return search_query_to_source_and_metadata_ytdl(client, query).await, //Err(CrackedError::EmptySearchResult), }; - let metadata = &RustyYoutubeClient::search_result_to_aux_metadata(&result); + let metadata = &search_result_to_aux_metadata(&result); metadata.clone() }; @@ -81,16 +86,20 @@ pub async fn search_query_to_source_and_metadata_rusty( query: QueryType, ) -> Result<(SongbirdInput, Vec), CrackedError> { tracing::warn!("search_query_to_source_and_metadata_rusty: {:?}", query); - let rytdl = RustyYoutubeClient::new_with_client(client.clone())?; + let request_options = RequestOptions { + client: Some(client.clone()), + ..Default::default() + }; + let rusty_yt = rusty_ytdl::search::YouTube::new_with_options(&request_options)?; let metadata = { - // let rytdl = RustyYoutubeClient::new()?; - tracing::warn!("search_query_to_source_and_metadata_rusty: {:?}", rytdl); - let results = rytdl + tracing::warn!("search_query_to_source_and_metadata_rusty: {:?}", rusty_yt); + let results = rusty_yt .search_one( query .build_query() .ok_or(CrackedError::Other("No query given"))?, + None, ) .await?; tracing::warn!("search_query_to_source_and_metadata_rusty: {:?}", results); @@ -99,12 +108,12 @@ pub async fn search_query_to_source_and_metadata_rusty( Some(r) => r, None => return Err(CrackedError::EmptySearchResult), }; - let metadata = &RustyYoutubeClient::search_result_to_aux_metadata(&result); + let metadata = &search_result_to_aux_metadata(&result); metadata.clone() }; let rusty_search = RustyYoutubeSearch { - rusty_ytdl: rytdl, + rusty_ytdl: rusty_yt, metadata: Some(metadata.clone()), query, url: metadata.source_url.clone(), @@ -177,18 +186,11 @@ mod test { .await; if let Err(ref e) = res { let phrase = "Sign in to confirm you’re not a bot"; + println!("{}", e.to_string()); assert!(e.to_string().contains(phrase)); } - // assert!(res.is_err()); } - // #[tokio::test] - // async fn test_get_track_source_and_metadata_ytdl() { - // let query_type = QueryType::Keywords("hello".to_string()); - // let res = query_type.get_track_source_and_metadata().await; - // assert!(res.is_ok()); - // } - #[tokio::test] async fn test_get_track_source_and_metadata_video_link() { let query_type = @@ -213,7 +215,6 @@ mod test { let phrase = "Sign in to confirm you’re not a bot"; assert!(e.to_string().contains(phrase)); } - //assert!(res.is_ok()); } #[tokio::test] diff --git a/scripts/run_one_test.sh b/scripts/run_one_test.sh index 2eb1d6c68..ff5782277 100644 --- a/scripts/run_one_test.sh +++ b/scripts/run_one_test.sh @@ -13,10 +13,11 @@ cargo test \ --exact \ --show-output +# -- sources::youtube::test::test_get_track_source_and_metadata \ cargo test \ --package crack-core \ --lib \ --features crack-gpt --features crack-osint --features crack-bf \ - -- sources::youtube::test::test_get_track_source_and_metadata \ + -- sources::rusty_ytdl::test::test_rusty_youtube_search \ --exact \ --show-output From 5eeb7a75656e0cd5225d7ef1e5e64707e930002d Mon Sep 17 00:00:00 2001 From: Cycle Five Date: Tue, 13 Aug 2024 06:48:35 +0000 Subject: [PATCH 40/95] update rusty_ytdl and cargo update --- Cargo.lock | 508 +++++++++++++-------------- crack-core/Cargo.toml | 12 +- crack-core/src/sources/rusty_ytdl.rs | 66 ++-- crack-core/src/sources/youtube.rs | 4 +- 4 files changed, 290 insertions(+), 300 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 47a41f1af..0ff32c726 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -174,7 +174,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -185,7 +185,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -341,7 +341,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.72", + "syn 2.0.74", "which", ] @@ -392,47 +392,52 @@ dependencies = [ [[package]] name = "boa_ast" -version = "0.17.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73498e9b2f0aa7db74977afa4d594657611e90587abf0dd564c0b55b4a130163" +checksum = "b49637e7ecb7c541c46c3e885d4c49326ad8076dbfb88bef2cf3165d8ea7df2b" dependencies = [ "bitflags 2.6.0", "boa_interner", "boa_macros", "indexmap", "num-bigint", - "rustc-hash 1.1.0", + "rustc-hash 2.0.0", ] [[package]] name = "boa_engine" -version = "0.17.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16377479d5d6d33896e7acdd1cc698d04a8f72004025bbbddf47558cd29146a6" +checksum = "411558b4cbc7d0303012e26721815e612fed78179313888fd5dd8d6c50d70099" dependencies = [ + "arrayvec", "bitflags 2.6.0", "boa_ast", "boa_gc", - "boa_icu_provider", "boa_interner", "boa_macros", "boa_parser", "boa_profiler", - "chrono", + "boa_string", + "bytemuck", + "cfg-if", "dashmap 5.5.3", "fast-float", + "hashbrown 0.14.5", "icu_normalizer", "indexmap", - "itertools 0.11.0", + "intrusive-collections", + "itertools 0.13.0", "num-bigint", "num-integer", "num-traits", "num_enum", "once_cell", "pollster", + "portable-atomic", "rand", "regress", - "rustc-hash 1.1.0", + "rustc-hash 2.0.0", "ryu-js", "serde", "serde_json", @@ -441,39 +446,27 @@ dependencies = [ "tap", "thin-vec", "thiserror", + "time", ] [[package]] name = "boa_gc" -version = "0.17.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c97b44beaef9d4452342d117d94607fdfa8d474280f1ba0fd97853834e3a49b2" +checksum = "8eff345a85a39cf9b8ed863198947d61e6df2b1d774002b57341158b0ce2c525" dependencies = [ "boa_macros", "boa_profiler", + "boa_string", + "hashbrown 0.14.5", "thin-vec", ] -[[package]] -name = "boa_icu_provider" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30e52e34e451dd0bfc2c654a9a43ed34b0073dbd4ae3394b40313edda8627aa" -dependencies = [ - "icu_collections", - "icu_normalizer", - "icu_properties", - "icu_provider", - "icu_provider_adapters", - "icu_provider_blob", - "once_cell", -] - [[package]] name = "boa_interner" -version = "0.17.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e5afa991908cfbe79bd3109b824e473a1dc5f74f31fab91bb44c9e245daa77" +checksum = "72b779280420804c70da9043d152c84eb96e2f7c9e7d1ec3262decf59f9349df" dependencies = [ "boa_gc", "boa_macros", @@ -481,52 +474,59 @@ dependencies = [ "indexmap", "once_cell", "phf 0.11.2", - "rustc-hash 1.1.0", + "rustc-hash 2.0.0", "static_assertions", ] [[package]] name = "boa_macros" -version = "0.17.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005fa0c5bd20805466dda55eb34cd709bb31a2592bb26927b47714eeed6914d8" +checksum = "25e0097fa69cde4c95f9869654004340fbbe2bcf3ce9189ba2a31a65ac40e0a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", "synstructure", ] [[package]] name = "boa_parser" -version = "0.17.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e09afb035377a9044443b598187a7d34cd13164617182a4d7c348522ee3f052" +checksum = "dd63fe8faf62561fc8c50f9402687e8cfde720b57d292fb3b4ac17c821878ac1" dependencies = [ "bitflags 2.6.0", "boa_ast", - "boa_icu_provider", "boa_interner", "boa_macros", "boa_profiler", "fast-float", - "icu_locid", "icu_properties", - "icu_provider", - "icu_provider_macros", "num-bigint", "num-traits", - "once_cell", "regress", - "rustc-hash 1.1.0", - "tinystr", + "rustc-hash 2.0.0", ] [[package]] name = "boa_profiler" -version = "0.17.3" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd9da895f0df9e2a97b36c1f98e0c5d2ab963abc8679d80f2a66f7bcb211ce90" + +[[package]] +name = "boa_string" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190f92dfe48224adc92881c620f08ccf37ff62b91a094bb357fe53bd5e84647" +checksum = "c9ca6668df83fcd3c2903f6f296b7180421908c5b478ebe0d1c468be9fd60e1c" +dependencies = [ + "fast-float", + "paste", + "rustc-hash 2.0.0", + "sptr", + "static_assertions", +] [[package]] name = "borsh" @@ -545,10 +545,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" dependencies = [ "once_cell", - "proc-macro-crate 3.1.0", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", "syn_derive", ] @@ -602,6 +602,20 @@ name = "bytemuck" version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] [[package]] name = "byteorder" @@ -671,9 +685,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87b298677bb2f19f542743f145dd7f1de0fc7798bc41ee54684e4e16778c8a7" +checksum = "e9e8aabfac534be767c909e0690571677d49f41bd8465ae876fe043d52ba5292" dependencies = [ "jobserver", "libc", @@ -746,12 +760,6 @@ dependencies = [ "cc", ] -[[package]] -name = "cobs" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15" - [[package]] name = "colored" version = "2.1.0" @@ -900,9 +908,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" dependencies = [ "libc", ] @@ -1047,12 +1055,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "critical-section" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" - [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -1129,7 +1131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1139,7 +1141,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1187,7 +1189,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1209,7 +1211,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1332,7 +1334,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1342,7 +1344,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "206868b8242f27cecce124c19fd88157fbd0dd334df2587f36417bafbc85097b" dependencies = [ "derive_builder_core 0.20.0", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1355,7 +1357,28 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.72", + "syn 2.0.74", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", + "unicode-xid", ] [[package]] @@ -1388,7 +1411,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1427,7 +1450,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1445,12 +1468,6 @@ dependencies = [ "serde", ] -[[package]] -name = "embedded-io" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" - [[package]] name = "encoding_rs" version = "0.8.34" @@ -1475,7 +1492,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1495,7 +1512,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1507,7 +1524,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1725,7 +1742,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -1898,15 +1915,6 @@ dependencies = [ "ahash 0.7.8", ] -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.11", -] - [[package]] name = "hashbrown" version = "0.14.5" @@ -2013,7 +2021,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e2bd2de7f92b5301546ce1ac53a4ae5cf2f6b10751b100ab1efb73c19788fba" dependencies = [ "derive_builder 0.9.0", - "derive_more", + "derive_more 0.99.18", "hex", "shorthand", "stable-vec", @@ -2050,7 +2058,7 @@ dependencies = [ "markup5ever", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -2243,12 +2251,11 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8302d8dfd6044d3ddb3f807a5ef3d7bbca9a574959c6d6e4dc39aa7012d0d5" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", - "serde", "yoke", "zerofrom", "zerovec", @@ -2256,29 +2263,48 @@ dependencies = [ [[package]] name = "icu_locid" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3003f85dccfc0e238ff567693248c59153a46f4e6125ba4020b973cef4d1d335" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", "litemap", - "serde", "tinystr", "writeable", "zerovec", ] +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + [[package]] name = "icu_normalizer" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "652869735c9fb9f5a64ba180ee16f2c848390469c116deef517ecc53f4343598" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", "icu_collections", + "icu_normalizer_data", "icu_properties", "icu_provider", - "serde", "smallvec", "utf16_iter", "utf8_iter", @@ -2286,75 +2312,59 @@ dependencies = [ "zerovec", ] +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + [[package]] name = "icu_properties" -version = "1.2.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce0e1aa26851f16c9e04412a5911c86b7f8768dac8f8d4c5f1c568a7e5d7a434" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", "icu_collections", + "icu_locid_transform", + "icu_properties_data", "icu_provider", - "serde", "tinystr", "zerovec", ] +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + [[package]] name = "icu_provider" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc312a7b6148f7dfe098047ae2494d12d4034f48ade58d4f353000db376e305" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ "displaydoc", "icu_locid", "icu_provider_macros", - "postcard", - "serde", "stable_deref_trait", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_adapters" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ae1e2bd0c41728b77e7c46e9afdec5e2127d1eedacc684724667d50c126bd3" -dependencies = [ - "icu_locid", - "icu_provider", - "serde", "tinystr", - "yoke", - "zerovec", -] - -[[package]] -name = "icu_provider_blob" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd364c9a01f791a4bc04a74cf2a1d01d9f6926a40fd5ae1c28004e1e70d8338b" -dependencies = [ - "icu_provider", - "postcard", - "serde", "writeable", "yoke", + "zerofrom", "zerovec", ] [[package]] name = "icu_provider_macros" -version = "1.2.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b728b9421e93eff1d9f8681101b78fa745e0748c95c655c83f337044a7e10" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.74", ] [[package]] @@ -2425,6 +2435,15 @@ dependencies = [ "web-sys", ] +[[package]] +name = "intrusive-collections" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" +dependencies = [ + "memoffset", +] + [[package]] name = "ipinfo" version = "3.0.1" @@ -2454,15 +2473,6 @@ dependencies = [ "serde", ] -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.12.1" @@ -2498,9 +2508,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -2747,7 +2757,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -2766,6 +2776,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -2814,9 +2833,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi", "libc", @@ -3004,23 +3023,23 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.6.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.6.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3046,10 +3065,6 @@ name = "once_cell" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -dependencies = [ - "critical-section", - "portable-atomic", -] [[package]] name = "opaque-debug" @@ -3258,7 +3273,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3296,7 +3311,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3356,7 +3371,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3394,7 +3409,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3420,17 +3435,6 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" -[[package]] -name = "postcard" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55c51ee6c0db07e68448e336cf8ea4131a620edefebf9893e759b2d793420f8" -dependencies = [ - "cobs", - "embedded-io", - "serde", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -3459,7 +3463,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3471,23 +3475,13 @@ dependencies = [ "num-integer", ] -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - [[package]] name = "proc-macro-crate" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.21.1", + "toml_edit", ] [[package]] @@ -3771,7 +3765,7 @@ checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -3820,11 +3814,11 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "regress" -version = "0.6.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a9ecfa0cb04d0b04dddb99b8ccf4f66bc8dfd23df694b398570bd8ae3a50fb" +checksum = "16fe0a24af5daaae947294213d2fd2646fbf5e1fbacc1d4ba3e84b2393854842" dependencies = [ - "hashbrown 0.13.2", + "hashbrown 0.14.5", "memchr", ] @@ -4374,8 +4368,9 @@ dependencies = [ [[package]] name = "rusty_ytdl" -version = "0.7.3" -source = "git+https://github.com/cycle-five/rusty_ytdl?branch=main#dd8beae0b7b059c592b6849d03d57008e390de5e" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e7b627f7d821e0d2e44453b57d92b7a5108459f863386198f568225b0ab5d7" dependencies = [ "aes", "async-trait", @@ -4383,7 +4378,7 @@ dependencies = [ "bytes", "cbc", "derivative", - "derive_more", + "derive_more 1.0.0", "hex", "m3u8-rs", "mime", @@ -4411,9 +4406,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "ryu-js" -version = "0.2.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6518fc26bced4d53678a22d6e423e9d8716377def84545fe328236e3af070e7f" +checksum = "ad97d4ce1560a5e27cec89519dc8300d1aa6035b099821261c651486a19e44d5" [[package]] name = "salsa20" @@ -4456,9 +4451,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scraper" -version = "0.19.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761fb705fdf625482d2ed91d3f0559dcfeab2798fe2771c69560a774865d0802" +checksum = "b90460b31bfe1fc07be8262e42c665ad97118d4585869de9345a84d501a9eaf0" dependencies = [ "ahash 0.8.11", "cssparser", @@ -4527,7 +4522,7 @@ checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" dependencies = [ "bitflags 2.6.0", "cssparser", - "derive_more", + "derive_more 0.99.18", "fxhash", "log", "new_debug_unreachable", @@ -4549,9 +4544,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.205" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" +checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2" dependencies = [ "serde_derive", ] @@ -4588,20 +4583,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.205" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" +checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] name = "serde_json" -version = "1.0.122" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" +checksum = "66ad62847a56b3dba58cc891acd13884b9c61138d330c0d7b6181713d4fce38d" dependencies = [ "itoa", "memchr", @@ -4628,7 +4623,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -5270,7 +5265,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -5488,9 +5483,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.72" +version = "2.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" dependencies = [ "proc-macro2", "quote", @@ -5506,7 +5501,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -5529,7 +5524,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -5636,7 +5631,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -5657,6 +5652,7 @@ checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "js-sys", "libc", "num-conv", "num_threads", @@ -5693,12 +5689,11 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.2" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8faa444297615a4e020acb64146b0603c9c395c03a97c17fd9028816d3b4d63e" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", - "serde", "zerovec", ] @@ -5742,7 +5737,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -5871,17 +5866,6 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - [[package]] name = "toml_edit" version = "0.21.1" @@ -5940,7 +5924,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -6243,7 +6227,7 @@ checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -6404,7 +6388,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -6516,34 +6500,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -6553,9 +6538,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6563,22 +6548,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-streams" @@ -6610,9 +6595,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -6966,7 +6951,7 @@ checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", "synstructure", ] @@ -6988,7 +6973,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] @@ -7008,7 +6993,7 @@ checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", "synstructure", ] @@ -7029,16 +7014,15 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] [[package]] name = "zerovec" -version = "0.9.7" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "432bfb1b38809863a16add25daeff2cc63c8e6bbc1cb05b178237e35ab457885" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ - "serde", "yoke", "zerofrom", "zerovec-derive", @@ -7046,11 +7030,11 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.9.7" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa94b6a91d81a9d96473412885b87d8fb677accc447cae54571f93313aebf109" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.74", ] diff --git a/crack-core/Cargo.toml b/crack-core/Cargo.toml index 24e674494..46b462f5e 100644 --- a/crack-core/Cargo.toml +++ b/crack-core/Cargo.toml @@ -26,13 +26,6 @@ crack-osint = ["dep:crack-osint"] crack-bf = ["dep:crack-bf"] [dependencies] -rusty_ytdl = { git = "https://github.com/cycle-five/rusty_ytdl", default-features = false, branch = "main", features = [ - "live", - "rustls-tls", - "search", - "blocking", - "ffmpeg", -] } rustls = "0.23" audiopus = "0.3.0-rc.0" async-trait = "0.1" @@ -73,6 +66,11 @@ tokio = { workspace = true } poise = { workspace = true } symphonia = { workspace = true } +[dependencies.rusty_ytdl] +version = "0.7.4" +default-features = false +features = ["live", "rustls-tls", "search", "blocking", "ffmpeg"] + [dependencies.lyric_finder] git = "https://github.com/cycle-five/spotify-player" branch = "master" diff --git a/crack-core/src/sources/rusty_ytdl.rs b/crack-core/src/sources/rusty_ytdl.rs index 60a52ee22..2bc51878d 100644 --- a/crack-core/src/sources/rusty_ytdl.rs +++ b/crack-core/src/sources/rusty_ytdl.rs @@ -1,8 +1,10 @@ +use crate::http_utils; use crate::{commands::play_utils::QueryType, errors::CrackedError}; use bytes::Buf; use bytes::BytesMut; use rusty_ytdl::stream::Stream; use rusty_ytdl::RequestOptions; +use rusty_ytdl::VideoOptions; use rusty_ytdl::{ search::{Playlist, SearchResult, YouTube}, Video, VideoInfo, @@ -66,7 +68,7 @@ pub struct RustyYoutubeSearch { pub rusty_ytdl: YouTube, pub metadata: Option, pub url: Option, - pub video: Option>, + pub video: Option